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)); }