Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
ab2b2de
remove CompilationPair to see waht breas
CyrusNajmabadi Aug 29, 2025
1114e46
in progress
CyrusNajmabadi Aug 29, 2025
2527492
Compiling
CyrusNajmabadi Aug 29, 2025
c37ee9e
Fix tests
CyrusNajmabadi Aug 29, 2025
a46e753
cleanup
CyrusNajmabadi Aug 29, 2025
b051d87
cleanup
CyrusNajmabadi Aug 29, 2025
2c15ab0
cleanup
CyrusNajmabadi Aug 29, 2025
8ab740e
cleanup
CyrusNajmabadi Aug 29, 2025
522ba7f
cleanup
CyrusNajmabadi Aug 29, 2025
750bb54
cleanup
CyrusNajmabadi Aug 29, 2025
06838ce
cleanup
CyrusNajmabadi Aug 29, 2025
cb533f9
cleanup
CyrusNajmabadi Aug 29, 2025
28b21a8
cleanup
CyrusNajmabadi Aug 29, 2025
06364bc
cleanup
CyrusNajmabadi Aug 29, 2025
dabdd08
cleanup
CyrusNajmabadi Aug 29, 2025
5273899
cleanup
CyrusNajmabadi Aug 29, 2025
325cfbb
cleanup
CyrusNajmabadi Aug 29, 2025
1583c82
Merge remote-tracking branch 'upstream/main' into noCompilationPair
CyrusNajmabadi Aug 30, 2025
ccae16c
Remove comments
CyrusNajmabadi Aug 30, 2025
8ab1449
Merge branch 'main' into noCompilationPair
CyrusNajmabadi Sep 1, 2025
8b5ace9
fix
CyrusNajmabadi Sep 1, 2025
10d5103
Merge branch 'main' into noCompilationPair
CyrusNajmabadi Sep 1, 2025
ceb530c
Fixtest
CyrusNajmabadi Sep 1, 2025
7cf5a48
Merge
CyrusNajmabadi Sep 1, 2025
6398a7b
Clean
CyrusNajmabadi Sep 1, 2025
a114a53
Rename
CyrusNajmabadi Sep 1, 2025
48f563e
hide
CyrusNajmabadi Sep 1, 2025
006d929
Docs
CyrusNajmabadi Sep 1, 2025
5ff9b15
cleanup
CyrusNajmabadi Sep 1, 2025
bf367f6
cleanup
CyrusNajmabadi Sep 1, 2025
22c861a
Cleanup
CyrusNajmabadi Sep 1, 2025
f4eab9a
Fix
CyrusNajmabadi Sep 1, 2025
2180608
Fix keys
CyrusNajmabadi Sep 1, 2025
b1d93a6
Fix naming styles
CyrusNajmabadi Sep 2, 2025
45c14ba
Fix test
CyrusNajmabadi Sep 2, 2025
d244d54
Simplify
CyrusNajmabadi Sep 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -414,10 +414,10 @@ private void Method()
}
}
""", """
using System;

