anchor.diff:    TypeTuple unwrapReferenceType() {
       if ((typeIdentifier.typeArg?.type?.isInterface ?? false) ||
           typeIdentifier.typeArg?.baseType == BaseType.classTypeModifier) {
  -      return const TypeTuple('Pointer<COMObject>', 'Pointer<COMObject>');
  +      return TypeTuple('Pointer<COMObject>', 'Pointer<COMObject>',
  +          methodParamType: lastComponent(typeIdentifier.typeArg!.name));
       }
   
       if (typeIdentifier.typeArg?.baseType == BaseType.simpleArrayType) {
  
positive.code:     // IReference<T> parameters accept COMObject instead of Pointer<COMObject>
      if (isGenericType &&
          (typeIdentifier.type?.name.endsWith('IReference`1') ?? false)) {
        return const TypeTuple('COMObject', 'COMObject');
      }
  
      if (isInterface ||
          typeIdentifier.baseType == BaseType.classTypeModifier ||
          typeIdentifier.baseType == BaseType.objectType) {
        return const TypeTuple('Pointer<COMObject>', 'Pointer<COMObject>');
      }
  
      // default: return the name as returned by metadata
  
negative.code:     return _projection!;
    }
  
    TypeProjection(TypeIdentifier ti)
        : typeIdentifier = ti.baseType == BaseType.genericTypeModifier
              ? ti.copyWith(name: parseGenericTypeIdentifierName(ti))
              : ti;
  
    String get attribute => projection.attribute ?? '';
    String get nativeType => projection.nativeType;
  