From 5e50199e9e8c9f0192a179a1c6fbeae3dbc29a0f Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Sat, 17 Feb 2024 14:10:31 +0200 Subject: [PATCH] Reduce string allocations from `GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey` --- .../DiagnosticAnalyzer/AnalyzerDriver.cs | 3 ++- .../DiagnosticAnalyzer/AnalyzerManager.cs | 3 ++- .../AnalyzerOptionsExtensions.cs | 19 ++++++++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs index 04846e856e78e..49aa1de5fd5cb 100644 --- a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs +++ b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerDriver.cs @@ -973,12 +973,13 @@ static ImmutableHashSet GetEffectiveSeverities( } var builder = ImmutableHashSet.CreateBuilder(); + var categoryBasedKey = AnalyzerOptionsExtensions.GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(descriptor.Category); foreach (var tree in compilation.SyntaxTrees) { var severityForTree = defaultSeverity; if (syntaxTreeProvider.TryGetDiagnosticValue(tree, descriptor.Id, cancellationToken, out severity) || - analyzerOptions.TryGetSeverityFromBulkConfiguration(tree, compilation, descriptor, cancellationToken, out severity)) + analyzerOptions.TryGetSeverityFromBulkConfiguration(tree, compilation, descriptor, categoryBasedKey, cancellationToken, out severity)) { Debug.Assert(severity != ReportDiagnostic.Default); diff --git a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerManager.cs b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerManager.cs index d3f0816c90fc7..d03959b852b4b 100644 --- a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerManager.cs +++ b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerManager.cs @@ -317,11 +317,12 @@ bool isEnabledWithAnalyzerConfigOptions(DiagnosticDescriptor descriptor) { if (analyzerExecutor.Compilation.Options.SyntaxTreeOptionsProvider is { } treeOptions) { + var categoryBasedKey = AnalyzerOptionsExtensions.GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(descriptor.Category); foreach (var tree in analysisScope.SyntaxTrees) { // Check if diagnostic is enabled by SyntaxTree.DiagnosticOptions or Bulk configuration from AnalyzerConfigOptions. if (treeOptions.TryGetDiagnosticValue(tree, descriptor.Id, cancellationToken, out var configuredValue) || - analyzerExecutor.AnalyzerOptions.TryGetSeverityFromBulkConfiguration(tree, analyzerExecutor.Compilation, descriptor, cancellationToken, out configuredValue)) + analyzerExecutor.AnalyzerOptions.TryGetSeverityFromBulkConfiguration(tree, analyzerExecutor.Compilation, descriptor, categoryBasedKey, cancellationToken, out configuredValue)) { if (configuredValue != ReportDiagnostic.Suppress && !severityFilter.Contains(configuredValue)) { diff --git a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerOptionsExtensions.cs b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerOptionsExtensions.cs index 11c36ca3dd671..6e991ccb8e7b7 100644 --- a/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerOptionsExtensions.cs +++ b/src/Compilers/Core/Portable/DiagnosticAnalyzer/AnalyzerOptionsExtensions.cs @@ -17,8 +17,10 @@ internal static class AnalyzerOptionsExtensions private const string DotnetAnalyzerDiagnosticSeverityKey = DotnetAnalyzerDiagnosticPrefix + "." + SeveritySuffix; - private static string GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(string category) - => $"{DotnetAnalyzerDiagnosticPrefix}.{CategoryPrefix}-{category}.{SeveritySuffix}"; + internal static string GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(string category) + { + return $"{DotnetAnalyzerDiagnosticPrefix}.{CategoryPrefix}-{category}.{SeveritySuffix}"; + } /// /// Tries to get configured severity for the given @@ -32,6 +34,7 @@ public static bool TryGetSeverityFromBulkConfiguration( SyntaxTree tree, Compilation compilation, DiagnosticDescriptor descriptor, + string? categoryBasedKey, CancellationToken cancellationToken, out ReportDiagnostic severity) { @@ -63,7 +66,8 @@ public static bool TryGetSeverityFromBulkConfiguration( // If user has explicitly configured default severity for the diagnostic category, that should be respected. // For example, 'dotnet_analyzer_diagnostic.category-security.severity = error' - var categoryBasedKey = GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(descriptor.Category); + Debug.Assert(categoryBasedKey is null || categoryBasedKey == GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(descriptor.Category)); + categoryBasedKey ??= GetCategoryBasedDotnetAnalyzerDiagnosticSeverityKey(descriptor.Category); if (analyzerConfigOptions.TryGetValue(categoryBasedKey, out var value) && AnalyzerConfigSet.TryParseSeverity(value, out severity)) { @@ -89,5 +93,14 @@ public static bool TryGetSeverityFromBulkConfiguration( severity = default; return false; } + + public static bool TryGetSeverityFromBulkConfiguration( + this AnalyzerOptions? analyzerOptions, + SyntaxTree tree, + Compilation compilation, + DiagnosticDescriptor descriptor, + CancellationToken cancellationToken, + out ReportDiagnostic severity) + => TryGetSeverityFromBulkConfiguration(analyzerOptions, tree, compilation, descriptor, categoryBasedKey: null, cancellationToken, out severity); } }