diff --git a/src/D2L.CodeStyle.Analyzers/Helpers/ExemptSymbolsBuilder.cs b/src/D2L.CodeStyle.Analyzers/Helpers/ExemptSymbolsBuilder.cs index d9016ddd..3b9411b9 100644 --- a/src/D2L.CodeStyle.Analyzers/Helpers/ExemptSymbolsBuilder.cs +++ b/src/D2L.CodeStyle.Analyzers/Helpers/ExemptSymbolsBuilder.cs @@ -11,7 +11,8 @@ internal sealed class ExemptSymbolsBuilder { private readonly AnalyzerOptions m_analyzerOptions; private readonly CancellationToken m_cancellationToken; - private readonly ImmutableHashSet.Builder m_exemptions = ImmutableHashSet.CreateBuilder( SymbolEqualityComparer.Default ); + private readonly HashSet m_exemptions = new( SymbolEqualityComparer.Default ); + private bool m_built = false; [System.Diagnostics.CodeAnalysis.SuppressMessage( "MicrosoftCodeAnalysisPerformance", @@ -26,7 +27,12 @@ CompilationStartAnalysisContext context m_cancellationToken = context.CancellationToken; } - public ImmutableHashSet Build() => m_exemptions.ToImmutable(); + public HashSet Build() { + ThrowIfBuilt(); + + m_built = true; + return m_exemptions; + } /// /// Loads exemptions from AdditionalFiles matching ".txt" and ".*.txt". @@ -35,6 +41,8 @@ CompilationStartAnalysisContext context public ExemptSymbolsBuilder AddFromAdditionalFiles( string fileNameBase ) { + ThrowIfBuilt(); + fileNameBase += "."; foreach( AdditionalText file in m_analyzerOptions.AdditionalFiles ) { @@ -73,6 +81,8 @@ string fileNameBase } public ExemptSymbolsBuilder AddFromDocumentationCommentId( string id ) { + ThrowIfBuilt(); + ImmutableArray symbols = DocumentationCommentId.GetSymbolsForDeclarationId( id, m_compilation ); foreach( var symbol in symbols ) { m_exemptions.Add( symbol ); @@ -81,4 +91,10 @@ public ExemptSymbolsBuilder AddFromDocumentationCommentId( string id ) { return this; } + private void ThrowIfBuilt() { + if( m_built ) { + throw new InvalidOperationException( "Builder instance has already been used" ); + } + } + } diff --git a/src/D2L.CodeStyle.Analyzers/Language/RequireNamedArgumentsAnalyzer.cs b/src/D2L.CodeStyle.Analyzers/Language/RequireNamedArgumentsAnalyzer.cs index 74c758e4..4d3cf214 100644 --- a/src/D2L.CodeStyle.Analyzers/Language/RequireNamedArgumentsAnalyzer.cs +++ b/src/D2L.CodeStyle.Analyzers/Language/RequireNamedArgumentsAnalyzer.cs @@ -53,7 +53,7 @@ private static void OnCompilationStart( CompilationStartAnalysisContext context return; } - ImmutableHashSet exemptions = new ExemptSymbolsBuilder( context ) + HashSet exemptions = new ExemptSymbolsBuilder( context ) .AddFromAdditionalFiles( "D2L.CodeStyle.RequireNamedArguments.Exemptions" ) // HashCode.Combine takes a series of args named value1..valueN which are not useful to name @@ -86,7 +86,7 @@ private static void AnalyzeInvocation( OperationAnalysisContext ctx, INamedTypeSymbol requireNamedArgumentsSymbol, INamedTypeSymbol? lambdaExpresssionSymbol, - ImmutableHashSet exemptions + HashSet exemptions ) { (IMethodSymbol targetMethod, ImmutableArray args) = ctx.Operation switch { IInvocationOperation op => (op.TargetMethod, op.Arguments),