void HandleDocumentParsed(object sender, EventArgs e) { var newDocument = Document.ParsedDocument; if (newDocument == null) { return; } var newTree = TypeSystemSegmentTree.Create(Document); if (typeSystemSegmentTree != null) { typeSystemSegmentTree.RemoveListener(); } typeSystemSegmentTree = newTree; typeSystemSegmentTree.InstallListener(document.Editor.Document); this.Unit = newDocument.GetAst <SyntaxTree> (); this.CSharpUnresolvedFile = newDocument.ParsedFile as CSharpUnresolvedFile; this.UnresolvedFileCompilation = Document.Compilation; if (TypeSegmentTreeUpdated != null) { TypeSegmentTreeUpdated(this, EventArgs.Empty); } }
static void AddType(MonoDevelop.Ide.Gui.Document document, TypeSystemSegmentTree result, IUnresolvedTypeDefinition type) { int offset = document.Editor.LocationToOffset(type.Region.Begin); int endOffset = type.Region.End.IsEmpty ? int.MaxValue : document.Editor.LocationToOffset(type.Region.End); if (endOffset < 0) { endOffset = int.MaxValue; } result.Add(new TypeSystemTreeSegment(offset, endOffset - offset, type)); foreach (var entity in type.Members) { offset = document.Editor.LocationToOffset(entity.Region.Begin); endOffset = document.Editor.LocationToOffset(entity.Region.End); if (endOffset < 0) { endOffset = int.MaxValue; } result.Add(new TypeSystemTreeSegment(offset, endOffset - offset, entity)); } foreach (var nested in type.NestedTypes) { AddType(document, result, nested); } }
internal static TypeSystemSegmentTree Create(MonoDevelop.Ide.Gui.Document document) { TypeSystemSegmentTree result = new TypeSystemSegmentTree(document); foreach (var type in document.ParsedDocument.TopLevelTypeDefinitions) { AddType(document, result, type); } return(result); }