コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }