提交 80f7a3a2 编写于 作者: M Manish Vasani

Fix unit tests by accounting for language specific options

上级 5b6cee9c
......@@ -41,7 +41,7 @@ private void Verify(string expected, string languageName)
continue;
}
if (!IDEDiagnosticIdToOptionMappingHelper.TryGetMappedOption(diagnosticId, out var option))
if (!IDEDiagnosticIdToOptionMappingHelper.TryGetMappedOption(diagnosticId, languageName, out var option))
{
option = null;
}
......@@ -75,7 +75,7 @@ private void Verify(string expected, string languageName)
string editorConfigString;
if (editorConfigLocation != null)
{
var optionKey = new OptionKey(option, option.IsPerLanguage ? LanguageNames.CSharp : null);
var optionKey = new OptionKey(option, option.IsPerLanguage ? languageName : null);
var value = optionSet.GetOption(optionKey);
editorConfigString = editorConfigLocation.GetEditorConfigString(value, optionSet);
}
......
......@@ -13,7 +13,8 @@ internal class CSharpRemoveUnusedParametersAndValuesDiagnosticAnalyzer : Abstrac
{
public CSharpRemoveUnusedParametersAndValuesDiagnosticAnalyzer()
: base(unusedValueExpressionStatementOption: CSharpCodeStyleOptions.UnusedValueExpressionStatement,
unusedValueAssignmentOption: CSharpCodeStyleOptions.UnusedValueAssignment)
unusedValueAssignmentOption: CSharpCodeStyleOptions.UnusedValueAssignment,
LanguageNames.CSharp)
{
}
......
......@@ -62,8 +62,8 @@ private static string GetEquivalenceKey(Options.PerLanguageOption<CodeStyleOptio
protected AbstractAddRequiredParenthesesDiagnosticAnalyzer(IPrecedenceService precedenceService)
: base(IDEDiagnosticIds.AddRequiredParenthesesDiagnosticId,
new LocalizableResourceString(nameof(FeaturesResources.Add_parentheses_for_clarity), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
new LocalizableResourceString(nameof(FeaturesResources.Parentheses_should_be_added_for_clarity), FeaturesResources.ResourceManager, typeof(FeaturesResources)))
new LocalizableResourceString(nameof(FeaturesResources.Add_parentheses_for_clarity), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
new LocalizableResourceString(nameof(FeaturesResources.Parentheses_should_be_added_for_clarity), FeaturesResources.ResourceManager, typeof(FeaturesResources)))
{
_precedenceService = precedenceService;
}
......
......@@ -160,7 +160,7 @@ private AnalyzerConfigDocument FindOrGenerateEditorConfig(ref Solution solution)
// For example, IDE diagnostics which are configurable with following code style option based .editorconfig entry:
// "%option_name% = %option_value%:%severity%
// we return '(option_name, option_value)'
if (IDEDiagnosticIdToOptionMappingHelper.TryGetMappedOption(_diagnostic.Id, out var option))
if (IDEDiagnosticIdToOptionMappingHelper.TryGetMappedOption(_diagnostic.Id, _language, out var option))
{
var editorConfigLocation = option.StorageLocations.OfType<IEditorConfigStorageLocation2>().FirstOrDefault();
if (editorConfigLocation != null)
......
......@@ -45,6 +45,19 @@ protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(ImmutableDictionary<Diagnos
}
}
/// <summary>
/// Constructor for a code style analyzer with a multiple diagnostic descriptors with language specific options that can be used to configure the diagnostic severity of each descriptor Id.
/// Use this constructor when you define an analyzer with same diagnostic ID in more than one language, such that language specific analyzers use different language specific option.
/// </summary>
protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(ImmutableDictionary<DiagnosticDescriptor, IOption> supportedDiagnosticsWithOptions, string language)
: base(supportedDiagnosticsWithOptions.Keys.ToImmutableArray())
{
foreach (var kvp in supportedDiagnosticsWithOptions)
{
AddDiagnosticIdToOptionMapping(kvp.Key.Id, kvp.Value, language);
}
}
/// <summary>
/// Constructor for a code style analyzer with a multiple diagnostic descriptors such that all the descriptors have no unique code style option to configure the descriptor Id.
/// </summary>
......@@ -53,11 +66,11 @@ protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(ImmutableArray<DiagnosticDe
{
}
private static void AddDiagnosticIdToOptionMapping(string diagnosticId, IOption option)
private static void AddDiagnosticIdToOptionMapping(string diagnosticId, IOption option, string languageOpt = null)
{
if (option != null)
{
IDEDiagnosticIdToOptionMappingHelper.AddOptionMapping(diagnosticId, option);
IDEDiagnosticIdToOptionMappingHelper.AddOptionMapping(diagnosticId, option, languageOpt);
}
}
......
......@@ -15,17 +15,24 @@ namespace Microsoft.CodeAnalysis.Diagnostics
internal static class IDEDiagnosticIdToOptionMappingHelper
{
private static readonly ConcurrentDictionary<string, IOption> s_diagnosticIdToOptionMap = new ConcurrentDictionary<string, IOption>();
private static readonly ConcurrentDictionary<string, ConcurrentDictionary<string, IOption>> s_diagnosticIdToLanguageSpecificOptionsMap = new ConcurrentDictionary<string, ConcurrentDictionary<string, IOption>>();
public static bool TryGetMappedOption(string diagnosticId, out IOption option)
=> s_diagnosticIdToOptionMap.TryGetValue(diagnosticId, out option);
public static bool TryGetMappedOption(string diagnosticId, string language, out IOption option)
=> s_diagnosticIdToOptionMap.TryGetValue(diagnosticId, out option) ||
(s_diagnosticIdToLanguageSpecificOptionsMap.TryGetValue(language, out var map) &&
map.TryGetValue(diagnosticId, out option));
public static void AddOptionMapping(string diagnosticId, IOption option)
public static void AddOptionMapping(string diagnosticId, IOption option, string languageOpt)
{
diagnosticId = diagnosticId ?? throw new ArgumentNullException(nameof(diagnosticId));
option = option ?? throw new ArgumentNullException(nameof(option));
Debug.Assert(!s_diagnosticIdToOptionMap.TryGetValue(diagnosticId, out var existingOption) || option == existingOption);
s_diagnosticIdToOptionMap.TryAdd(diagnosticId, option);
var map = languageOpt != null
? s_diagnosticIdToLanguageSpecificOptionsMap.GetOrAdd(languageOpt, _ => new ConcurrentDictionary<string, IOption>())
: s_diagnosticIdToOptionMap;
Debug.Assert(!map.TryGetValue(diagnosticId, out var existingOption) || option == existingOption);
map.TryAdd(diagnosticId, option);
}
}
}
......@@ -85,8 +85,9 @@ internal abstract partial class AbstractRemoveUnusedParametersAndValuesDiagnosti
protected AbstractRemoveUnusedParametersAndValuesDiagnosticAnalyzer(
Option<CodeStyleOption<UnusedValuePreference>> unusedValueExpressionStatementOption,
Option<CodeStyleOption<UnusedValuePreference>> unusedValueAssignmentOption)
: base(GetSupportedDescriptorsWithOptions(unusedValueExpressionStatementOption, unusedValueAssignmentOption))
Option<CodeStyleOption<UnusedValuePreference>> unusedValueAssignmentOption,
string language)
: base(GetSupportedDescriptorsWithOptions(unusedValueExpressionStatementOption, unusedValueAssignmentOption), language)
{
UnusedValueExpressionStatementOption = unusedValueExpressionStatementOption;
UnusedValueAssignmentOption = unusedValueAssignmentOption;
......
......@@ -14,7 +14,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnusedParametersAndValues
Public Sub New()
MyBase.New(unusedValueExpressionStatementOption:=VisualBasicCodeStyleOptions.UnusedValueExpressionStatement,
unusedValueAssignmentOption:=VisualBasicCodeStyleOptions.UnusedValueAssignment)
unusedValueAssignmentOption:=VisualBasicCodeStyleOptions.UnusedValueAssignment,
LanguageNames.VisualBasic)
End Sub
Protected Overrides Function SupportsDiscard(tree As SyntaxTree) As Boolean
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册