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

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

上级 2971c626
......@@ -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);
......
......@@ -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()));
}
}
}
......
......@@ -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<DiagnosticData>(),
DiagnosticsUpdatedKind.DiagnosticsRemoved));
RaiseDiagnosticsUpdated(MakeRemovedArgs(session, workspace, errorId, projectId, documentId));
}
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
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<DiagnosticData> items,
DiagnosticsUpdatedKind kind)
private DiagnosticsUpdatedArgs MakeCreatedArgs(
DebuggingSession session, Workspace workspace, object errorId, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> 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<DiagnosticData> 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<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)
{
var updated = this.DiagnosticsUpdated;
......
......@@ -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();
......
......@@ -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<DiagnosticData>.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<DiagnosticData>.Empty, project,
DiagnosticsUpdatedKind.DiagnosticsRemoved));
RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project));
if (existing.Any(d => d.ProjectId == null))
{
RaiseDiagnosticsUpdated(MakeArgs(analyzer, ImmutableHashSet<DiagnosticData>.Empty, project: null,
kind: DiagnosticsUpdatedKind.DiagnosticsRemoved));
RaiseDiagnosticsUpdated(MakeRemovedArgs(analyzer, project: null));
}
}
}
private DiagnosticsUpdatedArgs MakeArgs(DiagnosticAnalyzer analyzer, ImmutableHashSet<DiagnosticData> items, Project project,
DiagnosticsUpdatedKind kind)
private DiagnosticsUpdatedArgs MakeCreatedArgs(DiagnosticAnalyzer analyzer, ImmutableHashSet<DiagnosticData> 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<DiagnosticData> TestOnly_GetReportedDiagnostics()
{
return _analyzerHostDiagnosticsMap.Values.Flatten().ToImmutableArray();
......
......@@ -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<DiagnosticData> 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<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
var data = await _executor.GetSyntaxAnalysisDataAsync(userDiagnosticDriver, stateSet, versions).ConfigureAwait(false);
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;
}
......@@ -244,7 +244,7 @@ private async Task AnalyzeBodyDocumentAsync(Document document, SyntaxNode member
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;
}
......@@ -281,7 +281,7 @@ private async Task AnalyzeDocumentAsync(Document document, VersionArgument versi
var data = await _executor.GetDocumentAnalysisDataAsync(userDiagnosticDriver, stateSet, versions).ConfigureAwait(false);
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;
}
......@@ -434,8 +434,7 @@ public override void RemoveDocument(DocumentId documentId)
var solutionArgs = new SolutionArgument(null, documentId.ProjectId, documentId);
for (var stateType = 0; stateType < s_stateTypeCount; stateType++)
{
RaiseDiagnosticsUpdated((StateType)stateType, documentId, stateSet, solutionArgs, ImmutableArray<DiagnosticData>.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<DiagnosticData>.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<DiagnosticData>.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<DiagnosticData>.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<DiagnosticData> GetDiagnosticData(ILookup<Document
return lookup.Contains(documentId) ? lookup[documentId].ToImmutableArrayOrEmpty() : ImmutableArray<DiagnosticData>.Empty;
}
private void RaiseDiagnosticsUpdated(
StateType type, object key, StateSet stateSet, SolutionArgument solution, ImmutableArray<DiagnosticData> diagnostics,
DiagnosticsUpdatedKind kind)
private void RaiseDiagnosticsCreated(
StateType type, object key, StateSet stateSet, SolutionArgument solution, ImmutableArray<DiagnosticData> diagnostics)
{
if (Owner == null)
{
......@@ -677,11 +669,32 @@ private static ImmutableArray<DiagnosticData> GetDiagnosticData(ILookup<Document
}
// get right arg id for the given analyzer
var id = stateSet.ErrorSourceName != null ?
new HostAnalyzerKey(stateSet.Analyzer, type, key, stateSet.ErrorSourceName) : (object)new ArgumentKey(stateSet.Analyzer, type, key);
var id = CreateArgumentKey(type, key, stateSet);
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(
......@@ -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<DiagnosticData>.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<DiagnosticData>.Empty,
DiagnosticsUpdatedKind.DiagnosticsRemoved);
RaiseDiagnosticsRemoved(StateType.Project, project.Id, stateSet, solutionArgs);
}
private async Task ClearExistingDiagnostics(Document document, StateSet stateSet, StateType type, CancellationToken cancellationToken)
......
......@@ -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<DiagnosticData> GetExistingDiagnostics(AnalysisData analysisData)
......
......@@ -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<DiagnosticData>.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<DiagnosticData>.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<DiagnosticData> 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()));
}
}
}
......
......@@ -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<DiagnosticData>(diagnostic),
kind: DiagnosticsUpdatedKind.DiagnosticsCreated);
diagnostics: ImmutableArray.Create<DiagnosticData>(diagnostic));
_hostUpdateSource.RaiseDiagnosticsUpdated(args);
}
......
......@@ -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();
_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<DiagnosticData>.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
......
......@@ -282,13 +282,13 @@ private void ReportBuildErrors<T>(T item, ImmutableArray<DiagnosticData> 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<ProjectId, HashSet<string>> GetSupportedLiveDiagnosticId(Solution solution, InprogressState state)
......@@ -308,7 +308,7 @@ private void ReportBuildErrors<T>(T item, ImmutableArray<DiagnosticData> buildEr
private void ClearProjectErrors(ProjectId projectId, Solution solution = null)
{
// 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);
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<DiagnosticData>.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<DiagnosticData> items,
DiagnosticsUpdatedKind kind)
private void RaiseDiagnosticsCreated(object id, ProjectId projectId, DocumentId documentId, ImmutableArray<DiagnosticData> 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);
......
......@@ -37,21 +37,33 @@ internal override Workspace Workspace
}
}
private void RaiseDiagnosticsUpdatedForProject(ProjectId projectId, object key, IEnumerable<DiagnosticData> items,
DiagnosticsUpdatedKind kind)
private void RaiseDiagnosticsCreatedForProject(ProjectId projectId, object key, IEnumerable<DiagnosticData> 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<DiagnosticData> items)
{
Contract.ThrowIfNull(projectId);
......@@ -63,7 +75,7 @@ public void UpdateDiagnosticsForProject(ProjectId projectId, object key, IEnumer
_diagnosticMap.GetOrAdd(projectId, id => new HashSet<object>()).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<DiagnosticData>(),
DiagnosticsUpdatedKind.DiagnosticsRemoved);
RaiseDiagnosticsRemovedForProject(projectId, key);
}
}
}
......@@ -106,8 +117,7 @@ public void ClearDiagnosticsForProject(ProjectId projectId, object key)
if (raiseEvent)
{
RaiseDiagnosticsUpdatedForProject(projectId, key, SpecializedCollections.EmptyEnumerable<DiagnosticData>(),
DiagnosticsUpdatedKind.DiagnosticsRemoved);
RaiseDiagnosticsRemovedForProject(projectId, key);
}
}
}
......
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册