提交 1a881baa 编写于 作者: C Cyrus Najmabadi

Make it so we can't produce invalid update args.

上级 2971c626
...@@ -200,12 +200,11 @@ class Test ...@@ -200,12 +200,11 @@ class Test
{ {
var document = workspace.Documents.First(); var document = workspace.Documents.First();
var updateArgs = new DiagnosticsUpdatedArgs( var updateArgs = DiagnosticsUpdatedArgs.DiagnosticsCreated(
new object(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id, new object(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id,
ImmutableArray.Create( ImmutableArray.Create(
CreateDiagnosticData(workspace, document, new TextSpan(0, 0)), CreateDiagnosticData(workspace, document, new TextSpan(0, 0)),
CreateDiagnosticData(workspace, document, new TextSpan(0, 1))), CreateDiagnosticData(workspace, document, new TextSpan(0, 1))));
DiagnosticsUpdatedKind.DiagnosticsCreated);
var spans = await GetErrorsFromUpdateSource(workspace, document, updateArgs).ConfigureAwait(true); var spans = await GetErrorsFromUpdateSource(workspace, document, updateArgs).ConfigureAwait(true);
...@@ -234,12 +233,11 @@ class Test ...@@ -234,12 +233,11 @@ class Test
{ {
var document = workspace.Documents.First(); var document = workspace.Documents.First();
var updateArgs = new DiagnosticsUpdatedArgs( var updateArgs = DiagnosticsUpdatedArgs.DiagnosticsCreated(
new LiveId(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id, new LiveId(), workspace, workspace.CurrentSolution, document.Project.Id, document.Id,
ImmutableArray.Create( ImmutableArray.Create(
CreateDiagnosticData(workspace, document, new TextSpan(0, 0)), CreateDiagnosticData(workspace, document, new TextSpan(0, 0)),
CreateDiagnosticData(workspace, document, new TextSpan(0, 1))), CreateDiagnosticData(workspace, document, new TextSpan(0, 1))));
DiagnosticsUpdatedKind.DiagnosticsCreated);
var spans = await GetErrorsFromUpdateSource(workspace, document, updateArgs).ConfigureAwait(true); var spans = await GetErrorsFromUpdateSource(workspace, document, updateArgs).ConfigureAwait(true);
......
...@@ -64,7 +64,7 @@ private void GetInitialDiagnostics(CancellationToken cancellationToken) ...@@ -64,7 +64,7 @@ private void GetInitialDiagnostics(CancellationToken cancellationToken)
foreach (var updateArgs in _owner._diagnosticService.GetDiagnosticsUpdatedEventArgs(workspace, project.Id, document.Id, 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); 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()));
} }
} }
} }
......
...@@ -49,8 +49,7 @@ public void ClearDiagnostics(DebuggingSession session, Workspace workspace, obje ...@@ -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) public void ClearDiagnostics(DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId)
{ {
RaiseDiagnosticsUpdated(MakeArgs(session, workspace, errorId, projectId, documentId, ImmutableArray.Create<DiagnosticData>(), RaiseDiagnosticsUpdated(MakeRemovedArgs(session, workspace, errorId, projectId, documentId));
DiagnosticsUpdatedKind.DiagnosticsRemoved));
} }
public ImmutableArray<DocumentId> ReportDiagnostics(DebuggingSession session, object errorId, ProjectId projectId, Solution solution, IEnumerable<Diagnostic> diagnostics) public ImmutableArray<DocumentId> ReportDiagnostics(DebuggingSession session, object errorId, ProjectId projectId, Solution solution, IEnumerable<Diagnostic> diagnostics)
...@@ -61,7 +60,7 @@ public ImmutableArray<DocumentId> ReportDiagnostics(DebuggingSession session, ob ...@@ -61,7 +60,7 @@ public ImmutableArray<DocumentId> ReportDiagnostics(DebuggingSession session, ob
where document != null where document != null
let item = MakeDiagnosticData(projectId, document, solution, diagnostic) let item = MakeDiagnosticData(projectId, document, solution, diagnostic)
group item by document.Id into itemsByDocumentId 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) foreach (var args in argsByDocument)
{ {
...@@ -85,27 +84,34 @@ private static DiagnosticData MakeDiagnosticData(ProjectId projectId, Document d ...@@ -85,27 +84,34 @@ private static DiagnosticData MakeDiagnosticData(ProjectId projectId, Document d
} }
} }
private DiagnosticsUpdatedArgs MakeArgs( private DiagnosticsUpdatedArgs MakeCreatedArgs(
DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> items, DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> items)
DiagnosticsUpdatedKind kind)
{ {
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( private DiagnosticsUpdatedArgs MakeRemovedArgs(
DebuggingSession session, object errorId, Workspace workspace, Solution solution, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> items, DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId)
DiagnosticsUpdatedKind kind)
{ {
return new DiagnosticsUpdatedArgs( return MakeRemovedArgs(session, errorId, workspace, solution: null, projectId: projectId, documentId: documentId);
id: new EnCId(session, errorId),
workspace: workspace,
solution: solution,
projectId: projectId,
documentId: documentId,
diagnostics: items,
kind: kind);
} }
private DiagnosticsUpdatedArgs MakeCreatedArgs(
DebuggingSession session, object errorId, Workspace workspace, Solution solution, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> 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) private void RaiseDiagnosticsUpdated(DiagnosticsUpdatedArgs args)
{ {
var updated = this.DiagnosticsUpdated; var updated = this.DiagnosticsUpdated;
......
...@@ -97,8 +97,7 @@ private static DiagnosticData RaiseDiagnosticEvent(ManualResetEvent set, TestDia ...@@ -97,8 +97,7 @@ private static DiagnosticData RaiseDiagnosticEvent(ManualResetEvent set, TestDia
var diagnostic = CreateDiagnosticData(workspace, project, document); var diagnostic = CreateDiagnosticData(workspace, project, document);
source.RaiseUpdateEvent( source.RaiseUpdateEvent(
new DiagnosticsUpdatedArgs(id, workspace, workspace.CurrentSolution, project, document, ImmutableArray.Create(diagnostic), DiagnosticsUpdatedArgs.DiagnosticsCreated(id, workspace, workspace.CurrentSolution, project, document, ImmutableArray.Create(diagnostic)));
DiagnosticsUpdatedKind.DiagnosticsCreated));
set.WaitOne(); set.WaitOne();
......
...@@ -79,7 +79,7 @@ internal void ReportAnalyzerDiagnostic(DiagnosticAnalyzer analyzer, Diagnostic d ...@@ -79,7 +79,7 @@ internal void ReportAnalyzerDiagnostic(DiagnosticAnalyzer analyzer, Diagnostic d
if (raiseDiagnosticsUpdated) 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 ...@@ -115,37 +115,35 @@ private void ClearAnalyzerDiagnostics(DiagnosticAnalyzer analyzer, ProjectId pro
ImmutableInterlocked.TryUpdate(ref _analyzerHostDiagnosticsMap, analyzer, newDiags, existing)) ImmutableInterlocked.TryUpdate(ref _analyzerHostDiagnosticsMap, analyzer, newDiags, existing))
{ {
var project = this.Workspace.CurrentSolution.GetProject(projectId); var project = this.Workspace.CurrentSolution.GetProject(projectId);
RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet<DiagnosticData>.Empty, project, RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project));
DiagnosticsUpdatedKind.DiagnosticsRemoved));
} }
} }
else if (ImmutableInterlocked.TryRemove(ref _analyzerHostDiagnosticsMap, analyzer, out existing)) else if (ImmutableInterlocked.TryRemove(ref _analyzerHostDiagnosticsMap, analyzer, out existing))
{ {
var project = this.Workspace.CurrentSolution.GetProject(projectId); var project = this.Workspace.CurrentSolution.GetProject(projectId);
RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet<DiagnosticData>.Empty, project, RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project));
DiagnosticsUpdatedKind.DiagnosticsRemoved));
if (existing.Any(d => d.ProjectId == null)) if (existing.Any(d => d.ProjectId == null))
{ {
RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet<DiagnosticData>.Empty, project: null, RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project: null));
kind: DiagnosticsUpdatedKind.DiagnosticsRemoved));
} }
} }
} }
private DiagnosticsUpdatedArgs MakeArgs(DiagnosticAnalyzer analyzer, ImmutableHashSet<DiagnosticData> items, Project project, private DiagnosticsUpdatedArgs MakeCreatedArgs(DiagnosticAnalyzer analyzer, ImmutableHashSet<DiagnosticData> items, Project project)
DiagnosticsUpdatedKind kind)
{ {
return new DiagnosticsUpdatedArgs( return DiagnosticsUpdatedArgs.DiagnosticsCreated(
kind: kind, CreateId(analyzer, project), this.Workspace, project?.Solution, project?.Id, documentId: null, diagnostics: items.ToImmutableArray());
id: new HostArgsId(this, analyzer, project?.Id),
workspace: this.Workspace,
solution: project?.Solution,
projectId: 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<DiagnosticData> TestOnly_GetReportedDiagnostics() internal ImmutableArray<DiagnosticData> TestOnly_GetReportedDiagnostics()
{ {
return _analyzerHostDiagnosticsMap.Values.Flatten().ToImmutableArray(); return _analyzerHostDiagnosticsMap.Values.Flatten().ToImmutableArray();
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
using System; using System;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Diagnostics;
using Microsoft.CodeAnalysis.Common; using Microsoft.CodeAnalysis.Common;
namespace Microsoft.CodeAnalysis.Diagnostics namespace Microsoft.CodeAnalysis.Diagnostics
...@@ -12,7 +13,7 @@ internal class DiagnosticsUpdatedArgs : UpdatedEventArgs ...@@ -12,7 +13,7 @@ internal class DiagnosticsUpdatedArgs : UpdatedEventArgs
public Solution Solution { get; } public Solution Solution { get; }
public ImmutableArray<DiagnosticData> Diagnostics { get; } public ImmutableArray<DiagnosticData> Diagnostics { get; }
public DiagnosticsUpdatedArgs( private DiagnosticsUpdatedArgs(
object id, object id,
Workspace workspace, Workspace workspace,
Solution solution, Solution solution,
...@@ -25,6 +26,32 @@ internal class DiagnosticsUpdatedArgs : UpdatedEventArgs ...@@ -25,6 +26,32 @@ internal class DiagnosticsUpdatedArgs : UpdatedEventArgs
Solution = solution; Solution = solution;
Diagnostics = diagnostics; Diagnostics = diagnostics;
Kind = kind; 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<DiagnosticData> 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<DiagnosticData>.Empty, DiagnosticsUpdatedKind.DiagnosticsCreated);
} }
} }
......
...@@ -156,7 +156,7 @@ private async Task AnalyzeSyntaxAsync(Document document, ImmutableHashSet<string ...@@ -156,7 +156,7 @@ private async Task AnalyzeSyntaxAsync(Document document, ImmutableHashSet<string
var data = await _executor.GetSyntaxAnalysisDataAsync(userDiagnosticDriver, stateSet, versions).ConfigureAwait(false); var data = await _executor.GetSyntaxAnalysisDataAsync(userDiagnosticDriver, stateSet, versions).ConfigureAwait(false);
if (data.FromCache) if (data.FromCache)
{ {
RaiseDiagnosticsUpdated(StateType.Syntax, document.Id, stateSet, new SolutionArgument(document), data.Items, DiagnosticsUpdatedKind.DiagnosticsCreated); RaiseDiagnosticsCreated(StateType.Syntax, document.Id, stateSet, new SolutionArgument(document), data.Items);
continue; continue;
} }
...@@ -244,7 +244,7 @@ private async Task AnalyzeBodyDocumentAsync(Document document, SyntaxNode member ...@@ -244,7 +244,7 @@ private async Task AnalyzeBodyDocumentAsync(Document document, SyntaxNode member
if (data.FromCache) if (data.FromCache)
{ {
RaiseDiagnosticsUpdated(StateType.Document, document.Id, stateSet, new SolutionArgument(document), data.Items, DiagnosticsUpdatedKind.DiagnosticsCreated); RaiseDiagnosticsCreated(StateType.Document, document.Id, stateSet, new SolutionArgument(document), data.Items);
continue; continue;
} }
...@@ -281,7 +281,7 @@ private async Task AnalyzeDocumentAsync(Document document, VersionArgument versi ...@@ -281,7 +281,7 @@ private async Task AnalyzeDocumentAsync(Document document, VersionArgument versi
var data = await _executor.GetDocumentAnalysisDataAsync(userDiagnosticDriver, stateSet, versions).ConfigureAwait(false); var data = await _executor.GetDocumentAnalysisDataAsync(userDiagnosticDriver, stateSet, versions).ConfigureAwait(false);
if (data.FromCache) if (data.FromCache)
{ {
RaiseDiagnosticsUpdated(StateType.Document, document.Id, stateSet, new SolutionArgument(document), data.Items, DiagnosticsUpdatedKind.DiagnosticsCreated); RaiseDiagnosticsCreated(StateType.Document, document.Id, stateSet, new SolutionArgument(document), data.Items);
continue; continue;
} }
...@@ -434,8 +434,7 @@ public override void RemoveDocument(DocumentId documentId) ...@@ -434,8 +434,7 @@ public override void RemoveDocument(DocumentId documentId)
var solutionArgs = new SolutionArgument(null, documentId.ProjectId, documentId); var solutionArgs = new SolutionArgument(null, documentId.ProjectId, documentId);
for (var stateType = 0; stateType < s_stateTypeCount; stateType++) for (var stateType = 0; stateType < s_stateTypeCount; stateType++)
{ {
RaiseDiagnosticsUpdated((StateType)stateType, documentId, stateSet, solutionArgs, ImmutableArray<DiagnosticData>.Empty, RaiseDiagnosticsRemoved((StateType)stateType, documentId, stateSet, solutionArgs);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
} }
} }
...@@ -450,8 +449,7 @@ public override void RemoveProject(ProjectId projectId) ...@@ -450,8 +449,7 @@ public override void RemoveProject(ProjectId projectId)
stateSet.Remove(projectId); stateSet.Remove(projectId);
var solutionArgs = new SolutionArgument(null, projectId, null); var solutionArgs = new SolutionArgument(null, projectId, null);
RaiseDiagnosticsUpdated(StateType.Project, projectId, stateSet, solutionArgs, ImmutableArray<DiagnosticData>.Empty, RaiseDiagnosticsRemoved(StateType.Project, projectId, stateSet, solutionArgs);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
} }
...@@ -603,8 +601,7 @@ private static bool CheckSemanticVersions(Project project, AnalysisData existing ...@@ -603,8 +601,7 @@ private static bool CheckSemanticVersions(Project project, AnalysisData existing
return; return;
} }
RaiseDiagnosticsUpdated(type, document.Id, stateSet, new SolutionArgument(document), newItems, RaiseDiagnosticsCreated(type, document.Id, stateSet, new SolutionArgument(document), newItems);
DiagnosticsUpdatedKind.DiagnosticsCreated);
} }
private void RaiseProjectDiagnosticsUpdatedIfNeeded( private void RaiseProjectDiagnosticsUpdatedIfNeeded(
...@@ -633,15 +630,13 @@ private static bool CheckSemanticVersions(Project project, AnalysisData existing ...@@ -633,15 +630,13 @@ private static bool CheckSemanticVersions(Project project, AnalysisData existing
{ {
if (documentId == null) if (documentId == null)
{ {
RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), ImmutableArray<DiagnosticData>.Empty, RaiseDiagnosticsRemoved(StateType.Project, project.Id, stateSet, new SolutionArgument(project));
DiagnosticsUpdatedKind.DiagnosticsRemoved);
continue; continue;
} }
var document = project.GetDocument(documentId); var document = project.GetDocument(documentId);
var argument = documentId == null ? new SolutionArgument(null, documentId.ProjectId, documentId) : new SolutionArgument(document); var argument = documentId == null ? new SolutionArgument(null, documentId.ProjectId, documentId) : new SolutionArgument(document);
RaiseDiagnosticsUpdated(StateType.Project, documentId, stateSet, argument, ImmutableArray<DiagnosticData>.Empty, RaiseDiagnosticsRemoved(StateType.Project, documentId, stateSet, argument);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
} }
...@@ -652,13 +647,11 @@ private void RaiseProjectDiagnosticsUpdated(Project project, StateSet stateSet, ...@@ -652,13 +647,11 @@ private void RaiseProjectDiagnosticsUpdated(Project project, StateSet stateSet,
{ {
if (kv.Key == null) if (kv.Key == null)
{ {
RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), kv.ToImmutableArrayOrEmpty(), RaiseDiagnosticsCreated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), kv.ToImmutableArrayOrEmpty());
DiagnosticsUpdatedKind.DiagnosticsCreated);
continue; continue;
} }
RaiseDiagnosticsUpdated(StateType.Project, kv.Key, stateSet, new SolutionArgument(project.GetDocument(kv.Key)), kv.ToImmutableArrayOrEmpty(), RaiseDiagnosticsCreated(StateType.Project, kv.Key, stateSet, new SolutionArgument(project.GetDocument(kv.Key)), kv.ToImmutableArrayOrEmpty());
DiagnosticsUpdatedKind.DiagnosticsCreated);
} }
} }
...@@ -667,9 +660,8 @@ private static ImmutableArray<DiagnosticData> GetDiagnosticData(ILookup<Document ...@@ -667,9 +660,8 @@ private static ImmutableArray<DiagnosticData> GetDiagnosticData(ILookup<Document
return lookup.Contains(documentId) ? lookup[documentId].ToImmutableArrayOrEmpty() : ImmutableArray<DiagnosticData>.Empty; return lookup.Contains(documentId) ? lookup[documentId].ToImmutableArrayOrEmpty() : ImmutableArray<DiagnosticData>.Empty;
} }
private void RaiseDiagnosticsUpdated( private void RaiseDiagnosticsCreated(
StateType type, object key, StateSet stateSet, SolutionArgument solution, ImmutableArray<DiagnosticData> diagnostics, StateType type, object key, StateSet stateSet, SolutionArgument solution, ImmutableArray<DiagnosticData> diagnostics)
DiagnosticsUpdatedKind kind)
{ {
if (Owner == null) if (Owner == null)
{ {
...@@ -677,11 +669,32 @@ private static ImmutableArray<DiagnosticData> GetDiagnosticData(ILookup<Document ...@@ -677,11 +669,32 @@ private static ImmutableArray<DiagnosticData> GetDiagnosticData(ILookup<Document
} }
// get right arg id for the given analyzer // get right arg id for the given analyzer
var id = stateSet.ErrorSourceName != null ? var id = CreateArgumentKey(type, key, stateSet);
new HostAnalyzerKey(stateSet.Analyzer, type, key, stateSet.ErrorSourceName) : (object)new ArgumentKey(stateSet.Analyzer, type, key);
Owner.RaiseDiagnosticsUpdated(this, Owner.RaiseDiagnosticsUpdated(this,
new DiagnosticsUpdatedArgs(id, Workspace, solution.Solution, solution.ProjectId, solution.DocumentId, diagnostics, kind)); DiagnosticsUpdatedArgs.DiagnosticsCreated(id, Workspace, solution.Solution, solution.ProjectId, solution.DocumentId, diagnostics));
}
private static ArgumentKey CreateArgumentKey(StateType type, object key, StateSet stateSet)
{
return stateSet.ErrorSourceName != null
? new HostAnalyzerKey(stateSet.Analyzer, type, key, stateSet.ErrorSourceName)
: new ArgumentKey(stateSet.Analyzer, type, key);
}
private void RaiseDiagnosticsRemoved(
StateType type, object key, StateSet stateSet, SolutionArgument solution)
{
if (Owner == null)
{
return;
}
// get right arg id for the given analyzer
var id = CreateArgumentKey(type, key, stateSet);
Owner.RaiseDiagnosticsUpdated(this,
DiagnosticsUpdatedArgs.DiagnosticsRemoved(id, Workspace, solution.Solution, solution.ProjectId, solution.DocumentId));
} }
private ImmutableArray<DiagnosticData> UpdateDocumentDiagnostics( private ImmutableArray<DiagnosticData> UpdateDocumentDiagnostics(
...@@ -928,8 +941,7 @@ private void ClearDocumentState(Document document, StateSet stateSet, StateType ...@@ -928,8 +941,7 @@ private void ClearDocumentState(Document document, StateSet stateSet, StateType
var documentId = document.Id; var documentId = document.Id;
var solutionArgs = new SolutionArgument(document); var solutionArgs = new SolutionArgument(document);
RaiseDiagnosticsUpdated(type, document.Id, stateSet, solutionArgs, ImmutableArray<DiagnosticData>.Empty, RaiseDiagnosticsRemoved(type, document.Id, stateSet, solutionArgs);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
} }
...@@ -956,8 +968,7 @@ private void ClearProjectState(Project project, StateSet stateSet) ...@@ -956,8 +968,7 @@ private void ClearProjectState(Project project, StateSet stateSet)
// raise diagnostic updated event // raise diagnostic updated event
var solutionArgs = new SolutionArgument(project); var solutionArgs = new SolutionArgument(project);
RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, solutionArgs, ImmutableArray<DiagnosticData>.Empty, RaiseDiagnosticsRemoved(StateType.Project, project.Id, stateSet, solutionArgs);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
private async Task ClearExistingDiagnostics(Document document, StateSet stateSet, StateType type, CancellationToken cancellationToken) private async Task ClearExistingDiagnostics(Document document, StateSet stateSet, StateType type, CancellationToken cancellationToken)
......
...@@ -39,8 +39,7 @@ public override async Task SynchronizeWithBuildAsync(Project project, ImmutableA ...@@ -39,8 +39,7 @@ public override async Task SynchronizeWithBuildAsync(Project project, ImmutableA
var mergedDiagnostics = MergeDiagnostics(liveDiagnostics, GetExistingDiagnostics(existingDiagnostics)); var mergedDiagnostics = MergeDiagnostics(liveDiagnostics, GetExistingDiagnostics(existingDiagnostics));
await state.PersistAsync(project, new AnalysisData(projectTextVersion, semanticVersion, mergedDiagnostics), CancellationToken.None).ConfigureAwait(false); await state.PersistAsync(project, new AnalysisData(projectTextVersion, semanticVersion, mergedDiagnostics), CancellationToken.None).ConfigureAwait(false);
RaiseDiagnosticsUpdated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), mergedDiagnostics, RaiseDiagnosticsCreated(StateType.Project, project.Id, stateSet, new SolutionArgument(project), mergedDiagnostics);
DiagnosticsUpdatedKind.DiagnosticsCreated);
} }
} }
} }
...@@ -106,8 +105,7 @@ private bool PreferLiveErrorsOnOpenedFiles(Workspace workspace) ...@@ -106,8 +105,7 @@ private bool PreferLiveErrorsOnOpenedFiles(Workspace workspace)
var mergedDiagnostics = MergeDiagnostics(diagnostics, GetExistingDiagnostics(existingDiagnostics)); var mergedDiagnostics = MergeDiagnostics(diagnostics, GetExistingDiagnostics(existingDiagnostics));
await state.PersistAsync(document, new AnalysisData(textVersion, semanticVersion, mergedDiagnostics), CancellationToken.None).ConfigureAwait(false); await state.PersistAsync(document, new AnalysisData(textVersion, semanticVersion, mergedDiagnostics), CancellationToken.None).ConfigureAwait(false);
RaiseDiagnosticsUpdated(stateType, document.Id, stateSet, new SolutionArgument(document), mergedDiagnostics, RaiseDiagnosticsCreated(stateType, document.Id, stateSet, new SolutionArgument(document), mergedDiagnostics);
DiagnosticsUpdatedKind.DiagnosticsCreated);
} }
private static ImmutableArray<DiagnosticData> GetExistingDiagnostics(AnalysisData analysisData) private static ImmutableArray<DiagnosticData> GetExistingDiagnostics(AnalysisData analysisData)
......
...@@ -61,18 +61,14 @@ public override Task NewSolutionSnapshotAsync(Solution solution, CancellationTok ...@@ -61,18 +61,14 @@ public override Task NewSolutionSnapshotAsync(Solution solution, CancellationTok
public override void RemoveDocument(DocumentId documentId) public override void RemoveDocument(DocumentId documentId)
{ {
Owner.RaiseDiagnosticsUpdated( Owner.RaiseDiagnosticsUpdated(this, DiagnosticsUpdatedArgs.DiagnosticsRemoved(
this, new DiagnosticsUpdatedArgs( ValueTuple.Create(this, documentId), Workspace, null, null, null));
ValueTuple.Create(this, documentId), Workspace, null, null, null, ImmutableArray<DiagnosticData>.Empty,
DiagnosticsUpdatedKind.DiagnosticsRemoved));
} }
public override void RemoveProject(ProjectId projectId) public override void RemoveProject(ProjectId projectId)
{ {
Owner.RaiseDiagnosticsUpdated( Owner.RaiseDiagnosticsUpdated(this, DiagnosticsUpdatedArgs.DiagnosticsRemoved(
this, new DiagnosticsUpdatedArgs( ValueTuple.Create(this, projectId), Workspace, null, null, null));
ValueTuple.Create(this, projectId), Workspace, null, null, null, ImmutableArray<DiagnosticData>.Empty,
DiagnosticsUpdatedKind.DiagnosticsRemoved));
} }
#endregion #endregion
...@@ -218,16 +214,14 @@ private void RaiseEvents(Project project, ImmutableArray<DiagnosticData> diagnos ...@@ -218,16 +214,14 @@ private void RaiseEvents(Project project, ImmutableArray<DiagnosticData> diagnos
if (kv.Key == null) if (kv.Key == null)
{ {
Owner.RaiseDiagnosticsUpdated( Owner.RaiseDiagnosticsUpdated(
this, new DiagnosticsUpdatedArgs( this, DiagnosticsUpdatedArgs.DiagnosticsCreated(
ValueTuple.Create(this, project.Id), workspace, solution, project.Id, null, kv.ToImmutableArrayOrEmpty(), ValueTuple.Create(this, project.Id), workspace, solution, project.Id, null, kv.ToImmutableArrayOrEmpty()));
kind: DiagnosticsUpdatedKind.DiagnosticsCreated));
continue; continue;
} }
Owner.RaiseDiagnosticsUpdated( Owner.RaiseDiagnosticsUpdated(
this, new DiagnosticsUpdatedArgs( this, DiagnosticsUpdatedArgs.DiagnosticsCreated(
ValueTuple.Create(this, kv.Key), workspace, solution, project.Id, kv.Key, kv.ToImmutableArrayOrEmpty(), ValueTuple.Create(this, kv.Key), workspace, solution, project.Id, kv.Key, kv.ToImmutableArrayOrEmpty()));
kind: DiagnosticsUpdatedKind.DiagnosticsCreated));
} }
} }
} }
......
...@@ -530,14 +530,13 @@ public void OnAnalyzerLoadFailed(object sender, AnalyzerLoadFailureEventArgs e) ...@@ -530,14 +530,13 @@ public void OnAnalyzerLoadFailed(object sender, AnalyzerLoadFailureEventArgs e)
var diagnostic = AnalyzerHelper.CreateAnalyzerLoadFailureDiagnostic(reference.FullPath, e); var diagnostic = AnalyzerHelper.CreateAnalyzerLoadFailureDiagnostic(reference.FullPath, e);
// diagnostic from host analyzer can never go away // 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), id: Tuple.Create(this, reference.FullPath, e.ErrorCode, e.TypeName),
workspace: PrimaryWorkspace.Workspace, workspace: PrimaryWorkspace.Workspace,
solution: null, solution: null,
projectId: null, projectId: null,
documentId: null, documentId: null,
diagnostics: ImmutableArray.Create<DiagnosticData>(diagnostic), diagnostics: ImmutableArray.Create<DiagnosticData>(diagnostic));
kind: DiagnosticsUpdatedKind.DiagnosticsCreated);
_hostUpdateSource.RaiseDiagnosticsUpdated(args); _hostUpdateSource.RaiseDiagnosticsUpdated(args);
} }
......
...@@ -92,9 +92,8 @@ public async Task AnalyzeSyntaxAsync(Document document, CancellationToken cancel ...@@ -92,9 +92,8 @@ public async Task AnalyzeSyntaxAsync(Document document, CancellationToken cancel
var diagnosticData = diagnostics == null ? ImmutableArray<DiagnosticData>.Empty : diagnostics.Select(d => DiagnosticData.Create(document, d)).ToImmutableArrayOrEmpty(); var diagnosticData = diagnostics == null ? ImmutableArray<DiagnosticData>.Empty : diagnostics.Select(d => DiagnosticData.Create(document, d)).ToImmutableArrayOrEmpty();
_service.RaiseDiagnosticsUpdated( _service.RaiseDiagnosticsUpdated(
new DiagnosticsUpdatedArgs(new MiscUpdateArgsId(document.Id), DiagnosticsUpdatedArgs.DiagnosticsCreated(new MiscUpdateArgsId(document.Id),
_workspace, document.Project.Solution, document.Project.Id, document.Id, diagnosticData, _workspace, document.Project.Solution, document.Project.Id, document.Id, diagnosticData));
DiagnosticsUpdatedKind.DiagnosticsCreated));
} }
public void RemoveDocument(DocumentId documentId) public void RemoveDocument(DocumentId documentId)
...@@ -121,8 +120,8 @@ public Task DocumentCloseAsync(Document document, CancellationToken cancellation ...@@ -121,8 +120,8 @@ public Task DocumentCloseAsync(Document document, CancellationToken cancellation
private void RaiseEmptyDiagnosticUpdated(DocumentId documentId) private void RaiseEmptyDiagnosticUpdated(DocumentId documentId)
{ {
_service.RaiseDiagnosticsUpdated(new DiagnosticsUpdatedArgs(ValueTuple.Create(this, documentId), _workspace, null, documentId.ProjectId, documentId, ImmutableArray<DiagnosticData>.Empty, _service.RaiseDiagnosticsUpdated(DiagnosticsUpdatedArgs.DiagnosticsRemoved(
DiagnosticsUpdatedKind.DiagnosticsRemoved)); ValueTuple.Create(this, documentId), _workspace, null, documentId.ProjectId, documentId));
} }
// method we don't care. misc project only supports syntax errors // method we don't care. misc project only supports syntax errors
......
...@@ -282,13 +282,13 @@ private void ReportBuildErrors<T>(T item, ImmutableArray<DiagnosticData> buildEr ...@@ -282,13 +282,13 @@ private void ReportBuildErrors<T>(T item, ImmutableArray<DiagnosticData> buildEr
var project = item as Project; var project = item as Project;
if (project != null) if (project != null)
{ {
RaiseDiagnosticsUpdated(project.Id, project.Id, null, buildErrors, DiagnosticsUpdatedKind.DiagnosticsCreated); RaiseDiagnosticsCreated(project.Id, project.Id, null, buildErrors);
return; return;
} }
// must be not null // must be not null
var document = item as Document; 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<ProjectId, HashSet<string>> GetSupportedLiveDiagnosticId(Solution solution, InprogressState state) private Dictionary<ProjectId, HashSet<string>> GetSupportedLiveDiagnosticId(Solution solution, InprogressState state)
...@@ -308,7 +308,7 @@ private void ReportBuildErrors<T>(T item, ImmutableArray<DiagnosticData> buildEr ...@@ -308,7 +308,7 @@ private void ReportBuildErrors<T>(T item, ImmutableArray<DiagnosticData> buildEr
private void ClearProjectErrors(ProjectId projectId, Solution solution = null) private void ClearProjectErrors(ProjectId projectId, Solution solution = null)
{ {
// remove all project errors // remove all project errors
RaiseDiagnosticsUpdated(projectId, projectId, null, ImmutableArray<DiagnosticData>.Empty, DiagnosticsUpdatedKind.DiagnosticsRemoved); RaiseDiagnosticsRemoved(projectId, projectId, documentId: null);
var project = (solution ?? _workspace.CurrentSolution).GetProject(projectId); var project = (solution ?? _workspace.CurrentSolution).GetProject(projectId);
if (project == null) if (project == null)
...@@ -325,7 +325,7 @@ private void ClearProjectErrors(ProjectId projectId, Solution solution = null) ...@@ -325,7 +325,7 @@ private void ClearProjectErrors(ProjectId projectId, Solution solution = null)
private void ClearDocumentErrors(ProjectId projectId, DocumentId documentId) private void ClearDocumentErrors(ProjectId projectId, DocumentId documentId)
{ {
RaiseDiagnosticsUpdated(documentId, projectId, documentId, ImmutableArray<DiagnosticData>.Empty, DiagnosticsUpdatedKind.DiagnosticsRemoved); RaiseDiagnosticsRemoved(documentId, projectId, documentId);
} }
public void AddNewErrors(DocumentId documentId, DiagnosticData diagnostic) public void AddNewErrors(DocumentId documentId, DiagnosticData diagnostic)
...@@ -363,13 +363,20 @@ private InprogressState GetOrCreateInprogressState() ...@@ -363,13 +363,20 @@ private InprogressState GetOrCreateInprogressState()
return _state; return _state;
} }
private void RaiseDiagnosticsUpdated(object id, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> items, private void RaiseDiagnosticsCreated(object id, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> items)
DiagnosticsUpdatedKind kind)
{ {
DiagnosticsUpdated?.Invoke(this, new DiagnosticsUpdatedArgs( DiagnosticsUpdated?.Invoke(this, DiagnosticsUpdatedArgs.DiagnosticsCreated(
new ArgumentKey(id), _workspace, _workspace.CurrentSolution, projectId, documentId, items, kind)); 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) private void RaiseBuildStarted(bool started)
{ {
BuildStarted?.Invoke(this, started); BuildStarted?.Invoke(this, started);
......
...@@ -37,21 +37,33 @@ internal override Workspace Workspace ...@@ -37,21 +37,33 @@ internal override Workspace Workspace
} }
} }
private void RaiseDiagnosticsUpdatedForProject(ProjectId projectId, object key, IEnumerable<DiagnosticData> items, private void RaiseDiagnosticsCreatedForProject(ProjectId projectId, object key, IEnumerable<DiagnosticData> items)
DiagnosticsUpdatedKind kind)
{ {
var args = new DiagnosticsUpdatedArgs( var args = DiagnosticsUpdatedArgs.DiagnosticsCreated(
id: Tuple.Create(this, projectId, key), CreateId(projectId, key),
workspace: _workspace, _workspace,
solution: null, solution: null,
projectId: projectId, projectId: projectId,
documentId: null, documentId: null,
diagnostics: items.AsImmutableOrEmpty(), diagnostics: items.AsImmutableOrEmpty());
kind: kind);
RaiseDiagnosticsUpdated(args); 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<DiagnosticData> items) public void UpdateDiagnosticsForProject(ProjectId projectId, object key, IEnumerable<DiagnosticData> items)
{ {
Contract.ThrowIfNull(projectId); Contract.ThrowIfNull(projectId);
...@@ -63,7 +75,7 @@ public void UpdateDiagnosticsForProject(ProjectId projectId, object key, IEnumer ...@@ -63,7 +75,7 @@ public void UpdateDiagnosticsForProject(ProjectId projectId, object key, IEnumer
_diagnosticMap.GetOrAdd(projectId, id => new HashSet<object>()).Add(key); _diagnosticMap.GetOrAdd(projectId, id => new HashSet<object>()).Add(key);
} }
RaiseDiagnosticsUpdatedForProject(projectId, key, items, DiagnosticsUpdatedKind.DiagnosticsCreated); RaiseDiagnosticsCreatedForProject(projectId, key, items);
} }
public void ClearAllDiagnosticsForProject(ProjectId projectId) public void ClearAllDiagnosticsForProject(ProjectId projectId)
...@@ -83,8 +95,7 @@ public void ClearAllDiagnosticsForProject(ProjectId projectId) ...@@ -83,8 +95,7 @@ public void ClearAllDiagnosticsForProject(ProjectId projectId)
{ {
foreach (var key in projectDiagnosticKeys) foreach (var key in projectDiagnosticKeys)
{ {
RaiseDiagnosticsUpdatedForProject(projectId, key, SpecializedCollections.EmptyEnumerable<DiagnosticData>(), RaiseDiagnosticsRemovedForProject(projectId, key);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
} }
} }
...@@ -106,8 +117,7 @@ public void ClearDiagnosticsForProject(ProjectId projectId, object key) ...@@ -106,8 +117,7 @@ public void ClearDiagnosticsForProject(ProjectId projectId, object key)
if (raiseEvent) if (raiseEvent)
{ {
RaiseDiagnosticsUpdatedForProject(projectId, key, SpecializedCollections.EmptyEnumerable<DiagnosticData>(), RaiseDiagnosticsRemovedForProject(projectId, key);
DiagnosticsUpdatedKind.DiagnosticsRemoved);
} }
} }
} }
......
...@@ -737,33 +737,29 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.Diagnostics ...@@ -737,33 +737,29 @@ Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.Diagnostics
Dim item = items(0) Dim item = items(0)
Dim id = If(CObj(item.DocumentId), item.ProjectId) Dim id = If(CObj(item.DocumentId), item.ProjectId)
RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsCreated(
New ErrorId(Me, id), workspace, workspace.CurrentSolution, item.ProjectId, item.DocumentId, items.ToImmutableArray(), New ErrorId(Me, id), workspace, workspace.CurrentSolution, item.ProjectId, item.DocumentId, items.ToImmutableArray()))
DiagnosticsUpdatedKind.DiagnosticsCreated))
End Sub End Sub
Public Sub RaiseDiagnosticsUpdated(workspace As Workspace) 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) 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 For Each group In documentMap
RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsCreated(
New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key.ProjectId, group.Key, group.ToImmutableArrayOrEmpty(), New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key.ProjectId, group.Key, group.ToImmutableArrayOrEmpty()))
DiagnosticsUpdatedKind.DiagnosticsCreated))
Next Next
Dim projectMap = Items.Where(Function(t) t.DocumentId Is Nothing).Where(Function(t) t.Workspace Is workspace).ToLookup(Function(t) t.ProjectId) 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 For Each group In projectMap
RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsCreated(
New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key, Nothing, group.ToImmutableArrayOrEmpty(), New ErrorId(Me, group.Key), workspace, workspace.CurrentSolution, group.Key, Nothing, group.ToImmutableArrayOrEmpty()))
DiagnosticsUpdatedKind.DiagnosticsCreated))
Next Next
End Sub End Sub
Public Sub RaiseClearDiagnosticsUpdated(workspace As Workspace, projectId As ProjectId, documentId As DocumentId) Public Sub RaiseClearDiagnosticsUpdated(workspace As Workspace, projectId As ProjectId, documentId As DocumentId)
RaiseEvent DiagnosticsUpdated(Me, New DiagnosticsUpdatedArgs( RaiseEvent DiagnosticsUpdated(Me, DiagnosticsUpdatedArgs.DiagnosticsRemoved(
New ErrorId(Me, documentId), workspace, workspace.CurrentSolution, projectId, documentId, ImmutableArray(Of DiagnosticData).Empty, New ErrorId(Me, documentId), workspace, workspace.CurrentSolution, projectId, documentId))
DiagnosticsUpdatedKind.DiagnosticsRemoved))
End Sub End Sub
Private Class ErrorId Private Class ErrorId
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册