diff --git a/src/Features/Core/Portable/Diagnostics/Analyzers/NamingStyleDiagnosticAnalyzerBase.cs b/src/Features/Core/Portable/Diagnostics/Analyzers/NamingStyleDiagnosticAnalyzerBase.cs index a6a15f2ca7483f8ccea61657316a561983c00743..313bf5c99473ec136b8a2c64a6abd89720ceb5fe 100644 --- a/src/Features/Core/Portable/Diagnostics/Analyzers/NamingStyleDiagnosticAnalyzerBase.cs +++ b/src/Features/Core/Portable/Diagnostics/Analyzers/NamingStyleDiagnosticAnalyzerBase.cs @@ -44,22 +44,16 @@ private void CompilationStartAction(CompilationStartAnalysisContext context) { var idToCachedResult = new ConcurrentDictionary>( concurrencyLevel: 2, capacity: 0); - var preferencesToRules = new ConcurrentDictionary( - concurrencyLevel: 2, capacity: 0, comparer: ReferenceEqualityComparer.Instance); - context.RegisterSymbolAction(c => SymbolAction(c, idToCachedResult, preferencesToRules), _symbolKinds); + context.RegisterSymbolAction(c => SymbolAction(c, idToCachedResult), _symbolKinds); } private static readonly Func> s_createCache = _ => new ConcurrentDictionary(concurrencyLevel: 2, capacity: 0); - private static readonly Func s_createRules = - p => p.GetNamingStyleRules(); - private void SymbolAction( SymbolAnalysisContext context, - ConcurrentDictionary> idToCachedResult, - ConcurrentDictionary preferencesToRules) + ConcurrentDictionary> idToCachedResult) { var namingPreferences = context.GetNamingStylePreferencesAsync().GetAwaiter().GetResult(); if (namingPreferences == null) @@ -67,7 +61,7 @@ private void CompilationStartAction(CompilationStartAnalysisContext context) return; } - var namingStyleRules = preferencesToRules.GetOrAdd(namingPreferences, s_createRules); + var namingStyleRules = namingPreferences.Rules; if (!namingStyleRules.TryGetApplicableRule(context.Symbol, out var applicableRule) || applicableRule.EnforcementLevel == DiagnosticSeverity.Hidden) diff --git a/src/Workspaces/Core/Portable/NamingStyles/Serialization/NamingStylePreferences.cs b/src/Workspaces/Core/Portable/NamingStyles/Serialization/NamingStylePreferences.cs index 473f5fc4455bd55c45920151695a31e85706ad04..8aa7e4a6fa6b7553cef9f3253364ed53cd7c2068 100644 --- a/src/Workspaces/Core/Portable/NamingStyles/Serialization/NamingStylePreferences.cs +++ b/src/Workspaces/Core/Portable/NamingStyles/Serialization/NamingStylePreferences.cs @@ -23,6 +23,8 @@ internal class NamingStylePreferences : IEquatable public readonly ImmutableArray NamingStyles; public readonly ImmutableArray NamingRules; + private readonly Lazy _lazyRules; + internal NamingStylePreferences( ImmutableArray symbolSpecifications, ImmutableArray namingStyles, @@ -31,6 +33,8 @@ internal class NamingStylePreferences : IEquatable SymbolSpecifications = symbolSpecifications; NamingStyles = namingStyles; NamingRules = namingRules; + + _lazyRules = new Lazy(CreateRules, isThreadSafe: true); } internal NamingStylePreferences() @@ -45,19 +49,15 @@ internal NamingStylePreferences() public static string DefaultNamingPreferencesString => _defaultNamingPreferencesString; internal MutableNamingStyle GetNamingStyle(Guid namingStyleID) - { - return NamingStyles.Single(s => s.ID == namingStyleID); - } + => NamingStyles.Single(s => s.ID == namingStyleID); internal SymbolSpecification GetSymbolSpecification(Guid symbolSpecificationID) - { - return SymbolSpecifications.Single(s => s.ID == symbolSpecificationID); - } + => SymbolSpecifications.Single(s => s.ID == symbolSpecificationID); - public NamingStyleRules GetNamingStyleRules() - { - return new NamingStyleRules(NamingRules.Select(r => r.GetRule(this)).ToImmutableArray()); - } + public NamingStyleRules Rules => _lazyRules.Value; + + public NamingStyleRules CreateRules() + => new NamingStyleRules(NamingRules.Select(r => r.GetRule(this)).ToImmutableArray()); internal XElement CreateXElement() { @@ -156,15 +156,15 @@ public bool Equals(NamingStylePreferences other) { return true; } - else if(leftIsNull) + else if (leftIsNull) { return false; } - else if(rightIsNull) + else if (rightIsNull) { return false; } - + return left.Equals(right); }