private static void ProcessMemberPointer(AST ast, NativeType type, CXType cxType, TypeVisitContext context) { CXType classType = clang.Type_getClassType(cxType); string className = clang.getTypeSpelling(classType).ToString(); NativeClass nativeClass = ast.GetClass(className); CXType pointeeType = clang.getPointeeType(cxType); if (ClangTraits.IsFunction(pointeeType)) { type.SetPMF(new MemberFunctionPointer { Class = nativeClass, Function = GetFunctionProto(ast, pointeeType, context) }); } else { type.SetPMD(new MemberDataPointer { Class = nativeClass, Data = GetNativeType(ast, pointeeType, context) }); } }
private static FunctionProto GetFunctionProto(AST ast, CXType funcType, TypeVisitContext context) { Debug.Assert(ClangTraits.IsFunction(funcType)); FunctionProto proto = new FunctionProto(); proto.ResultType = GetNativeType(ast, clang.getResultType(funcType), context); uint arity = (uint)clang.getNumArgTypes(funcType); for (uint loop = 0; loop < arity; ++loop) { CXType argType = clang.getArgType(funcType, loop); FunctionParameter param = new FunctionParameter(); param.Type = GetNativeType(ast, argType, context); proto.AddParameter(param); } return(proto); }
private static void ProcessTypeEntity( AST ast, NativeType type, CXType cxType, TypeVisitContext context) { type.IsConst = ClangTraits.IsConst(cxType); if (ClangTraits.IsBuiltInType(cxType)) { type.SetBuiltin(ClangTraits.ToBasicType(cxType)); } else { CXCursor cursor = clang.getTypeDeclaration(cxType); CXType theType = clang.getCursorType(cursor); string removeQualifierName = clang.getTypeSpelling(theType).ToString(); if (ClangTraits.IsEnum(cxType)) { type.SetEnum(ast.GetEnum(removeQualifierName)); } else if (ClangTraits.IsFunction(cxType)) { type.SetFunction(GetFunctionProto(ast, cxType, context)); } else if (ClangTraits.IsUserDefiendType(cxType)) { NativeClass nativeClass = ast.GetClass(removeQualifierName); // if native class is parsed already, the native class is a full specialization // or the native class is a instantiation of a template or partial specialization if (!nativeClass.IsClassEntity && !nativeClass.Parsed) { nativeClass.Parsed = true; if (TemplateHelper.VisitTemplate(cursor, nativeClass, ast)) { TemplateHelper.VisitTemplateParameter(cursor, theType, nativeClass, ast, context); } } type.SetClass(nativeClass); } } }