private static void ReportSessionWideTelemetry() { SolutionLogger.ReportTelemetry(); AsyncCompletionLogger.ReportTelemetry(); CompletionProvidersLogger.ReportTelemetry(); ChangeSignatureLogger.ReportTelemetry(); InheritanceMarginLogger.ReportTelemetry(); }
protected override async Task ProduceTagsAsync( TaggerContext <InheritanceMarginTag> context, DocumentSnapshotSpan spanToTag, int?caretPosition, CancellationToken cancellationToken) { var document = spanToTag.Document; if (document == null) { return; } var inheritanceMarginInfoService = document.GetLanguageService <IInheritanceMarginService>(); if (inheritanceMarginInfoService == null) { return; } if (GlobalOptions.GetOption(FeatureOnOffOptions.ShowInheritanceMargin, document.Project.Language) == false) { return; } var includeGlobalImports = GlobalOptions.GetOption(FeatureOnOffOptions.InheritanceMarginIncludeGlobalImports, document.Project.Language); // Use FrozenSemantics Version of document to get the semantics ready, therefore we could have faster // response. (Since the full load might take a long time) // We also subscribe to CompilationAvailableTaggerEventSource, so this will finally reach the correct state. document = document.WithFrozenPartialSemantics(cancellationToken); var spanToSearch = spanToTag.SnapshotSpan.Span.ToTextSpan(); var stopwatch = SharedStopwatch.StartNew(); var inheritanceMemberItems = await inheritanceMarginInfoService.GetInheritanceMemberItemsAsync( document, spanToSearch, includeGlobalImports, cancellationToken).ConfigureAwait(false); var elapsed = stopwatch.Elapsed; if (inheritanceMemberItems.IsEmpty) { return; } InheritanceMarginLogger.LogGenerateBackgroundInheritanceInfo(elapsed); // One line might have multiple members to show, so group them. // For example: // interface IBar { void Foo1(); void Foo2(); } // class Bar : IBar { void Foo1() { } void Foo2() { } } var lineToMembers = inheritanceMemberItems.GroupBy(item => item.LineNumber); var snapshot = spanToTag.SnapshotSpan.Snapshot; foreach (var(lineNumber, membersOnTheLine) in lineToMembers) { var membersOnTheLineArray = membersOnTheLine.ToImmutableArray(); // One line should at least have one member on it. Contract.ThrowIfTrue(membersOnTheLineArray.IsEmpty); var line = snapshot.GetLineFromLineNumber(lineNumber); // We only care about the line, so just tag the start. context.AddTag(new TagSpan <InheritanceMarginTag>( new SnapshotSpan(snapshot, line.Start, length: 0), new InheritanceMarginTag(document.Project.Solution.Workspace, lineNumber, membersOnTheLineArray))); } }