Exemplo n.º 1
0
        private void Parse(string text)
        {
            // Clear stream from all invalid tokens
            _tokens.RemoveAll(d => d.IsEOF || (!d.IsMarker && d.Length == 0));

            // @FIXME(final): Right know, the tokens are not in a valid range
            // Reason is: No tokens gets replaced by another range.
            // Also there are zero-length tokens or start/end tokens
#if false
            // Validate stream
            {
                LinkedListStream <BaseToken> tokenStream = new LinkedListStream <BaseToken>(_tokens);
                while (!tokenStream.IsEOF)
                {
                    var tokenNode = tokenStream.CurrentNode;
                    if (tokenNode.Next != null)
                    {
                        int endIndex   = tokenNode.Value.Index;
                        int startIndex = tokenNode.Next.Value.Index;
                        Debug.Assert(startIndex >= endIndex);
                    }
                    tokenStream.Next();
                }
            }
#endif

            Stopwatch timer = new Stopwatch();

            // Doxygen parsing
            int doxyNodeCount = 0;
            timer.Restart();
            using (DoxygenParser doxyParser = new DoxygenParser(this, text))
            {
                doxyParser.ParseTokens(_tokens);
                _errors.InsertRange(0, doxyParser.ParseErrors);
                _doxyTree     = doxyParser.Root;
                doxyNodeCount = doxyParser.TotalNodeCount;
            }
            timer.Stop();
            Debug.WriteLine($"Doxygen parse done, took {timer.Elapsed.ToMilliseconds()} ms");
            _performanceItems.Add(new PerformanceItemModel(this, TabIndex, $"{_tokens.Count} tokens", $"{doxyNodeCount} nodes", "Doxygen parser", timer.Elapsed));

            // C++ parsing
            timer.Restart();
            int cppNodeCount = 0;
            using (CppParser cppParser = new CppParser(this))
            {
                cppParser.GetDocumentationNode += (token) =>
                {
                    IBaseNode result = _doxyTree.FindNodeByRange(token.Range);
                    return(result);
                };
                cppParser.ParseTokens(_tokens);
                _errors.InsertRange(0, cppParser.ParseErrors);
                _cppTree     = cppParser.Root;
                cppNodeCount = cppParser.TotalNodeCount;
            }
            timer.Stop();
            Debug.WriteLine($"C++ parse done, took {timer.Elapsed.ToMilliseconds()} ms");
            _performanceItems.Add(new PerformanceItemModel(this, TabIndex, $"{_tokens.Count} tokens", $"{cppNodeCount} nodes", "C++ parser", timer.Elapsed));
        }