private void ProcessMethod(NativeClass thisClass, CXCursor cursor, CXCursor parent) { string name = clang.getCursorSpelling(cursor).ToString(); bool isStataic = clang.CXXMethod_isStatic(cursor) != 0; bool isConst = clang.CXXMethod_isConst(cursor) != 0; bool isVirtual = clang.CXXMethod_isVirtual(cursor) != 0; bool isAbastrct = clang.CXXMethod_isPureVirtual(cursor) != 0; // create method Method memberFunc = new Method(thisClass, name, isStataic, isConst, isVirtual, isAbastrct); OnVisitFunctionParameter func = (FunctionParameter param) => { memberFunc.AddParameter(param); }; // proces result type CXType resultType = clang.getCursorResultType(cursor); memberFunc.ResultType = TypeVisitorHelper.GetNativeType(AST_, resultType); // deep visit children GCHandle delegateHandler = GCHandle.Alloc(func); clang.visitChildren(cursor, ParameterVisitor, new CXClientData((IntPtr)delegateHandler)); // process access specifier memberFunc.Access = ClangTraits.ToAccessSpecifier(clang.getCXXAccessSpecifier(cursor)); // register method thisClass.AddMethod(memberFunc); }
private CXChildVisitResult ParameterVisitor(CXCursor cursor, CXCursor parent, IntPtr data) { if (CXCursorKind.CXCursor_ParmDecl == cursor.kind) { // prepare client data GCHandle astHandle = (GCHandle)data; OnVisitFunctionParameter func = astHandle.Target as OnVisitFunctionParameter; CXType type = clang.getCursorType(cursor); FunctionParameter param = new FunctionParameter { Name = clang.getCursorSpelling(cursor).ToString(), Type = TypeVisitorHelper.GetNativeType(AST_, type) }; clang.visitChildren(cursor, (CXCursor c, CXCursor p, IntPtr d) => { if (ClangTraits.IsLiteralCursor(c)) { // get liter-string from token CXSourceRange range = clang.getCursorExtent(c); IntPtr tokens = IntPtr.Zero; uint numToken; string liter = ""; clang.tokenize(ASTVisitor.CurrentTU, range, out tokens, out numToken); IntPtr tmp = tokens; for (uint loop = 0; loop < numToken; ++loop, IntPtr.Add(tmp, 1)) { CXToken token = Marshal.PtrToStructure <CXToken>(tmp); liter += clang.getTokenSpelling(ASTVisitor.CurrentTU, token).ToString(); } clang.disposeTokens(ASTVisitor.CurrentTU, tokens, numToken); // set default literal param.DefaultValue = liter; } return(CXChildVisitResult.CXChildVisit_Continue); }, new CXClientData(IntPtr.Zero)); func(param); } return(CXChildVisitResult.CXChildVisit_Recurse); }
private void ProcessConstructor(NativeClass thisClass, CXCursor cursor, CXCursor parent) { bool isDefault = clang.CXXConstructor_isDefaultConstructor(cursor) != 0; bool isConvert = clang.CXXConstructor_isConvertingConstructor(cursor) != 0; bool isCopy = clang.CXXConstructor_isCopyConstructor(cursor) != 0; bool isMove = clang.CXXConstructor_isMoveConstructor(cursor) != 0; Constructor ctor = new Constructor(isDefault, isConvert, isCopy, isMove); OnVisitFunctionParameter func = (FunctionParameter param) => { ctor.AddParameter(param); }; List <string> tokens = ASTVisitor.GetCursorTokens(cursor); if (tokens.Count > 0) { if (tokens[0] == "explicit") { ctor.IsExplicit = true; } int count = tokens.Count; if (tokens[count - 2] == "=") { string lastToken = tokens[count - 1]; if (lastToken == "default") { ctor.Composite = DefaultCompositeKind.Default; } else if (lastToken == "delete") { ctor.Composite = DefaultCompositeKind.Delete; } } } // deep visit GCHandle delegateHandle = GCHandle.Alloc(func); clang.visitChildren(cursor, ParameterVisitor, new CXClientData((IntPtr)delegateHandle)); thisClass.AddConstructor(ctor); }