@@ -96,7 +96,48 @@ @interface MyClass
9696 var pointee2Type = pointeeType . PointeeType ;
9797 Assert . That ( pointee2Type . Kind , Is . EqualTo ( CXTypeKind . CXType_ObjCInterface ) , "pointee2Type.Kind" ) ;
9898 }
99-
99+
100+ [ Test ]
101+ public void BlockTypes ( )
102+ {
103+ var inputContents = $$ """
104+ @interface MyClass
105+ -(MyClass *(^)(id))instanceMethod1;
106+ -(MyClass *(^)(SEL))instanceMethod2;
107+ -(MyClass *(^)(Class))instanceMethod3;
108+ @end
109+ """ ;
110+ using var translationUnit = CreateTranslationUnit ( inputContents , "objective-c++" ) ;
111+
112+ var classes = translationUnit . TranslationUnitDecl . Decls . OfType < ObjCInterfaceDecl > ( ) . ToList ( ) ;
113+
114+ var myClass = classes . SingleOrDefault ( v => v . Name == "MyClass" ) ! ;
115+ Assert . That ( myClass , Is . Not . Null , "MyClass" ) ;
116+
117+ var info = new [ ] {
118+ ( Name : "instanceMethod1" , Type : CXTypeKind . CXType_ObjCId ) ,
119+ ( Name : "instanceMethod2" , Type : CXTypeKind . CXType_ObjCSel ) ,
120+ ( Name : "instanceMethod3" , Type : CXTypeKind . CXType_ObjCClass ) ,
121+ } ;
122+
123+ foreach ( var i in info )
124+ {
125+ var instanceMethod = myClass . Methods . SingleOrDefault ( v => v . Name == i . Name ) ! ;
126+ Assert . That ( instanceMethod , Is . Not . Null , "instanceMethod" ) ;
127+ var returnType = instanceMethod . ReturnType ;
128+ Assert . That ( returnType . Kind , Is . EqualTo ( CXTypeKind . CXType_BlockPointer ) , "returnType.Kind" ) ;
129+ var pointeeType = returnType . PointeeType ;
130+ Assert . That ( pointeeType . Kind , Is . EqualTo ( CXTypeKind . CXType_FunctionProto ) , "pointeeType.Kind" ) ;
131+ var functionProtoType = ( FunctionProtoType ) pointeeType ;
132+ Assert . That ( functionProtoType . ParamTypes . Count , Is . EqualTo ( 1 ) , "functionProtoType.ParamTypes.Count()" ) ;
133+ var paramType = functionProtoType . ParamTypes [ 0 ] ;
134+ Assert . That ( paramType . Kind , Is . EqualTo ( i . Type ) , "paramType.Kind" ) ;
135+ var elaboratedParamType = ( ElaboratedType ) paramType ;
136+ Assert . That ( elaboratedParamType , Is . Not . Null , "elaboratedParamType" ) ;
137+ Assert . That ( elaboratedParamType . Desugar , Is . Not . Null , "elaboratedParamType.Desugar" ) ;
138+ }
139+ }
140+
100141 private static void AssertNeedNewClangSharp ( )
101142 {
102143 var forceRun = ! string . IsNullOrEmpty ( Environment . GetEnvironmentVariable ( "FORCE_RUN" ) ) ;
0 commit comments