private void UpdateFoldingRegions(ICompilationUnit compilationUnit, CSParserResults parserResults) { var directives = new Stack <PreprocessingDirective>(); var foldingRegions = compilationUnit.FoldingRegions; // Collect all #region and #endregion directives and push them on a stack. foreach (var special in parserResults.Specials) { var directive = special as PreprocessingDirective; if (directive != null) { if (directive.Cmd == "#region") { directives.Push(directive); } else if (directive.Cmd == "#endregion") { if (directives.Count > 0) { var o = directives.Pop(); var l = DomRegion.FromLocation(o.StartPosition, directive.EndPosition); foldingRegions.Add(new FoldingRegion(o.Arg.Trim(), l)); } } } } }
private void AddCommentTags(ICompilationUnit compilationUnit, CSParserResults parserResults) { foreach (var tagComment in parserResults.TagComments) { var tagRegion = new DomRegion(tagComment.StartPosition.Y, tagComment.StartPosition.X); var tag = new TagComment(tagComment.Tag, tagRegion, tagComment.CommentText); compilationUnit.TagComments.Add(tag); } }
private void UpdateParseInfo(CSParserResults results) { var filename = Location.LocalPath; var oldCompilationUnit = FParseInfo.MostRecentCompilationUnit; var projectContent = GetProjectContent(); var visitor = new NRefactoryASTConvertVisitor(projectContent); visitor.Specials = results.Specials; visitor.VisitCompilationUnit(results.CompilationUnit, null); var newCompilationUnit = visitor.Cu; newCompilationUnit.ErrorsDuringCompile = results.HasErrors; newCompilationUnit.FileName = filename; UpdateFoldingRegions(newCompilationUnit, results); AddCommentTags(newCompilationUnit, results); projectContent.UpdateCompilationUnit(oldCompilationUnit, newCompilationUnit, filename); FParseInfo.SetCompilationUnit(newCompilationUnit); }
public void Parse(bool parseMethodBodies) { try { lock (FParseLock) { FParserResults = CSParser.Parse(TextContent, parseMethodBodies); var filename = Location.LocalPath; var oldCompilationUnit = FParseInfo.MostRecentCompilationUnit; var projectContent = GetProjectContent(); var visitor = new NRefactoryASTConvertVisitor(projectContent); visitor.Specials = FParserResults.Specials; visitor.VisitCompilationUnit(FParserResults.CompilationUnit, null); var newCompilationUnit = visitor.Cu; newCompilationUnit.ErrorsDuringCompile = FParserResults.HasErrors; newCompilationUnit.FileName = filename; UpdateFoldingRegions(newCompilationUnit, FParserResults); AddCommentTags(newCompilationUnit, FParserResults); // Remove information from lastCompilationUnit and add information from newCompilationUnit. projectContent.UpdateCompilationUnit(oldCompilationUnit, newCompilationUnit, filename); FParseInfo.SetCompilationUnit(newCompilationUnit); } } catch (Exception e) { Shell.Instance.Logger.Log(e); } finally { FParsingDone.Set(); } }