diff --git a/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs b/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs index a576ef11950480e34f5a1d312351ff06d2ff8786..1b47400e000e59f952249dd535e48370252487fa 100644 --- a/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs +++ b/src/EditorFeatures/CSharpTest/Squiggles/ErrorSquiggleProducerTests.cs @@ -200,12 +200,11 @@ class Test { var document = workspace.Documents.First(); - var updateArgs = new DiagnosticsUpdatedArgs( + var updateArgs = DiagnosticsUpdatedArgs.DiagnosticsCreated( new object(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id, ImmutableArray.Create( CreateDiagnosticData(workspace, document, new TextSpan(0, 0)), - CreateDiagnosticData(workspace, document, new TextSpan(0, 1))), - DiagnosticsUpdatedKind.DiagnosticsCreated); + CreateDiagnosticData(workspace, document, new TextSpan(0, 1)))); var spans = await GetErrorsFromUpdateSource(workspace, document, updateArgs).ConfigureAwait(true); @@ -234,12 +233,11 @@ class Test { var document = workspace.Documents.First(); - var updateArgs = new DiagnosticsUpdatedArgs( + var updateArgs = DiagnosticsUpdatedArgs.DiagnosticsCreated( new LiveId(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id, ImmutableArray.Create( CreateDiagnosticData(workspace, document, new TextSpan(0, 0)), - CreateDiagnosticData(workspace, document, new TextSpan(0, 1))), - DiagnosticsUpdatedKind.DiagnosticsCreated); + CreateDiagnosticData(workspace, document, new TextSpan(0, 1)))); var spans = await GetErrorsFromUpdateSource(workspace, document, updateArgs).ConfigureAwait(true); diff --git a/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs b/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs index 1d7a5d1456d7ba473511f697ef4810c4bf9933a0..805b9d0e6614ce4b1835d5efe8ce588e2d315f18 100644 --- a/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs +++ b/src/EditorFeatures/Core/Implementation/Diagnostics/AbstractDiagnosticsTaggerProvider.AggregatingTagger.cs @@ -64,7 +64,7 @@ private void GetInitialDiagnostics(CancellationToken cancellationToken) foreach (var updateArgs in _owner._diagnosticService.GetDiagnosticsUpdatedEventArgs(workspace, project.Id, document.Id, cancellationToken)) { var diagnostics = _owner._diagnosticService.GetDiagnostics(updateArgs.Workspace, updateArgs.ProjectId, updateArgs.DocumentId, updateArgs.Id, includeSuppressedDiagnostics: false, cancellationToken: cancellationToken); - OnDiagnosticsUpdated(new DiagnosticsUpdatedArgs(updateArgs.Id, updateArgs.Workspace, project.Solution, updateArgs.ProjectId, updateArgs.DocumentId, diagnostics.AsImmutableOrEmpty(), DiagnosticsUpdatedKind.DiagnosticsCreated)); + OnDiagnosticsUpdated(DiagnosticsUpdatedArgs.DiagnosticsCreated(updateArgs.Id, updateArgs.Workspace, project.Solution, updateArgs.ProjectId, updateArgs.DocumentId, diagnostics.AsImmutableOrEmpty())); } } } diff --git a/src/EditorFeatures/Core/Implementation/EditAndContinue/EditAndContinueDiagnosticUpdateSource.cs b/src/EditorFeatures/Core/Implementation/EditAndContinue/EditAndContinueDiagnosticUpdateSource.cs index eca2b6dc31c4e18ab5565231c3830ca6782d1f49..d848bb32996cda1e11539c55015363c4c9800452 100644 --- a/src/EditorFeatures/Core/Implementation/EditAndContinue/EditAndContinueDiagnosticUpdateSource.cs +++ b/src/EditorFeatures/Core/Implementation/EditAndContinue/EditAndContinueDiagnosticUpdateSource.cs @@ -49,8 +49,7 @@ public void ClearDiagnostics(DebuggingSession session, Workspace workspace, obje public void ClearDiagnostics(DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId) { - RaiseDiagnosticsUpdated(MakeArgs(session, workspace, errorId, projectId, documentId, ImmutableArray.Create(), - DiagnosticsUpdatedKind.DiagnosticsRemoved)); + RaiseDiagnosticsUpdated(MakeRemovedArgs(session, workspace, errorId, projectId, documentId)); } public ImmutableArray ReportDiagnostics(DebuggingSession session, object errorId, ProjectId projectId, Solution solution, IEnumerable diagnostics) @@ -61,7 +60,7 @@ public ImmutableArray ReportDiagnostics(DebuggingSession session, ob where document != null let item = MakeDiagnosticData(projectId, document, solution, diagnostic) group item by document.Id into itemsByDocumentId - select MakeArgs(session, errorId, solution.Workspace, solution, projectId, itemsByDocumentId.Key, ImmutableArray.CreateRange(itemsByDocumentId), DiagnosticsUpdatedKind.DiagnosticsCreated)); + select MakeCreatedArgs(session, errorId, solution.Workspace, solution, projectId, itemsByDocumentId.Key, ImmutableArray.CreateRange(itemsByDocumentId))); foreach (var args in argsByDocument) { @@ -85,27 +84,34 @@ private static DiagnosticData MakeDiagnosticData(ProjectId projectId, Document d } } - private DiagnosticsUpdatedArgs MakeArgs( - DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId, ImmutableArray items, - DiagnosticsUpdatedKind kind) + private DiagnosticsUpdatedArgs MakeCreatedArgs( + DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId, ImmutableArray items) { - return MakeArgs(session, errorId, workspace, solution: null, projectId: projectId, documentId: documentId, items: items, kind: kind); + return MakeCreatedArgs(session, errorId, workspace, solution: null, projectId: projectId, documentId: documentId, items: items); } - private DiagnosticsUpdatedArgs MakeArgs( - DebuggingSession session, object errorId, Workspace workspace, Solution solution, ProjectId projectId, DocumentId documentId, ImmutableArray items, - DiagnosticsUpdatedKind kind) + private DiagnosticsUpdatedArgs MakeRemovedArgs( + DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId) { - return new DiagnosticsUpdatedArgs( - id: new EnCId(session, errorId), - workspace: workspace, - solution: solution, - projectId: projectId, - documentId: documentId, - diagnostics: items, - kind: kind); + return MakeRemovedArgs(session, errorId, workspace, solution: null, projectId: projectId, documentId: documentId); } + private DiagnosticsUpdatedArgs MakeCreatedArgs( + DebuggingSession session, object errorId, Workspace workspace, Solution solution, ProjectId projectId, DocumentId documentId, ImmutableArray items) + { + return DiagnosticsUpdatedArgs.DiagnosticsCreated( + CreateId(session, errorId), workspace, solution, projectId, documentId, items); + } + + private DiagnosticsUpdatedArgs MakeRemovedArgs( + DebuggingSession session, object errorId, Workspace workspace, Solution solution, ProjectId projectId, DocumentId documentId) + { + return DiagnosticsUpdatedArgs.DiagnosticsRemoved( + CreateId(session, errorId), workspace, solution, projectId, documentId); + } + + private static EnCId CreateId(DebuggingSession session, object errorId) => new EnCId(session, errorId); + private void RaiseDiagnosticsUpdated(DiagnosticsUpdatedArgs args) { var updated = this.DiagnosticsUpdated; diff --git a/src/EditorFeatures/Test/Diagnostics/DiagnosticServiceTests.cs b/src/EditorFeatures/Test/Diagnostics/DiagnosticServiceTests.cs index 92da07a849419a8d967268c8b17b6b71acd176af..8b0b58e0e3581137c602d9685e37e757caef2c14 100644 --- a/src/EditorFeatures/Test/Diagnostics/DiagnosticServiceTests.cs +++ b/src/EditorFeatures/Test/Diagnostics/DiagnosticServiceTests.cs @@ -97,8 +97,7 @@ private static DiagnosticData RaiseDiagnosticEvent(ManualResetEvent set, TestDia var diagnostic = CreateDiagnosticData(workspace, project, document); source.RaiseUpdateEvent( - new DiagnosticsUpdatedArgs(id, workspace, workspace.CurrentSolution, project, document, ImmutableArray.Create(diagnostic), - DiagnosticsUpdatedKind.DiagnosticsCreated)); + DiagnosticsUpdatedArgs.DiagnosticsCreated(id, workspace, workspace.CurrentSolution, project, document, ImmutableArray.Create(diagnostic))); set.WaitOne(); diff --git a/src/Features/Core/Portable/Diagnostics/AbstractHostDiagnosticUpdateSource.cs b/src/Features/Core/Portable/Diagnostics/AbstractHostDiagnosticUpdateSource.cs index 563e45f3d4d179ae08a48416b7bc6cae798099ea..6916a29fd875adfb7d1b92ee1b2d9e27d747c7a7 100644 --- a/src/Features/Core/Portable/Diagnostics/AbstractHostDiagnosticUpdateSource.cs +++ b/src/Features/Core/Portable/Diagnostics/AbstractHostDiagnosticUpdateSource.cs @@ -79,7 +79,7 @@ internal void ReportAnalyzerDiagnostic(DiagnosticAnalyzer analyzer, Diagnostic d if (raiseDiagnosticsUpdated) { - RaiseDiagnosticsUpdated(MakeArgs(analyzer, dxs, project, DiagnosticsUpdatedKind.DiagnosticsCreated)); + RaiseDiagnosticsUpdated(MakeCreatedArgs(analyzer, dxs, project)); } } @@ -115,37 +115,35 @@ private void ClearAnalyzerDiagnostics(DiagnosticAnalyzer analyzer, ProjectId pro ImmutableInterlocked.TryUpdate(ref _analyzerHostDiagnosticsMap, analyzer, newDiags, existing)) { var project = this.Workspace.CurrentSolution.GetProject(projectId); - RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet.Empty, project, - DiagnosticsUpdatedKind.DiagnosticsRemoved)); + RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project)); } } else if (ImmutableInterlocked.TryRemove(ref _analyzerHostDiagnosticsMap, analyzer, out existing)) { var project = this.Workspace.CurrentSolution.GetProject(projectId); - RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet.Empty, project, - DiagnosticsUpdatedKind.DiagnosticsRemoved)); + RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project)); if (existing.Any(d => d.ProjectId == null)) { - RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet.Empty, project: null, - kind: DiagnosticsUpdatedKind.DiagnosticsRemoved)); + RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project: null)); } } } - private DiagnosticsUpdatedArgs MakeArgs(DiagnosticAnalyzer analyzer, ImmutableHashSet items, Project project, - DiagnosticsUpdatedKind kind) + private DiagnosticsUpdatedArgs MakeCreatedArgs(DiagnosticAnalyzer analyzer, ImmutableHashSet items, Project project) { - return new DiagnosticsUpdatedArgs( - kind: kind, - id: new HostArgsId(this, analyzer, project?.Id), - workspace: this.Workspace, - solution: project?.Solution, - projectId: project?.Id, - documentId: null, - diagnostics: items.ToImmutableArray()); + return DiagnosticsUpdatedArgs.DiagnosticsCreated( + CreateId(analyzer, project), this.Workspace, project?.Solution, project?.Id, documentId: null, diagnostics: items.ToImmutableArray()); } + private DiagnosticsUpdatedArgs MakeRemovedArgs(DiagnosticAnalyzer analyzer, Project project) + { + return DiagnosticsUpdatedArgs.DiagnosticsRemoved( + CreateId(analyzer, project), this.Workspace, project?.Solution, project?.Id, documentId: null); + } + + private HostArgsId CreateId(DiagnosticAnalyzer analyzer, Project project) => new HostArgsId(this, analyzer, project?.Id); + internal ImmutableArray TestOnly_GetReportedDiagnostics() { return _analyzerHostDiagnosticsMap.Values.Flatten().ToImmutableArray(); diff --git a/src/Features/Core/Portable/Diagnostics/DiagnosticsUpdatedArgs.cs b/src/Features/Core/Portable/Diagnostics/DiagnosticsUpdatedArgs.cs index f92e3753522422ae84eec432bf49f729a8865899..40add05cff1a3d390da1520ee9ccd1b823ed9df6 100644 --- a/src/Features/Core/Portable/Diagnostics/DiagnosticsUpdatedArgs.cs +++ b/src/Features/Core/Portable/Diagnostics/DiagnosticsUpdatedArgs.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Immutable; +using System.Diagnostics; using Microsoft.CodeAnalysis.Common; namespace Microsoft.CodeAnalysis.Diagnostics @@ -12,7 +13,7 @@ internal class DiagnosticsUpdatedArgs : UpdatedEventArgs public Solution Solution { get; } public ImmutableArray Diagnostics { get; } - public DiagnosticsUpdatedArgs( + private DiagnosticsUpdatedArgs( object id, Workspace workspace, Solution solution, @@ -25,6 +26,32 @@ internal class DiagnosticsUpdatedArgs : UpdatedEventArgs Solution = solution; Diagnostics = diagnostics; Kind = kind; + + if (kind == DiagnosticsUpdatedKind.DiagnosticsRemoved) + { + Debug.Assert(diagnostics.IsEmpty); + } + } + + public static DiagnosticsUpdatedArgs DiagnosticsCreated( + object id, + Workspace workspace, + Solution solution, + ProjectId projectId, + DocumentId documentId, + ImmutableArray diagnostics) + { + return new DiagnosticsUpdatedArgs(id, workspace, solution, projectId, documentId, diagnostics, DiagnosticsUpdatedKind.DiagnosticsCreated); + } + + public static DiagnosticsUpdatedArgs DiagnosticsRemoved( + object id, + Workspace workspace, + Solution solution, + ProjectId projectId, + DocumentId documentId) + { + return new DiagnosticsUpdatedArgs(id, workspace, solution, projectId, documentId, ImmutableArray.Empty, DiagnosticsUpdatedKind.DiagnosticsCreated); } } diff --git a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs index 9e81452ec0d23b89a42990144823f025e2a69211..67d7df5b14546834f75665b56394eb435f900a79 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer.cs @@ -156,7 +156,7 @@ private async Task AnalyzeSyntaxAsync(Document document, ImmutableHashSet.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved((StateType)stateType, documentId, stateSet, solutionArgs); } } } @@ -450,8 +449,7 @@ public override void RemoveProject(ProjectId projectId) stateSet.Remove(projectId); var solutionArgs = new SolutionArgument(null, projectId, null); - RaiseDiagnosticsUpdated(StateType.Project, projectId, stateSet, solutionArgs, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(StateType.Project, projectId, stateSet, solutionArgs); } } @@ -603,8 +601,7 @@ private static bool CheckSemanticVersions(Project project, AnalysisData existing return; } - RaiseDiagnosticsUpdated(type, document.Id, stateSet, new SolutionArgument(document), newItems, - DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(type, document.Id, stateSet, new SolutionArgument(document), newItems); } private void RaiseProjectDiagnosticsUpdatedIfNeeded( @@ -633,15 +630,13 @@ private static bool CheckSemanticVersions(Project project, AnalysisData existing { if (documentId == null) { - RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(StateType.Project, project.Id, stateSet, new SolutionArgument(project)); continue; } var document = project.GetDocument(documentId); var argument = documentId == null ? new SolutionArgument(null, documentId.ProjectId, documentId) : new SolutionArgument(document); - RaiseDiagnosticsUpdated(StateType.Project, documentId, stateSet, argument, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(StateType.Project, documentId, stateSet, argument); } } @@ -652,13 +647,11 @@ private void RaiseProjectDiagnosticsUpdated(Project project, StateSet stateSet, { if (kv.Key == null) { - RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), kv.ToImmutableArrayOrEmpty(), - DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), kv.ToImmutableArrayOrEmpty()); continue; } - RaiseDiagnosticsUpdated(StateType.Project, kv.Key, stateSet, new SolutionArgument(project.GetDocument(kv.Key)), kv.ToImmutableArrayOrEmpty(), - DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(StateType.Project, kv.Key, stateSet, new SolutionArgument(project.GetDocument(kv.Key)), kv.ToImmutableArrayOrEmpty()); } } @@ -667,9 +660,8 @@ private static ImmutableArray GetDiagnosticData(ILookup.Empty; } - private void RaiseDiagnosticsUpdated( - StateType type, object key, StateSet stateSet, SolutionArgument solution, ImmutableArray diagnostics, - DiagnosticsUpdatedKind kind) + private void RaiseDiagnosticsCreated( + StateType type, object key, StateSet stateSet, SolutionArgument solution, ImmutableArray diagnostics) { if (Owner == null) { @@ -677,11 +669,32 @@ private static ImmutableArray GetDiagnosticData(ILookup UpdateDocumentDiagnostics( @@ -928,8 +941,7 @@ private void ClearDocumentState(Document document, StateSet stateSet, StateType var documentId = document.Id; var solutionArgs = new SolutionArgument(document); - RaiseDiagnosticsUpdated(type, document.Id, stateSet, solutionArgs, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(type, document.Id, stateSet, solutionArgs); } } @@ -956,8 +968,7 @@ private void ClearProjectState(Project project, StateSet stateSet) // raise diagnostic updated event var solutionArgs = new SolutionArgument(project); - RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, solutionArgs, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(StateType.Project, project.Id, stateSet, solutionArgs); } private async Task ClearExistingDiagnostics(Document document, StateSet stateSet, StateType type, CancellationToken cancellationToken) diff --git a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer_BuildSynchronization.cs b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer_BuildSynchronization.cs index af2690625e85622da3836f5977002f41161958ee..535db95a55a2219b8a5320a8397a213f639d4243 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer_BuildSynchronization.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV1/DiagnosticIncrementalAnalyzer_BuildSynchronization.cs @@ -39,8 +39,7 @@ public override async Task SynchronizeWithBuildAsync(Project project, ImmutableA var mergedDiagnostics = MergeDiagnostics(liveDiagnostics, GetExistingDiagnostics(existingDiagnostics)); await state.PersistAsync(project, new AnalysisData(projectTextVersion, semanticVersion, mergedDiagnostics), CancellationToken.None).ConfigureAwait(false); - RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), mergedDiagnostics, - DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), mergedDiagnostics); } } } @@ -106,8 +105,7 @@ private bool PreferLiveErrorsOnOpenedFiles(Workspace workspace) var mergedDiagnostics = MergeDiagnostics(diagnostics, GetExistingDiagnostics(existingDiagnostics)); await state.PersistAsync(document, new AnalysisData(textVersion, semanticVersion, mergedDiagnostics), CancellationToken.None).ConfigureAwait(false); - RaiseDiagnosticsUpdated(stateType, document.Id, stateSet, new SolutionArgument(document), mergedDiagnostics, - DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(stateType, document.Id, stateSet, new SolutionArgument(document), mergedDiagnostics); } private static ImmutableArray GetExistingDiagnostics(AnalysisData analysisData) diff --git a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.cs b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.cs index 880d179785800960518a9395bc6385d5187707b8..92c0bc541b6cb2075fb16bda113c52c7b4f8af45 100644 --- a/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.cs +++ b/src/Features/Core/Portable/Diagnostics/EngineV2/DiagnosticIncrementalAnalyzer.cs @@ -61,18 +61,14 @@ public override Task NewSolutionSnapshotAsync(Solution solution, CancellationTok public override void RemoveDocument(DocumentId documentId) { - Owner.RaiseDiagnosticsUpdated( - this, new DiagnosticsUpdatedArgs( - ValueTuple.Create(this, documentId), Workspace, null, null, null, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved)); + Owner.RaiseDiagnosticsUpdated(this, DiagnosticsUpdatedArgs.DiagnosticsRemoved( + ValueTuple.Create(this, documentId), Workspace, null, null, null)); } public override void RemoveProject(ProjectId projectId) { - Owner.RaiseDiagnosticsUpdated( - this, new DiagnosticsUpdatedArgs( - ValueTuple.Create(this, projectId), Workspace, null, null, null, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved)); + Owner.RaiseDiagnosticsUpdated(this, DiagnosticsUpdatedArgs.DiagnosticsRemoved( + ValueTuple.Create(this, projectId), Workspace, null, null, null)); } #endregion @@ -218,16 +214,14 @@ private void RaiseEvents(Project project, ImmutableArray diagnos if (kv.Key == null) { Owner.RaiseDiagnosticsUpdated( - this, new DiagnosticsUpdatedArgs( - ValueTuple.Create(this, project.Id), workspace, solution, project.Id, null, kv.ToImmutableArrayOrEmpty(), - kind: DiagnosticsUpdatedKind.DiagnosticsCreated)); + this, DiagnosticsUpdatedArgs.DiagnosticsCreated( + ValueTuple.Create(this, project.Id), workspace, solution, project.Id, null, kv.ToImmutableArrayOrEmpty())); continue; } Owner.RaiseDiagnosticsUpdated( - this, new DiagnosticsUpdatedArgs( - ValueTuple.Create(this, kv.Key), workspace, solution, project.Id, kv.Key, kv.ToImmutableArrayOrEmpty(), - kind: DiagnosticsUpdatedKind.DiagnosticsCreated)); + this, DiagnosticsUpdatedArgs.DiagnosticsCreated( + ValueTuple.Create(this, kv.Key), workspace, solution, project.Id, kv.Key, kv.ToImmutableArrayOrEmpty())); } } } diff --git a/src/Features/Core/Portable/Diagnostics/HostAnalyzerManager.cs b/src/Features/Core/Portable/Diagnostics/HostAnalyzerManager.cs index 89cef233446e05ef683f9ee0fec052926a7c8a4b..29a250077d38d780482cd6f900311451621b7df2 100644 --- a/src/Features/Core/Portable/Diagnostics/HostAnalyzerManager.cs +++ b/src/Features/Core/Portable/Diagnostics/HostAnalyzerManager.cs @@ -530,14 +530,13 @@ public void OnAnalyzerLoadFailed(object sender, AnalyzerLoadFailureEventArgs e) var diagnostic = AnalyzerHelper.CreateAnalyzerLoadFailureDiagnostic(reference.FullPath, e); // diagnostic from host analyzer can never go away - var args = new DiagnosticsUpdatedArgs( + var args = DiagnosticsUpdatedArgs.DiagnosticsCreated( id: Tuple.Create(this, reference.FullPath, e.ErrorCode, e.TypeName), workspace: PrimaryWorkspace.Workspace, solution: null, projectId: null, documentId: null, - diagnostics: ImmutableArray.Create(diagnostic), - kind: DiagnosticsUpdatedKind.DiagnosticsCreated); + diagnostics: ImmutableArray.Create(diagnostic)); _hostUpdateSource.RaiseDiagnosticsUpdated(args); } diff --git a/src/VisualStudio/Core/Def/Implementation/Diagnostics/MiscellaneousDiagnosticAnalyzerService.cs b/src/VisualStudio/Core/Def/Implementation/Diagnostics/MiscellaneousDiagnosticAnalyzerService.cs index 409b4e1d1ce868f8821b3e5ca178844ee263d76b..a7c43cbaac699ae6a0b214800e51560996312f19 100644 --- a/src/VisualStudio/Core/Def/Implementation/Diagnostics/MiscellaneousDiagnosticAnalyzerService.cs +++ b/src/VisualStudio/Core/Def/Implementation/Diagnostics/MiscellaneousDiagnosticAnalyzerService.cs @@ -92,9 +92,8 @@ public async Task AnalyzeSyntaxAsync(Document document, CancellationToken cancel var diagnosticData = diagnostics == null ? ImmutableArray.Empty : diagnostics.Select(d => DiagnosticData.Create(document, d)).ToImmutableArrayOrEmpty(); _service.RaiseDiagnosticsUpdated( - new DiagnosticsUpdatedArgs(new MiscUpdateArgsId(document.Id), - _workspace, document.Project.Solution, document.Project.Id, document.Id, diagnosticData, - DiagnosticsUpdatedKind.DiagnosticsCreated)); + DiagnosticsUpdatedArgs.DiagnosticsCreated(new MiscUpdateArgsId(document.Id), + _workspace, document.Project.Solution, document.Project.Id, document.Id, diagnosticData)); } public void RemoveDocument(DocumentId documentId) @@ -121,8 +120,8 @@ public Task DocumentCloseAsync(Document document, CancellationToken cancellation private void RaiseEmptyDiagnosticUpdated(DocumentId documentId) { - _service.RaiseDiagnosticsUpdated(new DiagnosticsUpdatedArgs(ValueTuple.Create(this, documentId), _workspace, null, documentId.ProjectId, documentId, ImmutableArray.Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved)); + _service.RaiseDiagnosticsUpdated(DiagnosticsUpdatedArgs.DiagnosticsRemoved( + ValueTuple.Create(this, documentId), _workspace, null, documentId.ProjectId, documentId)); } // method we don't care. misc project only supports syntax errors diff --git a/src/VisualStudio/Core/Def/Implementation/TaskList/ExternalErrorDiagnosticUpdateSource.cs b/src/VisualStudio/Core/Def/Implementation/TaskList/ExternalErrorDiagnosticUpdateSource.cs index ba302fa334f1375418aed91e3556c282bcf8355f..2bda4abd103b33524d6508781a7610bd5a51646a 100644 --- a/src/VisualStudio/Core/Def/Implementation/TaskList/ExternalErrorDiagnosticUpdateSource.cs +++ b/src/VisualStudio/Core/Def/Implementation/TaskList/ExternalErrorDiagnosticUpdateSource.cs @@ -282,13 +282,13 @@ private void ReportBuildErrors(T item, ImmutableArray buildEr var project = item as Project; if (project != null) { - RaiseDiagnosticsUpdated(project.Id, project.Id, null, buildErrors, DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(project.Id, project.Id, null, buildErrors); return; } // must be not null var document = item as Document; - RaiseDiagnosticsUpdated(document.Id, document.Project.Id, document.Id, buildErrors, DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreated(document.Id, document.Project.Id, document.Id, buildErrors); } private Dictionary> GetSupportedLiveDiagnosticId(Solution solution, InprogressState state) @@ -308,7 +308,7 @@ private void ReportBuildErrors(T item, ImmutableArray buildEr private void ClearProjectErrors(ProjectId projectId, Solution solution = null) { // remove all project errors - RaiseDiagnosticsUpdated(projectId, projectId, null, ImmutableArray.Empty, DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(projectId, projectId, documentId: null); var project = (solution ?? _workspace.CurrentSolution).GetProject(projectId); if (project == null) @@ -325,7 +325,7 @@ private void ClearProjectErrors(ProjectId projectId, Solution solution = null) private void ClearDocumentErrors(ProjectId projectId, DocumentId documentId) { - RaiseDiagnosticsUpdated(documentId, projectId, documentId, ImmutableArray.Empty, DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemoved(documentId, projectId, documentId); } public void AddNewErrors(DocumentId documentId, DiagnosticData diagnostic) @@ -363,13 +363,20 @@ private InprogressState GetOrCreateInprogressState() return _state; } - private void RaiseDiagnosticsUpdated(object id, ProjectId projectId, DocumentId documentId, ImmutableArray items, - DiagnosticsUpdatedKind kind) + private void RaiseDiagnosticsCreated(object id, ProjectId projectId, DocumentId documentId, ImmutableArray items) { - DiagnosticsUpdated?.Invoke(this, new DiagnosticsUpdatedArgs( - new ArgumentKey(id), _workspace, _workspace.CurrentSolution, projectId, documentId, items, kind)); + DiagnosticsUpdated?.Invoke(this, DiagnosticsUpdatedArgs.DiagnosticsCreated( + CreateArgumentKey(id), _workspace, _workspace.CurrentSolution, projectId, documentId, items)); } + private void RaiseDiagnosticsRemoved(object id, ProjectId projectId, DocumentId documentId) + { + DiagnosticsUpdated?.Invoke(this, DiagnosticsUpdatedArgs.DiagnosticsRemoved( + CreateArgumentKey(id), _workspace, _workspace.CurrentSolution, projectId, documentId)); + } + + private static ArgumentKey CreateArgumentKey(object id) => new ArgumentKey(id); + private void RaiseBuildStarted(bool started) { BuildStarted?.Invoke(this, started); diff --git a/src/VisualStudio/Core/Def/Implementation/TaskList/HostDiagnosticUpdateSource.cs b/src/VisualStudio/Core/Def/Implementation/TaskList/HostDiagnosticUpdateSource.cs index 94308fb53e6fe577a5398f86d33029db98c06aef..f8d1efca86b8787e4694bbf63fe6b042d4f82101 100644 --- a/src/VisualStudio/Core/Def/Implementation/TaskList/HostDiagnosticUpdateSource.cs +++ b/src/VisualStudio/Core/Def/Implementation/TaskList/HostDiagnosticUpdateSource.cs @@ -37,21 +37,33 @@ internal override Workspace Workspace } } - private void RaiseDiagnosticsUpdatedForProject(ProjectId projectId, object key, IEnumerable items, - DiagnosticsUpdatedKind kind) + private void RaiseDiagnosticsCreatedForProject(ProjectId projectId, object key, IEnumerable items) { - var args = new DiagnosticsUpdatedArgs( - id: Tuple.Create(this, projectId, key), - workspace: _workspace, + var args = DiagnosticsUpdatedArgs.DiagnosticsCreated( + CreateId(projectId, key), + _workspace, solution: null, projectId: projectId, documentId: null, - diagnostics: items.AsImmutableOrEmpty(), - kind: kind); + diagnostics: items.AsImmutableOrEmpty()); RaiseDiagnosticsUpdated(args); } + private void RaiseDiagnosticsRemovedForProject(ProjectId projectId, object key) + { + var args = DiagnosticsUpdatedArgs.DiagnosticsRemoved( + CreateId(projectId, key), + _workspace, + solution: null, + projectId: projectId, + documentId: null); + + RaiseDiagnosticsUpdated(args); + } + + private object CreateId(ProjectId projectId, object key) => Tuple.Create(this, projectId, key); + public void UpdateDiagnosticsForProject(ProjectId projectId, object key, IEnumerable items) { Contract.ThrowIfNull(projectId); @@ -63,7 +75,7 @@ public void UpdateDiagnosticsForProject(ProjectId projectId, object key, IEnumer _diagnosticMap.GetOrAdd(projectId, id => new HashSet()).Add(key); } - RaiseDiagnosticsUpdatedForProject(projectId, key, items, DiagnosticsUpdatedKind.DiagnosticsCreated); + RaiseDiagnosticsCreatedForProject(projectId, key, items); } public void ClearAllDiagnosticsForProject(ProjectId projectId) @@ -83,8 +95,7 @@ public void ClearAllDiagnosticsForProject(ProjectId projectId) { foreach (var key in projectDiagnosticKeys) { - RaiseDiagnosticsUpdatedForProject(projectId, key, SpecializedCollections.EmptyEnumerable(), - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemovedForProject(projectId, key); } } } @@ -106,8 +117,7 @@ public void ClearDiagnosticsForProject(ProjectId projectId, object key) if (raiseEvent) { - RaiseDiagnosticsUpdatedForProject(projectId, key, SpecializedCollections.EmptyEnumerable(), - DiagnosticsUpdatedKind.DiagnosticsRemoved); + RaiseDiagnosticsRemovedForProject(projectId, key); } } } diff --git a/src/VisualStudio/Core/Test/Diagnostics/DiagnosticTableDataSourceTests.vb b/src/VisualStudio/Core/Test/Diagnostics/DiagnosticTableDataSourceTests.vb index 23a5c0cf1c639112aaf5cf2f6f6ecf099801f85f..91814499b3569eefa5cc4f5a63a8650e685c7ae1 100644 --- a/src/VisualStudio/Core/Test/Diagnostics/DiagnosticTableDataSourceTests.vb +++ b/src/VisualStudio/Core/Test/Diagnostics/DiagnosticTableDataSourceTests.vb @@ -737,33 +737,29 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.Diagnostics Dim item = items(0) Dim id = If(CObj(item.DocumentId), item.ProjectId) - RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( - New ErrorId(Me, id), workspace, workspace.CurrentSolution, item.ProjectId, item.DocumentId, items.ToImmutableArray(), - DiagnosticsUpdatedKind.DiagnosticsCreated)) + RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsCreated( + New ErrorId(Me, id), workspace, workspace.CurrentSolution, item.ProjectId, item.DocumentId, items.ToImmutableArray())) End Sub Public Sub RaiseDiagnosticsUpdated(workspace As Workspace) Dim documentMap = Items.Where(Function(t) t.DocumentId IsNot Nothing).Where(Function(t) t.Workspace Is workspace).ToLookup(Function(t) t.DocumentId) For Each group In documentMap - RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( - New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key.ProjectId, group.Key, group.ToImmutableArrayOrEmpty(), - DiagnosticsUpdatedKind.DiagnosticsCreated)) + RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsCreated( + New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key.ProjectId, group.Key, group.ToImmutableArrayOrEmpty())) Next Dim projectMap = Items.Where(Function(t) t.DocumentId Is Nothing).Where(Function(t) t.Workspace Is workspace).ToLookup(Function(t) t.ProjectId) For Each group In projectMap - RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( - New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key, Nothing, group.ToImmutableArrayOrEmpty(), - DiagnosticsUpdatedKind.DiagnosticsCreated)) + RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsCreated( + New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key, Nothing, group.ToImmutableArrayOrEmpty())) Next End Sub Public Sub RaiseClearDiagnosticsUpdated(workspace As Workspace, projectId As ProjectId, documentId As DocumentId) - RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( - New ErrorId(Me, documentId), workspace, workspace.CurrentSolution, projectId, documentId, ImmutableArray(Of DiagnosticData).Empty, - DiagnosticsUpdatedKind.DiagnosticsRemoved)) + RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsRemoved( + New ErrorId(Me, documentId), workspace, workspace.CurrentSolution, projectId, documentId)) End Sub Private Class ErrorId