提交 4af2693b 编写于 作者: T Tomáš Matoušek

Add exception filters to incremental analyzer (#11783)

上级 87a01262
...@@ -146,6 +146,8 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu ...@@ -146,6 +146,8 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu
/// </summary> /// </summary>
public async Task<ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>> ComputeDiagnosticsAsync( public async Task<ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>> ComputeDiagnosticsAsync(
CompilationWithAnalyzers analyzerDriverOpt, Project project, IEnumerable<StateSet> stateSets, CancellationToken cancellationToken) CompilationWithAnalyzers analyzerDriverOpt, Project project, IEnumerable<StateSet> stateSets, CancellationToken cancellationToken)
{
try
{ {
var result = ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>.Empty; var result = ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>.Empty;
...@@ -163,10 +165,17 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu ...@@ -163,10 +165,17 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu
// check whether there is IDE specific project diagnostic analyzer // check whether there is IDE specific project diagnostic analyzer
return await MergeProjectDiagnosticAnalyzerDiagnosticsAsync(project, stateSets, analyzerDriverOpt?.Compilation, result, cancellationToken).ConfigureAwait(false); return await MergeProjectDiagnosticAnalyzerDiagnosticsAsync(project, stateSets, analyzerDriverOpt?.Compilation, result, cancellationToken).ConfigureAwait(false);
} }
catch (Exception e) when (FatalError.ReportUnlessCanceled(e))
{
throw ExceptionUtilities.Unreachable;
}
}
private async Task<ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>> ComputeDiagnosticsAsync( private async Task<ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>> ComputeDiagnosticsAsync(
CompilationWithAnalyzers analyzerDriverOpt, Project project, IEnumerable<StateSet> stateSets, CompilationWithAnalyzers analyzerDriverOpt, Project project, IEnumerable<StateSet> stateSets,
ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> existing, CancellationToken cancellationToken) ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> existing, CancellationToken cancellationToken)
{
try
{ {
// PERF: check whether we can reduce number of analyzers we need to run. // PERF: check whether we can reduce number of analyzers we need to run.
// this can happen since caller could have created the driver with different set of analyzers that are different // this can happen since caller could have created the driver with different set of analyzers that are different
...@@ -186,6 +195,11 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu ...@@ -186,6 +195,11 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu
// we couldn't reduce the set. // we couldn't reduce the set.
return await ComputeDiagnosticsAsync(analyzerDriverOpt, project, stateSets, cancellationToken).ConfigureAwait(false); return await ComputeDiagnosticsAsync(analyzerDriverOpt, project, stateSets, cancellationToken).ConfigureAwait(false);
} }
catch (Exception e) when (FatalError.ReportUnlessCanceled(e))
{
throw ExceptionUtilities.Unreachable;
}
}
private ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> MergeExistingDiagnostics( private ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> MergeExistingDiagnostics(
VersionStamp version, ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> existing, ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> result) VersionStamp version, ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> existing, ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> result)
...@@ -253,6 +267,8 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu ...@@ -253,6 +267,8 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu
private async Task<ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>> MergeProjectDiagnosticAnalyzerDiagnosticsAsync( private async Task<ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult>> MergeProjectDiagnosticAnalyzerDiagnosticsAsync(
Project project, IEnumerable<StateSet> stateSets, Compilation compilationOpt, ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> result, CancellationToken cancellationToken) Project project, IEnumerable<StateSet> stateSets, Compilation compilationOpt, ImmutableDictionary<DiagnosticAnalyzer, AnalysisResult> result, CancellationToken cancellationToken)
{
try
{ {
// check whether there is IDE specific project diagnostic analyzer // check whether there is IDE specific project diagnostic analyzer
var ideAnalyzers = stateSets.Select(s => s.Analyzer).Where(a => a is ProjectDiagnosticAnalyzer || a is DocumentDiagnosticAnalyzer).ToImmutableArrayOrEmpty(); var ideAnalyzers = stateSets.Select(s => s.Analyzer).Where(a => a is ProjectDiagnosticAnalyzer || a is DocumentDiagnosticAnalyzer).ToImmutableArrayOrEmpty();
...@@ -298,6 +314,11 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu ...@@ -298,6 +314,11 @@ public IEnumerable<DiagnosticData> ConvertToLocalDiagnostics(Document targetDocu
return result; return result;
} }
catch (Exception e) when (FatalError.ReportUnlessCanceled(e))
{
throw ExceptionUtilities.Unreachable;
}
}
private async Task<IEnumerable<Diagnostic>> ComputeProjectDiagnosticAnalyzerDiagnosticsAsync( private async Task<IEnumerable<Diagnostic>> ComputeProjectDiagnosticAnalyzerDiagnosticsAsync(
Project project, ProjectDiagnosticAnalyzer analyzer, Compilation compilationOpt, CancellationToken cancellationToken) Project project, ProjectDiagnosticAnalyzer analyzer, Compilation compilationOpt, CancellationToken cancellationToken)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册