Пример #1
0
        private static ParameterDefinition ParseParameter(Cursor cursor, CppParserContext context)
        {
            string parameterName = cursor.Spelling;

            IEnumerable <Token> tokens = context.TranslationUnit.Tokenize(cursor.Extent);
            bool isOptional            = tokens.Any(t => t.Spelling == "=");

            return(new ParameterDefinition(parameterName, new TypeRefDefinition(cursor.Type), isOptional));
        }
Пример #2
0
        public void Parse(Cursor cursor, CppParserContext context)
        {
            string namespaceName           = cursor.Spelling;
            NamespaceDefinition @namespace = CreateOrGetNamespace(namespaceName, context);

            NamespaceDefinition previousNamespace = context.Namespace;

            context.Namespace = @namespace;
            cursor.VisitChildren(context.NodeVisitor);
            context.Namespace = previousNamespace;
        }
Пример #3
0
        private static string GetEnumeratorValue(Cursor constantDecl, CppParserContext context)
        {
            var value = constantDecl.Children.FirstOrDefault();

            if (value != null)
            {
                var valueTokens = context.TranslationUnit.Tokenize(value.Extent)
                                  .Where(IsValueToken);
                string spelling = string.Join("", valueTokens.Select(t => t.Spelling));
                return(string.IsNullOrEmpty(spelling) ? null : spelling);
            }
            return(null);
        }
Пример #4
0
        public void Parse(Cursor cursor, CppParserContext context)
        {
            string fieldName = cursor.Spelling;
            var    field     = new FieldDefinition(fieldName, new TypeRefDefinition(cursor.Type));

            ModelNodeDefinition parent = context.GetContainingClassOrNamespace();

            if (parent is NamespaceDefinition)
            {
                field.Header = context.Header;
            }
            parent.AddChild(field);
        }
Пример #5
0
        private static NamespaceDefinition CreateOrGetNamespace(string name, CppParserContext context)
        {
            var @namespace = context.Namespace.Namespaces
                             .FirstOrDefault(n => n.Name == name);

            if (@namespace == null)
            {
                @namespace = new NamespaceDefinition(name)
                {
                    Parent = context.Namespace
                };
                context.Namespace.Children.Add(@namespace);
            }
            return(@namespace);
        }
Пример #6
0
        private static bool IsCursorAbstract(Cursor cursor, CppParserContext context)
        {
            IList <Token> tokens = context.TranslationUnit.Tokenize(cursor.Extent).ToList();
            int           count  = tokens.Count;

            if (count > 3)
            {
                if (tokens[count - 3].Spelling.Equals("=") &&
                    tokens[count - 2].Spelling.Equals("0") &&
                    tokens[count - 1].Spelling.Equals(";"))
                {
                    return(true);
                }
            }
            return(false);
        }
Пример #7
0
        public void Parse(Cursor cursor, CppParserContext context)
        {
            var parent = context.GetContainingClassOrNamespace();
            var @enum  = new EnumDefinition(cursor.Spelling);

            foreach (var constantDecl in cursor.Children
                     .Where(c => c.Kind == CursorKind.EnumConstantDecl))
            {
                string name  = constantDecl.Spelling;
                string value = GetEnumeratorValue(constantDecl, context);
                @enum.AddChild(new EnumeratorDefinition(name, value));
            }

            parent.AddChild(@enum);
            if (parent is NamespaceDefinition)
            {
                context.Header.AddNode(@enum);
            }
        }
Пример #8
0
        public void Parse(Cursor cursor, CppParserContext context)
        {
            string className           = cursor.Spelling;
            ModelNodeDefinition parent = context.GetContainingClassOrNamespace();

            if (HasNameConflict(className, parent))
            {
                return;
            }

            context.Class = new ClassDefinition(className);
            parent.AddChild(context.Class);
            if (parent is NamespaceDefinition)
            {
                context.Header.AddNode(context.Class);
            }

            cursor.VisitChildren(context.NodeVisitor);

            context.Class = parent as ClassDefinition;
        }
Пример #9
0
        private void InitializeContext(RootFolderDefinition rootFolder)
        {
            _context = new CppParserContext(rootFolder)
            {
                NodeVisitor = HeaderVisitor
            };

            var classParser  = new ClassParser();
            var methodParser = new MethodParser();

            _context.DefinitionParsers.Add(CursorKind.ClassDecl, classParser);
            _context.DefinitionParsers.Add(CursorKind.ClassTemplate, classParser);
            _context.DefinitionParsers.Add(CursorKind.StructDecl, classParser);
            _context.DefinitionParsers.Add(CursorKind.EnumDecl, new EnumParser());
            _context.DefinitionParsers.Add(CursorKind.Namespace, new NamespaceParser());
            _context.DeclarationParsers.Add(CursorKind.FieldDecl, new FieldParser());
            _context.DeclarationParsers.Add(CursorKind.CxxMethod, methodParser);
            _context.DeclarationParsers.Add(CursorKind.Constructor, methodParser);

            var globalNamespace = new NamespaceDefinition("");

            _context.Namespace = globalNamespace;
        }
Пример #10
0
        public void Parse(Cursor cursor, CppParserContext context)
        {
            string methodName = cursor.Spelling;

            var parameters = new ParameterDefinition[cursor.NumArguments];

            for (uint i = 0; i < cursor.NumArguments; i++)
            {
                Cursor parameterCursor = cursor.GetArgument(i);
                parameters[i] = ParseParameter(parameterCursor, context);
            }

            context.Method = new MethodDefinition(methodName, parameters)
            {
                IsConstructor = cursor.Kind == CursorKind.Constructor,
                IsStatic      = cursor.IsStaticCxxMethod,
                IsAbstract    = IsCursorAbstract(cursor, context),
                ReturnType    = new TypeRefDefinition(cursor.ResultType)
            };

            ModelNodeDefinition parent = context.GetContainingClassOrNamespace();

            if (parent is NamespaceDefinition)
            {
                if (cursor.SemanticParent.Kind == CursorKind.ClassDecl ||
                    cursor.SemanticParent.Kind == CursorKind.ClassTemplate ||
                    cursor.SemanticParent.Kind == CursorKind.StructDecl)
                {
                    // FIXME: Clang reports a method definition as a method declaration
                    return;
                }
                context.Method.Header = context.Header;
            }
            parent.AddChild(context.Method);

            context.Method = null;
        }