anchor.diff:          && MirrorSystem.getName(t.owner.qualifiedName) != "dart._internal";
       })
       // - don't erase in typeToMap...
  -    // - contravariant (i.e. dynamic=Nothing) type arguments for satisfied
  -    //   types! The assumption is that most type parameters are covariant,
  -    //   i.e. producers, and we use Nothing for return types.
  +    // - contravariant type arguments for satisfied types. The assumption is that most
  +    //   type parameters are covariant, and satisfied types are like return types, for
  +    //   which contravariant is used.
       .map((m) => typeToMap(m, from, false, false, false)).toList();
   
     // print("satisfies (i): " + map[keySatisfies].toString());
  
positive.code:       map[keyType] = typeToMap(pt.returnType, from, false, false, true);
        map[keyMetatype] = metatypeParameter;
        map[keyName] = MirrorSystem.getName(pm.simpleName);
        // TODO these param types should be contravariant (i.e. Nothing)...
        List plist = parametersToList(pt.parameters, from);
        if (plist.isNotEmpty) {
          map[keyParams] = [plist];
  
negative.code:   else {
      // it must be dynamic
      map[keyModule] = "\$";
      // Use "Anything" for both returns and parameters. The other idea was to use
      // "Nothing" for returns, which would be indicated by !isCovariant
      map[keyName] = isCovariant ? "Anything" : "Anything";
      map[keyPackage] = "\$";
    }
    return map;
  