namespace A
{
using System;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is the correct behavior. The test here is testing " 'usings' should be INSIDE the namespace, and it is an ERROR otherwise". So it was a bug this wasn't moving in in CodeCleanup.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: this differs from teh tests taht validate that nothing change when the option suggestions the change, but the severity is set to 'hidden'. in that case we do not make any change.


internal class Program
{
private void Method()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -635,7 +635,7 @@ internal async Task TestOnlyRequiredAnalyzerExecutedDuringDiagnosticComputation(
var project = workspace.CurrentSolution.Projects.Single();
var document = documentAnalysis ? project.Documents.Single() : null;
var diagnosticsMapResults = await DiagnosticComputer.GetDiagnosticsAsync(
document, project, Checksum.Null, span: null, projectAnalyzerIds: [], analyzerIdsToRequestDiagnostics,
document, project, Checksum.Null, span: null, analyzerIdsToRequestDiagnostics,
AnalysisKind.Semantic, new DiagnosticAnalyzerInfoCache(), workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false,
cancellationToken: CancellationToken.None);
Expand Down Expand Up @@ -671,7 +671,7 @@ internal async Task TestAnalysisWithAnalyzerInBothProjectAndHost_SameAnalyzerIns
var project = workspace.CurrentSolution.Projects.Single();
var document = documentAnalysis ? project.Documents.Single() : null;
var diagnosticsMapResults = await DiagnosticComputer.GetDiagnosticsAsync(
document, project, Checksum.Null, span: null, projectAnalyzerIds: [analyzerId], [analyzerId],
document, project, Checksum.Null, span: null, [analyzerId],
AnalysisKind.Semantic, new DiagnosticAnalyzerInfoCache(), workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false,
cancellationToken: CancellationToken.None);
Expand Down Expand Up @@ -707,7 +707,7 @@ internal async Task TestAnalysisWithAnalyzerInBothProjectAndHost_DifferentAnalyz
var project = workspace.CurrentSolution.Projects.Single();
var document = documentAnalysis ? project.Documents.Single() : null;
var diagnosticsMapResults = await DiagnosticComputer.GetDiagnosticsAsync(
document, project, Checksum.Null, span: null, projectAnalyzerIds: [analyzerProjectId], [analyzerHostId],
document, project, Checksum.Null, span: null, [analyzerHostId],
AnalysisKind.Semantic, new DiagnosticAnalyzerInfoCache(), workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false,
cancellationToken: CancellationToken.None);
Expand Down Expand Up @@ -742,15 +742,13 @@ internal async Task TestAnalysisWithAnalyzerInBothProjectAndHost_DifferentAnalyz
var project = workspace.CurrentSolution.Projects.Single();
var document = documentAnalysis ? project.Documents.Single() : null;
var diagnosticsMapResults = await DiagnosticComputer.GetDiagnosticsAsync(
document, project, Checksum.Null, span: null, projectAnalyzerIds: [analyzerProjectId], [analyzerHostId],
document, project, Checksum.Null, span: null, [analyzerHostId],
AnalysisKind.Semantic, new DiagnosticAnalyzerInfoCache(), workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false,
cancellationToken: CancellationToken.None);

// In this case, the analyzers are ran twice. This appears to be a bug in SkippedHostAnalyzersInfo.Create, because it calls
// HostDiagnosticAnalyzers.CreateProjectDiagnosticAnalyzersPerReference which already filters out references, it doesn't return any
// references to skip.
Assert.Equal(2, diagnosticsMapResults.Diagnostics.Length);
// The analyzers are only run once since we detect this duplicated analyzer. So we only get one diagnostic.
Assert.Equal(1, diagnosticsMapResults.Diagnostics.Length);

static AnalyzerReference CreateAnalyzerReferenceWithSameId(DiagnosticAnalyzer analyzer)
{
Expand Down Expand Up @@ -796,7 +794,7 @@ internal async Task TestAnalysisWithAnalyzerInBothProjectAndHost_SameAnalyzerIns
var project = workspace.CurrentSolution.Projects.Single();
var document = documentAnalysis ? project.Documents.Single() : null;
var diagnosticsMapResults = await DiagnosticComputer.GetDiagnosticsAsync(
document, project, Checksum.Null, span: null, projectAnalyzerIds: [analyzerId], [analyzerId],
document, project, Checksum.Null, span: null, [analyzerId],
AnalysisKind.Semantic, new DiagnosticAnalyzerInfoCache(), workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false,
cancellationToken: CancellationToken.None);
Expand Down Expand Up @@ -862,7 +860,7 @@ async Task VerifyCallbackSpanAsync(TextSpan? filterSpan)
: AnalysisKind.Semantic;
var documentToAnalyze = kind == FilterSpanTestAnalyzer.AnalysisKind.AdditionalFile ? additionalDocument : document;
_ = await DiagnosticComputer.GetDiagnosticsAsync(
documentToAnalyze, project, Checksum.Null, filterSpan, analyzerIdsToRequestDiagnostics, hostAnalyzerIds: [],
documentToAnalyze, project, Checksum.Null, filterSpan, analyzerIdsToRequestDiagnostics,
analysisKind, new DiagnosticAnalyzerInfoCache(), workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false,
CancellationToken.None);
Expand Down Expand Up @@ -919,7 +917,7 @@ void M()
try
{
_ = await DiagnosticComputer.GetDiagnosticsAsync(document, project, Checksum.Null, span: null,
projectAnalyzerIds: [], analyzerIds, kind, diagnosticAnalyzerInfoCache, workspace.Services,
analyzerIds, kind, diagnosticAnalyzerInfoCache, workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false, cancellationToken: analyzer.CancellationToken);

throw ExceptionUtilities.Unreachable();
Expand All @@ -932,7 +930,7 @@ void M()

// Then invoke analysis without cancellation token, and verify non-cancelled diagnostic.
var diagnosticsMap = await DiagnosticComputer.GetDiagnosticsAsync(document, project, Checksum.Null, span: null,
projectAnalyzerIds: [], analyzerIds, kind, diagnosticAnalyzerInfoCache, workspace.Services,
analyzerIds, kind, diagnosticAnalyzerInfoCache, workspace.Services,
logPerformanceInfo: false, getTelemetryInfo: false, cancellationToken: CancellationToken.None);
var builder = diagnosticsMap.Diagnostics.Single().diagnosticMap;
var diagnostic = kind == AnalysisKind.Syntax ? builder.Syntax.Single().Item2.Single() : builder.Semantic.Single().Item2.Single();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles;

namespace Microsoft.CodeAnalysis.Diagnostics;

internal static class AnalyzerOptionsUtilities
{
/// <summary>
/// Combines two <see cref="AnalyzerOptions"/> instances into one. The resulting instance will have the
/// options merged from both. Options defined in <paramref name="projectAnalyzerOptions"/> ("EditorConfig options")
/// will take precedence over those in <paramref name="hostAnalyzerOptions"/> (VS UI options).
/// </summary>
public static AnalyzerOptions Combine(AnalyzerOptions projectAnalyzerOptions, AnalyzerOptions hostAnalyzerOptions)
{
return new AnalyzerOptions(
projectAnalyzerOptions.AdditionalFiles.AddRange(hostAnalyzerOptions.AdditionalFiles).Distinct(),
new CombinedAnalyzerConfigOptionsProvider(projectAnalyzerOptions, hostAnalyzerOptions));
}

private sealed class CombinedAnalyzerConfigOptionsProvider(
AnalyzerOptions projectAnalyzerOptions,
AnalyzerOptions hostAnalyzerOptions) : AnalyzerConfigOptionsProvider
{
private readonly AnalyzerOptions _analyzerOptions = projectAnalyzerOptions;
private readonly AnalyzerOptions _hostAnalyzerOptions = hostAnalyzerOptions;

public override AnalyzerConfigOptions GlobalOptions
=> new CombinedAnalyzerConfigOptions(
_analyzerOptions.AnalyzerConfigOptionsProvider.GlobalOptions,
_hostAnalyzerOptions.AnalyzerConfigOptionsProvider.GlobalOptions);

public override AnalyzerConfigOptions GetOptions(SyntaxTree tree)
=> new CombinedAnalyzerConfigOptions(
_analyzerOptions.AnalyzerConfigOptionsProvider.GetOptions(tree),
_hostAnalyzerOptions.AnalyzerConfigOptionsProvider.GetOptions(tree));

public override AnalyzerConfigOptions GetOptions(AdditionalText textFile)
=> new CombinedAnalyzerConfigOptions(
_analyzerOptions.AnalyzerConfigOptionsProvider.GetOptions(textFile),
_hostAnalyzerOptions.AnalyzerConfigOptionsProvider.GetOptions(textFile));

private sealed class CombinedAnalyzerConfigOptions(
AnalyzerConfigOptions projectOptions,
AnalyzerConfigOptions hostOptions) : StructuredAnalyzerConfigOptions
{
public override bool TryGetValue(string key, [NotNullWhen(true)] out string? value)
// Lookup in project options first. Editor config should override the values from the host.
=> projectOptions.TryGetValue(key, out value) || hostOptions.TryGetValue(key, out value);

public override IEnumerable<string> Keys
=> projectOptions.Keys.Union(hostOptions.Keys);

public override NamingStylePreferences GetNamingStylePreferences()
{
var preferences = (projectOptions as StructuredAnalyzerConfigOptions)?.GetNamingStylePreferences();
if (preferences is { IsEmpty: false })
return preferences;

preferences = (hostOptions as StructuredAnalyzerConfigOptions)?.GetNamingStylePreferences();
if (preferences is { IsEmpty: false })
return preferences;

return NamingStylePreferences.Empty;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ public ImmutableArray<DiagnosticAnalyzer> GetAnalyzers(Project project)
=> service.GetProjectAnalyzers(project);

public Task<DiagnosticAnalysisResultMap<DiagnosticAnalyzer, DiagnosticAnalysisResult>> AnalyzeProjectInProcessAsync(
Project project, CompilationWithAnalyzersPair compilationWithAnalyzers, bool logPerformanceInfo, bool getTelemetryInfo, CancellationToken cancellationToken)
Project project, CompilationWithAnalyzers compilationWithAnalyzers, bool logPerformanceInfo, bool getTelemetryInfo, CancellationToken cancellationToken)
=> service.AnalyzeInProcessAsync(documentAnalysisScope: null, project, compilationWithAnalyzers, logPerformanceInfo, getTelemetryInfo, cancellationToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace Microsoft.CodeAnalysis.Diagnostics;
internal sealed partial class DiagnosticAnalyzerService
{
/// <summary>
/// Cached data from a <see cref="ProjectState"/> to the <see cref="CompilationWithAnalyzersPair"/>s
/// Cached data from a <see cref="ProjectState"/> to the <see cref="CompilationWithAnalyzers"/>s
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CompilationWithAnalyzers

nit: rename file

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can do in followup.

/// we've created for it. Note: the CompilationWithAnalyzersPair instance is dependent on the set of <see
/// cref="DiagnosticAnalyzer"/>s passed along with the project.
/// <para/>
Expand All @@ -33,14 +33,14 @@ private static readonly ConditionalWeakTable<
ProjectState,
SmallDictionary<
(Checksum checksum, ImmutableArray<DiagnosticAnalyzer> analyzers),
AsyncLazy<CompilationWithAnalyzersPair?>>> s_projectToCompilationWithAnalyzers = new();
AsyncLazy<CompilationWithAnalyzers?>>> s_projectToCompilationWithAnalyzers = new();

/// <summary>
/// <summary>
/// Protection around the SmallDictionary in <see cref="s_projectToCompilationWithAnalyzers"/>.
/// </summary>
private static readonly SemaphoreSlim s_gate = new(initialCount: 1);

private static async Task<CompilationWithAnalyzersPair?> GetOrCreateCompilationWithAnalyzersAsync(
private static async Task<CompilationWithAnalyzers?> GetOrCreateCompilationWithAnalyzersAsync(
Project project,
ImmutableArray<DiagnosticAnalyzer> analyzers,
HostAnalyzerInfo hostAnalyzerInfo,
Expand All @@ -57,7 +57,7 @@ private static readonly ConditionalWeakTable<
var map = s_projectToCompilationWithAnalyzers.GetValue(
project.State, static _ => new(ChecksumAndAnalyzersEqualityComparer.Instance));

AsyncLazy<CompilationWithAnalyzersPair?>? lazy;
AsyncLazy<CompilationWithAnalyzers?>? lazy;
using (await s_gate.DisposableWaitAsync(cancellationToken).ConfigureAwait(false))
{
var checksumAndAnalyzers = (checksum, analyzers);
Expand All @@ -75,7 +75,7 @@ private static readonly ConditionalWeakTable<
// <summary>
// Should only be called on a <see cref="Project"/> that <see cref="Project.SupportsCompilation"/>.
// </summary>
static async Task<CompilationWithAnalyzersPair?> CreateCompilationWithAnalyzersAsync(
static async Task<CompilationWithAnalyzers?> CreateCompilationWithAnalyzersAsync(
(Project project,
ImmutableArray<DiagnosticAnalyzer> analyzers,
HostAnalyzerInfo hostAnalyzerInfo,
Expand Down Expand Up @@ -117,9 +117,13 @@ private static readonly ConditionalWeakTable<
};

// Create driver that holds onto compilation and associated analyzers
return new(
CreateCompilationWithAnalyzers(compilation, filteredProjectAnalyzers, project.State.ProjectAnalyzerOptions, exceptionFilter),
CreateCompilationWithAnalyzers(compilation, filteredHostAnalyzers, project.HostAnalyzerOptions, exceptionFilter));
return CreateCompilationWithAnalyzers(
compilation,
filteredHostAnalyzers.Concat(filteredProjectAnalyzers).Distinct(),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

filteredHostAnalyzers.Concat(filteredProjectAnalyzers).Distinct(),

Trying to work my way through the WhereAsArray mental gymnastics above, and I'm probably wrong, but it seems like all that reduces to this parameter just being

analyzers.Where(a => !a.IsWorkspaceDiagnosticAnalyzer())

and not needing any of those intermediate calculations

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yup. that seems to be true. Are you ok with that happening in a followup. My plan was to go over all this code and reduce complexity now that we only have one list of analyzers. Thanks! :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Definitely ok with any change related to this to be in a followup PR

AnalyzerOptionsUtilities.Combine(
project.State.ProjectAnalyzerOptions,
project.HostAnalyzerOptions),
exceptionFilter);
}

static CompilationWithAnalyzers? CreateCompilationWithAnalyzers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ internal sealed partial class DiagnosticAnalyzerService
/// from cache or by calculating them.
/// </summary>
private async Task<ImmutableDictionary<DiagnosticAnalyzer, DiagnosticAnalysisResult>> ComputeDiagnosticAnalysisResultsInProcessAsync(
CompilationWithAnalyzersPair? compilationWithAnalyzers,
CompilationWithAnalyzers? compilationWithAnalyzers,
Project project,
ImmutableArray<DocumentDiagnosticAnalyzer> analyzers,
CancellationToken cancellationToken)
Expand Down Expand Up @@ -93,8 +93,7 @@ async Task<ImmutableDictionary<DiagnosticAnalyzer, DiagnosticAnalysisResult>> Co
var result = ImmutableDictionary<DiagnosticAnalyzer, DiagnosticAnalysisResult>.Empty;

// can be null if given project doesn't support compilation.
if (compilationWithAnalyzers?.ProjectAnalyzers.Length > 0
|| compilationWithAnalyzers?.HostAnalyzers.Length > 0)
if (compilationWithAnalyzers?.Analyzers.Length > 0)
{
// calculate regular diagnostic analyzers diagnostics
var resultMap = await this.AnalyzeInProcessAsync(
Expand All @@ -121,7 +120,7 @@ async Task<ImmutableDictionary<DiagnosticAnalyzer, DiagnosticAnalysisResult>> Me
{
try
{
var compilation = compilationWithAnalyzers?.HostCompilation;
var compilation = compilationWithAnalyzers?.Compilation;

foreach (var documentAnalyzer in ideAnalyzers)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ internal sealed partial class DiagnosticAnalyzerService
private async Task<DiagnosticAnalysisResultMap<DiagnosticAnalyzer, DiagnosticAnalysisResult>> AnalyzeInProcessAsync(
DocumentAnalysisScope? documentAnalysisScope,
Project project,
CompilationWithAnalyzersPair compilationWithAnalyzers,
CompilationWithAnalyzers compilationWithAnalyzers,
bool logPerformanceInfo,
bool getTelemetryInfo,
CancellationToken cancellationToken)
Expand All @@ -45,8 +45,7 @@ async Task<DiagnosticAnalysisResultMap<DiagnosticAnalyzer, DiagnosticAnalysisRes
cancellationToken).CompletesAsyncOperation(asyncToken);
}

var projectAnalyzers = documentAnalysisScope?.ProjectAnalyzers ?? compilationWithAnalyzers.ProjectAnalyzers;
var hostAnalyzers = documentAnalysisScope?.HostAnalyzers ?? compilationWithAnalyzers.HostAnalyzers;
var analyzers = documentAnalysisScope?.Analyzers ?? compilationWithAnalyzers.Analyzers;
var skippedAnalyzersInfo = project.Solution.SolutionState.Analyzers.GetSkippedAnalyzersInfo(project.State, _analyzerInfoCache);

// get compiler result builder map
Expand All @@ -55,21 +54,21 @@ async Task<DiagnosticAnalysisResultMap<DiagnosticAnalyzer, DiagnosticAnalysisRes
{
var map = await analysisResult.ToResultBuilderMapAsync(
additionalPragmaSuppressionDiagnostics, documentAnalysisScope, project,
projectAnalyzers, hostAnalyzers, skippedAnalyzersInfo, cancellationToken).ConfigureAwait(false);
analyzers, skippedAnalyzersInfo, cancellationToken).ConfigureAwait(false);
builderMap = builderMap.AddRange(map);
}

var result = builderMap.ToImmutableDictionary(kv => kv.Key, kv => DiagnosticAnalysisResult.CreateFromBuilder(kv.Value));
var telemetry = ImmutableDictionary<DiagnosticAnalyzer, AnalyzerTelemetryInfo>.Empty;
if (getTelemetryInfo && analysisResult is not null)
{
telemetry = analysisResult.MergedAnalyzerTelemetryInfo;
telemetry = analysisResult.AnalyzerTelemetryInfo;
}

return DiagnosticAnalysisResultMap.Create(result, telemetry);
}

void ReportAnalyzerPerformance(AnalysisResultPair? analysisResult)
void ReportAnalyzerPerformance(AnalysisResult analysisResult)
{
try
{
Expand All @@ -80,7 +79,7 @@ void ReportAnalyzerPerformance(AnalysisResultPair? analysisResult)
ImmutableArray<AnalyzerPerformanceInfo> performanceInfo = [];
if (analysisResult is not null)
{
performanceInfo = performanceInfo.AddRange(analysisResult.MergedAnalyzerTelemetryInfo.ToAnalyzerPerformanceInfo(_analyzerInfoCache));
performanceInfo = performanceInfo.AddRange(analysisResult.AnalyzerTelemetryInfo.ToAnalyzerPerformanceInfo(_analyzerInfoCache));
}

using (RoslynLogger.LogBlock(FunctionId.CodeAnalysisService_ReportAnalyzerPerformance, cancellationToken))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ private async Task<ImmutableArray<DiagnosticAnalyzer>> GetDeprioritizationCandid
using var _ = ArrayBuilder<DiagnosticAnalyzer>.GetInstance(out var builder);

HostAnalyzerInfo? hostAnalyzerInfo = null;
CompilationWithAnalyzersPair? compilationWithAnalyzers = null;
CompilationWithAnalyzers? compilationWithAnalyzers = null;

foreach (var analyzer in analyzers)
{
Expand Down
Loading
Loading