未验证 提交 d57cddba 编写于 作者: M Manish Vasani 提交者: GitHub

Merge pull request #49995 from mavasani/PassEnforceOnBuild

Set EnforceOnBuild values for code style analyzers
......@@ -22,6 +22,7 @@ internal sealed class CSharpAddBracesDiagnosticAnalyzer :
{
public CSharpAddBracesDiagnosticAnalyzer()
: base(IDEDiagnosticIds.AddBracesDiagnosticId,
EnforceOnBuildValues.AddBraces,
CSharpCodeStyleOptions.PreferBraces,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Add_braces), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -22,6 +22,7 @@ internal sealed partial class ConvertSwitchStatementToExpressionDiagnosticAnalyz
{
public ConvertSwitchStatementToExpressionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.ConvertSwitchStatementToExpressionDiagnosticId,
EnforceOnBuildValues.ConvertSwitchStatementToExpression,
CSharpCodeStyleOptions.PreferSwitchExpression,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Convert_switch_statement_to_expression), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -36,6 +36,7 @@ internal class CSharpInlineDeclarationDiagnosticAnalyzer : AbstractBuiltInCodeSt
public CSharpInlineDeclarationDiagnosticAnalyzer()
: base(IDEDiagnosticIds.InlineDeclarationDiagnosticId,
EnforceOnBuildValues.InlineDeclaration,
CSharpCodeStyleOptions.PreferInlinedVariableDeclaration,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Inline_variable_declaration), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -27,6 +27,7 @@ internal class InvokeDelegateWithConditionalAccessAnalyzer : AbstractBuiltInCode
{
public InvokeDelegateWithConditionalAccessAnalyzer()
: base(IDEDiagnosticIds.InvokeDelegateWithConditionalAccessId,
EnforceOnBuildValues.InvokeDelegateWithConditionalAccess,
CSharpCodeStyleOptions.PreferConditionalDelegateCall,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Delegate_invocation_can_be_simplified), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)))
......
......@@ -17,6 +17,7 @@ internal class MakeLocalFunctionStaticDiagnosticAnalyzer : AbstractBuiltInCodeSt
{
public MakeLocalFunctionStaticDiagnosticAnalyzer()
: base(IDEDiagnosticIds.MakeLocalFunctionStaticDiagnosticId,
EnforceOnBuildValues.MakeLocalFunctionStatic,
CSharpCodeStyleOptions.PreferStaticLocalFunction,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Make_local_function_static), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -18,6 +18,7 @@ internal sealed class CSharpMakeStructFieldsWritableDiagnosticAnalyzer : Abstrac
{
private static readonly DiagnosticDescriptor s_diagnosticDescriptor = CreateDescriptor(
IDEDiagnosticIds.MakeStructFieldsWritable,
EnforceOnBuildValues.MakeStructFieldsWritable,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Make_readonly_fields_writable), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Struct_contains_assignment_to_this_outside_of_constructor_Make_readonly_fields_writable), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
isUnnecessary: false);
......
......@@ -27,13 +27,17 @@ internal sealed class MisplacedUsingDirectivesDiagnosticAnalyzer : AbstractBuilt
nameof(CSharpAnalyzersResources.Using_directives_must_be_placed_outside_of_a_namespace_declaration), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources));
private static readonly DiagnosticDescriptor s_outsideDiagnosticDescriptor = CreateDescriptorWithId(
IDEDiagnosticIds.MoveMisplacedUsingDirectivesDiagnosticId, s_localizableTitle, s_localizableOutsideMessage);
IDEDiagnosticIds.MoveMisplacedUsingDirectivesDiagnosticId,
EnforceOnBuildValues.MoveMisplacedUsingDirectives,
s_localizableTitle, s_localizableOutsideMessage);
private static readonly LocalizableResourceString s_localizableInsideMessage = new(
nameof(CSharpAnalyzersResources.Using_directives_must_be_placed_inside_of_a_namespace_declaration), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources));
private static readonly DiagnosticDescriptor s_insideDiagnosticDescriptor = CreateDescriptorWithId(
IDEDiagnosticIds.MoveMisplacedUsingDirectivesDiagnosticId, s_localizableTitle, s_localizableInsideMessage);
IDEDiagnosticIds.MoveMisplacedUsingDirectivesDiagnosticId,
EnforceOnBuildValues.MoveMisplacedUsingDirectives,
s_localizableTitle, s_localizableInsideMessage);
public MisplacedUsingDirectivesDiagnosticAnalyzer()
: base(ImmutableDictionary<DiagnosticDescriptor, ILanguageSpecificOption>.Empty
......
......@@ -15,6 +15,7 @@ internal sealed class CSharpRemoveConfusingSuppressionDiagnosticAnalyzer : Abstr
{
public CSharpRemoveConfusingSuppressionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveConfusingSuppressionForIsExpressionDiagnosticId,
EnforceOnBuildValues.RemoveConfusingSuppressionForIsExpression,
option: null,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnecessary_suppression_operator), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Suppression_operator_has_no_effect_and_can_be_misinterpreted), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)))
......
......@@ -19,6 +19,7 @@ internal sealed class CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyze
{
public CSharpRemoveUnnecessaryDiscardDesignationDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveUnnecessaryDiscardDesignationDiagnosticId,
EnforceOnBuildValues.RemoveUnnecessaryDiscardDesignation,
option: null,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Remove_unnessary_discard), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Discard_can_be_removed), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -26,6 +26,7 @@ internal class CSharpRemoveUnreachableCodeDiagnosticAnalyzer : AbstractBuiltInCo
public CSharpRemoveUnreachableCodeDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveUnreachableCodeDiagnosticId,
EnforceOnBuildValues.RemoveUnreachableCode,
option: null,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Unreachable_code_detected), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
// This analyzer supports fading through AdditionalLocations since it's a user-controlled option
......
......@@ -23,6 +23,7 @@ internal class CSharpUseCompoundCoalesceAssignmentDiagnosticAnalyzer
{
public CSharpUseCompoundCoalesceAssignmentDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseCoalesceCompoundAssignmentDiagnosticId,
EnforceOnBuildValues.UseCoalesceCompoundAssignment,
CodeStyleOptions2.PreferCompoundAssignment,
new LocalizableResourceString(nameof(AnalyzersResources.Use_compound_assignment), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
{
......
......@@ -24,6 +24,7 @@ internal class CSharpUseDeconstructionDiagnosticAnalyzer : AbstractBuiltInCodeSt
{
public CSharpUseDeconstructionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseDeconstructionDiagnosticId,
EnforceOnBuildValues.UseDeconstruction,
CSharpCodeStyleOptions.PreferDeconstructedVariableDeclaration,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Deconstruct_variable_declaration), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -19,6 +19,7 @@ internal class CSharpUseDefaultLiteralDiagnosticAnalyzer : AbstractBuiltInCodeSt
{
public CSharpUseDefaultLiteralDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseDefaultLiteralDiagnosticId,
EnforceOnBuildValues.UseDefaultLiteral,
CSharpCodeStyleOptions.PreferSimpleDefaultExpression,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Simplify_default_expression), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -18,6 +18,7 @@ internal class UseExpressionBodyForAccessorsHelper :
private UseExpressionBodyForAccessorsHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForAccessorsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForAccessors,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_accessors), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_accessors), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedAccessors,
......
......@@ -18,6 +18,7 @@ internal class UseExpressionBodyForConstructorsHelper :
private UseExpressionBodyForConstructorsHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForConstructorsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForConstructors,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_constructors), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_constructors), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedConstructors,
......
......@@ -18,6 +18,7 @@ internal class UseExpressionBodyForConversionOperatorsHelper :
private UseExpressionBodyForConversionOperatorsHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForConversionOperatorsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForConversionOperators,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_operators), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_operators), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedOperators,
......
......@@ -20,6 +20,7 @@ internal class UseExpressionBodyForIndexersHelper :
private UseExpressionBodyForIndexersHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForIndexersDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForIndexers,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_indexers), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_indexers), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedIndexers,
......
......@@ -19,6 +19,7 @@ internal class UseExpressionBodyForLocalFunctionHelper :
private UseExpressionBodyForLocalFunctionHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForLocalFunctionsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForLocalFunctions,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_local_functions), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_local_functions), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedLocalFunctions,
......
......@@ -19,6 +19,7 @@ internal class UseExpressionBodyForMethodsHelper :
private UseExpressionBodyForMethodsHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForMethodsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForMethods,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_methods), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_methods), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedMethods,
......
......@@ -18,6 +18,7 @@ internal class UseExpressionBodyForOperatorsHelper :
private UseExpressionBodyForOperatorsHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForOperatorsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForOperators,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_operators), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_operators), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedOperators,
......
......@@ -20,6 +20,7 @@ internal class UseExpressionBodyForPropertiesHelper :
private UseExpressionBodyForPropertiesHelper()
: base(IDEDiagnosticIds.UseExpressionBodyForPropertiesDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForProperties,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_expression_body_for_properties), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_block_body_for_properties), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
CSharpCodeStyleOptions.PreferExpressionBodiedProperties,
......
......@@ -21,6 +21,7 @@ internal abstract class UseExpressionBodyHelper
public abstract LocalizableString UseExpressionBodyTitle { get; }
public abstract LocalizableString UseBlockBodyTitle { get; }
public abstract string DiagnosticId { get; }
public abstract EnforceOnBuild EnforceOnBuild { get; }
public abstract ImmutableArray<SyntaxKind> SyntaxKinds { get; }
public abstract BlockSyntax GetBody(SyntaxNode declaration);
......
......@@ -31,16 +31,19 @@ internal abstract class UseExpressionBodyHelper<TDeclaration> : UseExpressionBod
public override LocalizableString UseExpressionBodyTitle { get; }
public override LocalizableString UseBlockBodyTitle { get; }
public override string DiagnosticId { get; }
public override EnforceOnBuild EnforceOnBuild { get; }
public override ImmutableArray<SyntaxKind> SyntaxKinds { get; }
protected UseExpressionBodyHelper(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
LocalizableString useExpressionBodyTitle,
LocalizableString useBlockBodyTitle,
Option2<CodeStyleOption2<ExpressionBodyPreference>> option,
ImmutableArray<SyntaxKind> syntaxKinds)
{
DiagnosticId = diagnosticId;
EnforceOnBuild = enforceOnBuild;
Option = option;
UseExpressionBodyTitle = useExpressionBodyTitle;
UseBlockBodyTitle = useBlockBodyTitle;
......
......@@ -36,7 +36,7 @@ public UseExpressionBodyDiagnosticAnalyzer()
var builder = ImmutableDictionary.CreateBuilder<DiagnosticDescriptor, ILanguageSpecificOption>();
foreach (var helper in _helpers)
{
var descriptor = CreateDescriptorWithId(helper.DiagnosticId, helper.UseExpressionBodyTitle, helper.UseExpressionBodyTitle);
var descriptor = CreateDescriptorWithId(helper.DiagnosticId, helper.EnforceOnBuild, helper.UseExpressionBodyTitle, helper.UseExpressionBodyTitle);
builder.Add(descriptor, helper.Option);
}
......@@ -105,7 +105,7 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
var additionalLocations = ImmutableArray.Create(declaration.GetLocation());
var properties = ImmutableDictionary<string, string>.Empty.Add(nameof(UseExpressionBody), "");
return DiagnosticHelper.Create(
CreateDescriptorWithId(helper.DiagnosticId, helper.UseExpressionBodyTitle, helper.UseExpressionBodyTitle),
CreateDescriptorWithId(helper.DiagnosticId, helper.EnforceOnBuild, helper.UseExpressionBodyTitle, helper.UseExpressionBodyTitle),
location, severity, additionalLocations: additionalLocations, properties: properties);
}
......@@ -126,7 +126,7 @@ private void AnalyzeSyntax(SyntaxNodeAnalysisContext context)
var additionalLocations = ImmutableArray.Create(declaration.GetLocation());
return DiagnosticHelper.Create(
CreateDescriptorWithId(helper.DiagnosticId, helper.UseBlockBodyTitle, helper.UseBlockBodyTitle),
CreateDescriptorWithId(helper.DiagnosticId, helper.EnforceOnBuild, helper.UseBlockBodyTitle, helper.UseBlockBodyTitle),
location, severity, additionalLocations: additionalLocations, properties: properties);
}
......
......@@ -18,6 +18,7 @@ internal class CSharpUseImplicitObjectCreationDiagnosticAnalyzer : AbstractBuilt
{
public CSharpUseImplicitObjectCreationDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseImplicitObjectCreationDiagnosticId,
EnforceOnBuildValues.UseImplicitObjectCreation,
CSharpCodeStyleOptions.ImplicitObjectCreationWhenTypeIsApparent,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_new), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -25,8 +25,9 @@ internal abstract partial class CSharpTypeStyleDiagnosticAnalyzerBase :
protected abstract CSharpTypeStyleHelper Helper { get; }
protected CSharpTypeStyleDiagnosticAnalyzerBase(
string diagnosticId, LocalizableString title, LocalizableString message)
string diagnosticId, EnforceOnBuild enforceOnBuild, LocalizableString title, LocalizableString message)
: base(diagnosticId,
enforceOnBuild,
ImmutableHashSet.Create<ILanguageSpecificOption>(CSharpCodeStyleOptions.VarForBuiltInTypes, CSharpCodeStyleOptions.VarWhenTypeIsApparent, CSharpCodeStyleOptions.VarElsewhere),
LanguageNames.CSharp,
title, message)
......
......@@ -22,6 +22,7 @@ internal sealed class CSharpUseExplicitTypeDiagnosticAnalyzer : CSharpTypeStyleD
public CSharpUseExplicitTypeDiagnosticAnalyzer()
: base(diagnosticId: IDEDiagnosticIds.UseExplicitTypeDiagnosticId,
enforceOnBuild: EnforceOnBuildValues.UseExplicitType,
title: s_Title,
message: s_Message)
{
......
......@@ -22,6 +22,7 @@ internal sealed class CSharpUseImplicitTypeDiagnosticAnalyzer : CSharpTypeStyleD
public CSharpUseImplicitTypeDiagnosticAnalyzer()
: base(diagnosticId: IDEDiagnosticIds.UseImplicitTypeDiagnosticId,
enforceOnBuild: EnforceOnBuildValues.UseImplicitType,
title: s_Title,
message: s_Message)
{
......
......@@ -46,6 +46,7 @@ internal partial class CSharpUseIndexOperatorDiagnosticAnalyzer : AbstractBuiltI
{
public CSharpUseIndexOperatorDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseIndexOperatorDiagnosticId,
EnforceOnBuildValues.UseIndexOperator,
CSharpCodeStyleOptions.PreferIndexOperator,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_index_operator), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -44,6 +44,7 @@ internal partial class CSharpUseRangeOperatorDiagnosticAnalyzer : AbstractBuiltI
public CSharpUseRangeOperatorDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseRangeOperatorDiagnosticId,
EnforceOnBuildValues.UseRangeOperator,
CSharpCodeStyleOptions.PreferRangeOperator,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_range_operator), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -21,6 +21,7 @@ internal class CSharpUseIsNullCheckForCastAndEqualityOperatorDiagnosticAnalyzer
public CSharpUseIsNullCheckForCastAndEqualityOperatorDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseIsNullCheckDiagnosticId,
EnforceOnBuildValues.UseIsNullCheck,
CodeStyleOptions2.PreferIsNullCheckOverReferenceEqualityMethod,
CSharpAnalyzersResources.Use_is_null_check,
new LocalizableResourceString(nameof(AnalyzersResources.Null_check_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -44,6 +44,7 @@ internal class CSharpUseLocalFunctionDiagnosticAnalyzer : AbstractBuiltInCodeSty
{
public CSharpUseLocalFunctionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseLocalFunctionDiagnosticId,
EnforceOnBuildValues.UseLocalFunction,
CSharpCodeStyleOptions.PreferLocalOverAnonymousFunction,
LanguageNames.CSharp,
new LocalizableResourceString(
......
......@@ -20,6 +20,7 @@ internal sealed class CSharpUsePatternCombinatorsDiagnosticAnalyzer :
{
public CSharpUsePatternCombinatorsDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UsePatternCombinatorsDiagnosticId,
EnforceOnBuildValues.UsePatternCombinators,
CSharpCodeStyleOptions.PreferPatternMatching,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_pattern_matching), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -31,6 +31,7 @@ internal partial class CSharpAsAndNullCheckDiagnosticAnalyzer : AbstractBuiltInC
{
public CSharpAsAndNullCheckDiagnosticAnalyzer()
: base(IDEDiagnosticIds.InlineAsTypeCheckId,
EnforceOnBuildValues.InlineAsType,
CSharpCodeStyleOptions.PreferPatternMatchingOverAsWithNullCheck,
LanguageNames.CSharp,
new LocalizableResourceString(
......
......@@ -36,6 +36,7 @@ internal class CSharpIsAndCastCheckDiagnosticAnalyzer : AbstractBuiltInCodeStyle
public CSharpIsAndCastCheckDiagnosticAnalyzer()
: base(IDEDiagnosticIds.InlineIsTypeCheckId,
EnforceOnBuildValues.InlineIsType,
CSharpCodeStyleOptions.PreferPatternMatchingOverIsWithCastCheck,
LanguageNames.CSharp,
new LocalizableResourceString(
......
......@@ -27,6 +27,7 @@ internal partial class CSharpUseNotPatternDiagnosticAnalyzer : AbstractBuiltInCo
{
public CSharpUseNotPatternDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseNotPatternDiagnosticId,
EnforceOnBuildValues.UseNotPattern,
CSharpCodeStyleOptions.PreferNotPattern,
LanguageNames.CSharp,
new LocalizableResourceString(
......
......@@ -53,6 +53,7 @@ internal class UseSimpleUsingStatementDiagnosticAnalyzer : AbstractBuiltInCodeSt
{
public UseSimpleUsingStatementDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseSimpleUsingStatementDiagnosticId,
EnforceOnBuildValues.UseSimpleUsingStatement,
CSharpCodeStyleOptions.PreferSimpleUsingStatement,
LanguageNames.CSharp,
new LocalizableResourceString(nameof(CSharpAnalyzersResources.Use_simple_using_statement), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)),
......
......@@ -22,6 +22,7 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// unique <see cref="IPerLanguageOption"/> code style option.
/// </summary>
/// <param name="diagnosticId">Diagnostic ID reported by this analyzer</param>
/// <param name="enforceOnBuild">Build enforcement recommendation for this analyzer</param>
/// <param name="option">
/// Per-language option that can be used to configure the given <paramref name="diagnosticId"/>.
/// <see langword="null"/>, if there is no such unique option.
......@@ -35,12 +36,13 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// <param name="configurable">Flag indicating if the reported diagnostics are configurable by the end users</param>
protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
IPerLanguageOption? option,
LocalizableString title,
LocalizableString? messageFormat = null,
bool isUnnecessary = false,
bool configurable = true)
: this(diagnosticId, title, messageFormat, isUnnecessary, configurable)
: this(diagnosticId, enforceOnBuild, title, messageFormat, isUnnecessary, configurable)
{
AddDiagnosticIdToOptionMapping(diagnosticId, option);
}
......@@ -50,6 +52,7 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// unique <see cref="ILanguageSpecificOption"/> code style option for the given language.
/// </summary>
/// <param name="diagnosticId">Diagnostic ID reported by this analyzer</param>
/// <param name="enforceOnBuild">Build enforcement recommendation for this analyzer</param>
/// <param name="option">
/// Language specific option that can be used to configure the given <paramref name="diagnosticId"/>.
/// <see langword="null"/>, if there is no such unique option.
......@@ -64,13 +67,14 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// <param name="configurable">Flag indicating if the reported diagnostics are configurable by the end users</param>
protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
ILanguageSpecificOption? option,
string language,
LocalizableString title,
LocalizableString? messageFormat = null,
bool isUnnecessary = false,
bool configurable = true)
: this(diagnosticId, title, messageFormat, isUnnecessary, configurable)
: this(diagnosticId, enforceOnBuild, title, messageFormat, isUnnecessary, configurable)
{
AddDiagnosticIdToOptionMapping(diagnosticId, option, language);
}
......@@ -80,6 +84,7 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// two or more <see cref="IPerLanguageOption"/> code style options.
/// </summary>
/// <param name="diagnosticId">Diagnostic ID reported by this analyzer</param>
/// <param name="enforceOnBuild">Build enforcement recommendation for this analyzer</param>
/// <param name="options">
/// Set of two or more per-language options that can be used to configure the diagnostic severity of the given diagnosticId.
/// </param>
......@@ -92,12 +97,13 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// <param name="configurable">Flag indicating if the reported diagnostics are configurable by the end users</param>
protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
ImmutableHashSet<IPerLanguageOption> options,
LocalizableString title,
LocalizableString? messageFormat = null,
bool isUnnecessary = false,
bool configurable = true)
: this(diagnosticId, title, messageFormat, isUnnecessary, configurable)
: this(diagnosticId, enforceOnBuild, title, messageFormat, isUnnecessary, configurable)
{
RoslynDebug.Assert(options != null);
Debug.Assert(options.Count > 1);
......@@ -109,6 +115,7 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// two or more <see cref="ILanguageSpecificOption"/> code style options for the given language.
/// </summary>
/// <param name="diagnosticId">Diagnostic ID reported by this analyzer</param>
/// <param name="enforceOnBuild">Build enforcement recommendation for this analyzer</param>
/// <param name="options">
/// Set of two or more language-specific options that can be used to configure the diagnostic severity of the given diagnosticId.
/// </param>
......@@ -122,13 +129,14 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer
/// <param name="configurable">Flag indicating if the reported diagnostics are configurable by the end users</param>
protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(
string diagnosticId,
EnforceOnBuild enforceOnBuild,
ImmutableHashSet<ILanguageSpecificOption> options,
string language,
LocalizableString title,
LocalizableString? messageFormat = null,
bool isUnnecessary = false,
bool configurable = true)
: this(diagnosticId, title, messageFormat, isUnnecessary, configurable)
: this(diagnosticId, enforceOnBuild, title, messageFormat, isUnnecessary, configurable)
{
RoslynDebug.Assert(options != null);
Debug.Assert(options.Count > 1);
......
......@@ -17,7 +17,9 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer : Dia
protected readonly LocalizableString _localizableMessageFormat;
private AbstractBuiltInCodeStyleDiagnosticAnalyzer(
string descriptorId, LocalizableString title,
string descriptorId,
EnforceOnBuild enforceOnBuild,
LocalizableString title,
LocalizableString? messageFormat,
bool isUnnecessary,
bool configurable)
......@@ -26,7 +28,7 @@ internal abstract partial class AbstractBuiltInCodeStyleDiagnosticAnalyzer : Dia
_localizableTitle = title;
_localizableMessageFormat = messageFormat ?? title;
Descriptor = CreateDescriptorWithId(DescriptorId, _localizableTitle, _localizableMessageFormat, isUnnecessary: isUnnecessary, isConfigurable: configurable);
Descriptor = CreateDescriptorWithId(DescriptorId, enforceOnBuild, _localizableTitle, _localizableMessageFormat, isUnnecessary: isUnnecessary, isConfigurable: configurable);
SupportedDiagnostics = ImmutableArray.Create(Descriptor);
}
......@@ -46,12 +48,12 @@ protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(ImmutableArray<DiagnosticDe
protected static DiagnosticDescriptor CreateDescriptorWithId(
string id,
EnforceOnBuild enforceOnBuild,
LocalizableString title,
LocalizableString messageFormat,
bool isUnnecessary = false,
bool isConfigurable = true,
LocalizableString? description = null,
params string[] customTags)
LocalizableString? description = null)
=> new(
id, title, messageFormat,
DiagnosticCategory.Style,
......@@ -59,7 +61,7 @@ protected AbstractBuiltInCodeStyleDiagnosticAnalyzer(ImmutableArray<DiagnosticDe
isEnabledByDefault: true,
description: description,
helpLinkUri: DiagnosticHelper.GetHelpLinkForDiagnosticId(id),
customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, customTags));
customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, enforceOnBuild));
public sealed override void Initialize(AnalysisContext context)
{
......
......@@ -5,6 +5,7 @@
#nullable disable
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
#if CODE_STYLE
......@@ -46,13 +47,13 @@ public bool OpenFileOnly(OptionSet options)
protected static DiagnosticDescriptor CreateDescriptor(
string id,
EnforceOnBuild enforceOnBuild,
LocalizableString title,
LocalizableString messageFormat,
bool isUnnecessary,
bool isEnabledByDefault = true,
bool isConfigurable = true,
LocalizableString description = null,
params string[] customTags)
LocalizableString description = null)
=> new(
id, title, messageFormat,
DiagnosticCategory.CodeQuality,
......@@ -60,6 +61,6 @@ public bool OpenFileOnly(OptionSet options)
isEnabledByDefault,
description,
helpLinkUri: DiagnosticHelper.GetHelpLinkForDiagnosticId(id),
customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, customTags));
customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, enforceOnBuild));
}
}
......@@ -15,8 +15,9 @@ namespace Microsoft.CodeAnalysis.RemoveUnnecessaryParentheses
internal abstract class AbstractParenthesesDiagnosticAnalyzer : AbstractBuiltInCodeStyleDiagnosticAnalyzer
{
protected AbstractParenthesesDiagnosticAnalyzer(
string descriptorId, LocalizableString title, LocalizableString message, bool isUnnecessary = false)
string descriptorId, EnforceOnBuild enforceOnBuild, LocalizableString title, LocalizableString message, bool isUnnecessary = false)
: base(descriptorId,
enforceOnBuild,
options: ImmutableHashSet.Create<IPerLanguageOption>(CodeStyleOptions2.ArithmeticBinaryParentheses, CodeStyleOptions2.RelationalBinaryParentheses, CodeStyleOptions2.OtherBinaryParentheses, CodeStyleOptions2.OtherParentheses),
title,
message,
......
......@@ -15,6 +15,7 @@ internal abstract class AbstractAddAccessibilityModifiersDiagnosticAnalyzer<TCom
{
protected AbstractAddAccessibilityModifiersDiagnosticAnalyzer()
: base(IDEDiagnosticIds.AddAccessibilityModifiersDiagnosticId,
EnforceOnBuildValues.AddAccessibilityModifiers,
CodeStyleOptions2.RequireAccessibilityModifiers,
new LocalizableResourceString(nameof(AnalyzersResources.Add_accessibility_modifiers), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Accessibility_modifiers_required), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -64,6 +64,7 @@ private static string GetEquivalenceKey(PerLanguageOption2<CodeStyleOption2<Pare
protected AbstractAddRequiredParenthesesDiagnosticAnalyzer(IPrecedenceService precedenceService)
: base(IDEDiagnosticIds.AddRequiredParenthesesDiagnosticId,
EnforceOnBuildValues.AddRequiredParentheses,
new LocalizableResourceString(nameof(AnalyzersResources.Add_parentheses_for_clarity), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Parentheses_should_be_added_for_clarity), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
{
......
......@@ -29,6 +29,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Helpers\AnalyzerHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\DeserializationConstructorCheck.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Helpers\DiagnosticHelper.cs" />
<Compile Include="$(MSBuildThisFileDirectory)EnforceOnBuildValues.cs" />
<Compile Include="$(MSBuildThisFileDirectory)EnforceOnBuild.cs" />
<Compile Include="$(MSBuildThisFileDirectory)IDEDiagnosticIds.cs" />
<Compile Include="$(MSBuildThisFileDirectory)IDEDiagnosticIdToOptionMappingHelper.cs" />
......@@ -92,4 +93,4 @@
<ItemGroup Condition="'$(DefaultLanguageSourceExtension)' != '' AND '$(BuildingInsideVisualStudio)' != 'true'">
<ExpectedCompile Include="$(MSBuildThisFileDirectory)**\*$(DefaultLanguageSourceExtension)" />
</ItemGroup>
</Project>
\ No newline at end of file
</Project>
......@@ -19,6 +19,7 @@ internal abstract class AbstractConvertAnonymousTypeToTupleDiagnosticAnalyzer<
protected AbstractConvertAnonymousTypeToTupleDiagnosticAnalyzer(ISyntaxKinds syntaxKinds)
: base(IDEDiagnosticIds.ConvertAnonymousTypeToTupleDiagnosticId,
EnforceOnBuildValues.ConvertAnonymousTypeToTuple,
option: null,
new LocalizableResourceString(nameof(AnalyzersResources.Convert_to_tuple), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Convert_to_tuple), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -16,6 +16,7 @@ internal abstract class AbstractConvertTypeOfToNameOfDiagnosticAnalyzer : Abstra
{
protected AbstractConvertTypeOfToNameOfDiagnosticAnalyzer(LocalizableString title, string language)
: base(diagnosticId: IDEDiagnosticIds.ConvertTypeOfToNameOfDiagnosticId,
EnforceOnBuildValues.ConvertTypeOfToNameOf,
option: null,
language: language,
title: title)
......
......@@ -6,19 +6,19 @@
using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq;
using Roslyn.Utilities;
using Microsoft.CodeAnalysis.CodeStyle;
namespace Microsoft.CodeAnalysis.Diagnostics
{
internal static class DiagnosticCustomTags
{
/// <summary>
/// it is string[] because DiagnosticDescriptor expects string[].
/// </summary>
private static readonly string s_enforceOnBuildNeverTag = EnforceOnBuild.Never.ToCustomTag();
private static readonly string[] s_microsoftCustomTags = new string[] { WellKnownDiagnosticTags.Telemetry };
private static readonly string[] s_editAndContinueCustomTags = new string[] { WellKnownDiagnosticTags.EditAndContinue, WellKnownDiagnosticTags.Telemetry, WellKnownDiagnosticTags.NotConfigurable };
private static readonly string[] s_editAndContinueCustomTags = new string[] { WellKnownDiagnosticTags.EditAndContinue, WellKnownDiagnosticTags.Telemetry, WellKnownDiagnosticTags.NotConfigurable, s_enforceOnBuildNeverTag };
private static readonly string[] s_unnecessaryCustomTags = new string[] { WellKnownDiagnosticTags.Unnecessary, WellKnownDiagnosticTags.Telemetry };
private static readonly string[] s_notConfigurableCustomTags = new string[] { WellKnownDiagnosticTags.NotConfigurable, s_enforceOnBuildNeverTag, WellKnownDiagnosticTags.Telemetry };
private static readonly string[] s_unnecessaryAndNotConfigurableCustomTags = new string[] { WellKnownDiagnosticTags.Unnecessary, WellKnownDiagnosticTags.NotConfigurable, s_enforceOnBuildNeverTag, WellKnownDiagnosticTags.Telemetry };
public static string[] Microsoft
{
......@@ -33,7 +33,7 @@ public static string[] EditAndContinue
{
get
{
Assert(s_editAndContinueCustomTags, WellKnownDiagnosticTags.EditAndContinue, WellKnownDiagnosticTags.Telemetry, WellKnownDiagnosticTags.NotConfigurable);
Assert(s_editAndContinueCustomTags, WellKnownDiagnosticTags.EditAndContinue, WellKnownDiagnosticTags.Telemetry, WellKnownDiagnosticTags.NotConfigurable, s_enforceOnBuildNeverTag);
return s_editAndContinueCustomTags;
}
}
......@@ -47,6 +47,24 @@ public static string[] Unnecessary
}
}
public static string[] NotConfigurable
{
get
{
Assert(s_notConfigurableCustomTags, WellKnownDiagnosticTags.NotConfigurable, s_enforceOnBuildNeverTag, WellKnownDiagnosticTags.Telemetry);
return s_notConfigurableCustomTags;
}
}
public static string[] UnnecessaryAndNotConfigurable
{
get
{
Assert(s_unnecessaryAndNotConfigurableCustomTags, WellKnownDiagnosticTags.Unnecessary, WellKnownDiagnosticTags.NotConfigurable, s_enforceOnBuildNeverTag, WellKnownDiagnosticTags.Telemetry);
return s_unnecessaryAndNotConfigurableCustomTags;
}
}
[Conditional("DEBUG")]
private static void Assert(string[] customTags, params string[] tags)
{
......@@ -58,15 +76,14 @@ private static void Assert(string[] customTags, params string[] tags)
}
}
internal static string[] Create(bool isUnnecessary, bool isConfigurable, params string[] customTags)
internal static string[] Create(bool isUnnecessary, bool isConfigurable, EnforceOnBuild enforceOnBuild)
{
if (customTags.Length == 0 && isConfigurable)
{
return isUnnecessary ? Unnecessary : Microsoft;
}
Debug.Assert(isConfigurable || enforceOnBuild == EnforceOnBuild.Never);
var customTagsBuilder = ImmutableArray.CreateBuilder<string>();
customTagsBuilder.AddRange(customTags.Concat(Microsoft));
customTagsBuilder.AddRange(Microsoft);
customTagsBuilder.Add(enforceOnBuild.ToCustomTag());
if (!isConfigurable)
{
......
......@@ -9,9 +9,28 @@ namespace Microsoft.CodeAnalysis.CodeStyle
/// </summary>
internal enum EnforceOnBuild
{
/// <summary>
/// Indicates that the code style diagnostic is an IDE-only diagnostic that cannot be enforced on build.
/// </summary>
Never,
/// <summary>
/// Indicates that the code style diagnostic can be enforced on build when explicitly enabled in a configuration file,
/// but is not part of the <see cref="Recommended"/> or <see cref="HighlyRecommended"/> group for build enforcement.
/// <para>This is the suggested <b>P3</b> bucket of code style diagnostics to enforce on build.</para>
/// </summary>
WhenExplicitlyEnabled,
/// <summary>
/// Indicates that the code style diagnostic can be enforced on build and is part of the recommended group for build enforcement.
/// <para>This is the suggested <b>P2</b> bucket of code style diagnostics to enforce on build.</para>
/// </summary>
Recommended,
/// <summary>
/// Indicates that the code style diagnostic can be enforced on build and is part of the highly recommended group for build enforcement.
/// <para>This is the suggested <b>P1</b> bucket of code style diagnostics to enforce on build.</para>
/// </summary>
HighlyRecommended,
}
......
// 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 Microsoft.CodeAnalysis.CodeStyle;
namespace Microsoft.CodeAnalysis.Diagnostics
{
internal static class EnforceOnBuildValues
{
/* EnforceOnBuild.HighlyRecommended */
public const EnforceOnBuild RemoveUnnecessaryImports = /*IDE0005*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild UseImplicitType = /*IDE0007*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild UseExplicitType = /*IDE0008*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild AddBraces = /*IDE0011*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild OrderModifiers = /*IDE0036*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild AddAccessibilityModifiers = /*IDE0040*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild ValidateFormatString = /*IDE0043*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild MakeFieldReadonly = /*IDE0044*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild RemoveUnusedMembers = /*IDE0051*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild RemoveUnreadMembers = /*IDE0052*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild Formatting = /*IDE0055*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild ValueAssignedIsUnused = /*IDE0059*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild UnusedParameter = /*IDE0060*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild FileHeaderMismatch = /*IDE0073*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild InvalidSuppressMessageAttribute = /*IDE0076*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild LegacyFormatSuppressMessageAttribute = /*IDE0077*/ EnforceOnBuild.HighlyRecommended;
public const EnforceOnBuild RemoveConfusingSuppressionForIsExpression = /*IDE0080*/ EnforceOnBuild.HighlyRecommended;
/* EnforceOnBuild.Recommended */
public const EnforceOnBuild UseThrowExpression = /*IDE0016*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseObjectInitializer = /*IDE0017*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild InlineDeclaration = /*IDE0018*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild InlineAsType = /*IDE0019*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild InlineIsType = /*IDE0020*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForConstructors = /*IDE0021*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForMethods = /*IDE0022*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForConversionOperators = /*IDE0023*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForOperators = /*IDE0024*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForProperties = /*IDE0025*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForIndexers = /*IDE0026*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForAccessors = /*IDE0027*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseCollectionInitializer = /*IDE0028*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseCoalesceExpression = /*IDE0029*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseCoalesceExpressionForNullable = /*IDE0030*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseNullPropagation = /*IDE0031*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseAutoProperty = /*IDE0032*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExplicitTupleName = /*IDE0033*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseDefaultLiteral = /*IDE0034*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild InlineIsTypeWithoutName = /*IDE0038*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseLocalFunction = /*IDE0039*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseDeconstruction = /*IDE0042*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseConditionalExpressionForAssignment = /*IDE0045*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseConditionalExpressionForReturn = /*IDE0046*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild RemoveUnnecessaryParentheses = /*IDE0047*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild ConvertAnonymousTypeToTuple = /*IDE0050*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForLambdaExpressions = /*IDE0053*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseCompoundAssignment = /*IDE0054*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseIndexOperator = /*IDE0056*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseRangeOperator = /*IDE0057*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseExpressionBodyForLocalFunctions = /*IDE0061*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild MakeLocalFunctionStatic = /*IDE0062*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseSimpleUsingStatement = /*IDE0063*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild MoveMisplacedUsingDirectives = /*IDE0065*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseSystemHashCode = /*IDE0070*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild SimplifyInterpolation = /*IDE0071*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseCoalesceCompoundAssignment = /*IDE0074*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild SimplifyConditionalExpression = /*IDE0075*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UsePatternCombinators = /*IDE0078*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild RemoveUnnecessaryByVal = /*IDE0081*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild ConvertTypeOfToNameOf = /*IDE0082*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseNotPattern = /*IDE0083*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseIsNotExpression = /*IDE0084*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild UseImplicitObjectCreation = /*IDE0090*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild RemoveRedundantEquality = /*IDE0100*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild RemoveUnnecessaryDiscardDesignation = /*IDE0110*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild InvokeDelegateWithConditionalAccess = /*IDE1005*/ EnforceOnBuild.Recommended;
public const EnforceOnBuild NamingRule = /*IDE1006*/ EnforceOnBuild.Recommended;
/* EnforceOnBuild.WhenExplicitlyEnabled */
public const EnforceOnBuild RemoveUnnecessaryCast = /*IDE0004*/ EnforceOnBuild.WhenExplicitlyEnabled; // TODO: Move to 'Recommended' OR 'HighlyRecommended' bucket once performance problems are addressed: https://github.com/dotnet/roslyn/issues/43304
public const EnforceOnBuild PopulateSwitchStatement = /*IDE0010*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild UseInferredMemberName = /*IDE0037*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild UseIsNullCheck = /*IDE0041*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild AddRequiredParentheses = /*IDE0048*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild ExpressionValueIsUnused = /*IDE0058*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild MakeStructFieldsWritable = /*IDE0064*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild ConvertSwitchStatementToExpression = /*IDE0066*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild DisposeObjectsBeforeLosingScope = /*IDE0067*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild UseRecommendedDisposePattern = /*IDE0068*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild DisposableFieldsShouldBeDisposed = /*IDE0069*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild PopulateSwitchExpression = /*IDE0072*/ EnforceOnBuild.WhenExplicitlyEnabled;
public const EnforceOnBuild Regex = /*RE0001*/ EnforceOnBuild.WhenExplicitlyEnabled;
/* EnforceOnBuild.Never */
// TODO: Allow enforcing simplify names and related diagnostics on build once we validate their performance charactericstics.
public const EnforceOnBuild SimplifyNames = /*IDE0001*/ EnforceOnBuild.Never;
public const EnforceOnBuild SimplifyMemberAccess = /*IDE0002*/ EnforceOnBuild.Never;
public const EnforceOnBuild RemoveQualification = /*IDE0003*/ EnforceOnBuild.Never;
public const EnforceOnBuild AddQualification = /*IDE0009*/ EnforceOnBuild.Never;
public const EnforceOnBuild PreferBuiltInOrFrameworkType = /*IDE0049*/ EnforceOnBuild.Never;
public const EnforceOnBuild RemoveUnreachableCode = /*IDE0035*/ EnforceOnBuild.Never; // Non-configurable fading diagnostic corresponding to CS0162.
public const EnforceOnBuild RemoveUnnecessarySuppression = /*IDE0079*/ EnforceOnBuild.Never; // IDE-only analyzer.
// Analyzer error Ids
public const EnforceOnBuild IntellisenseBuildFailed = /*IDE0006*/ EnforceOnBuild.Never;
public const EnforceOnBuild AnalyzerChanged = /*IDE1001*/ EnforceOnBuild.Never;
public const EnforceOnBuild AnalyzerDependencyConflict = /*IDE1002*/ EnforceOnBuild.Never;
public const EnforceOnBuild MissingAnalyzerReference = /*IDE1003*/ EnforceOnBuild.Never;
public const EnforceOnBuild ErrorReadingRuleset = /*IDE1004*/ EnforceOnBuild.Never;
public const EnforceOnBuild UnboundIdentifier = /*IDE1007*/ EnforceOnBuild.Never;
public const EnforceOnBuild UnboundConstructor = /*IDE1008*/ EnforceOnBuild.Never;
}
}
......@@ -14,6 +14,7 @@ internal abstract class AbstractFileHeaderDiagnosticAnalyzer : AbstractBuiltInCo
protected AbstractFileHeaderDiagnosticAnalyzer(string language)
: base(
IDEDiagnosticIds.FileHeaderMismatch,
EnforceOnBuildValues.FileHeaderMismatch,
CodeStyleOptions2.FileHeaderTemplate,
language,
new LocalizableResourceString(nameof(AnalyzersResources.The_file_header_is_missing_or_not_located_at_the_top_of_the_file), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
......@@ -23,7 +24,7 @@ protected AbstractFileHeaderDiagnosticAnalyzer(string language)
var invalidHeaderTitle = new LocalizableResourceString(nameof(AnalyzersResources.The_file_header_does_not_match_the_required_text), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
var invalidHeaderMessage = new LocalizableResourceString(nameof(AnalyzersResources.A_source_file_contains_a_header_that_does_not_match_the_required_text), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
InvalidHeaderDescriptor = CreateDescriptorWithId(DescriptorId, invalidHeaderTitle, invalidHeaderMessage);
InvalidHeaderDescriptor = CreateDescriptorWithId(DescriptorId, EnforceOnBuildValues.FileHeaderMismatch, invalidHeaderTitle, invalidHeaderMessage);
}
protected abstract AbstractFileHeaderHelper FileHeaderHelper { get; }
......
......@@ -22,6 +22,7 @@ internal sealed class MakeFieldReadonlyDiagnosticAnalyzer
public MakeFieldReadonlyDiagnosticAnalyzer()
: base(
IDEDiagnosticIds.MakeFieldReadonlyDiagnosticId,
EnforceOnBuildValues.MakeFieldReadonly,
CodeStyleOptions2.PreferReadonly,
new LocalizableResourceString(nameof(AnalyzersResources.Add_readonly_modifier), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Make_field_readonly), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -24,6 +24,7 @@ internal abstract class NamingStyleDiagnosticAnalyzerBase<TLanguageKindEnum>
protected NamingStyleDiagnosticAnalyzerBase()
: base(IDEDiagnosticIds.NamingRuleId,
EnforceOnBuildValues.NamingRule,
option: null, // No unique option to configure the diagnosticId
s_localizableTitleNamingStyle,
s_localizableMessageFormat)
......
......@@ -25,6 +25,7 @@ internal abstract class AbstractOrderModifiersDiagnosticAnalyzer : AbstractBuilt
AbstractOrderModifiersHelpers helpers,
string language)
: base(IDEDiagnosticIds.OrderModifiersDiagnosticId,
EnforceOnBuildValues.OrderModifiers,
option,
language,
new LocalizableResourceString(nameof(AnalyzersResources.Order_modifiers), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
......
......@@ -19,8 +19,9 @@ internal abstract class AbstractPopulateSwitchDiagnosticAnalyzer<TSwitchOperatio
private static readonly LocalizableString s_localizableTitle = new LocalizableResourceString(nameof(AnalyzersResources.Add_missing_cases), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
private static readonly LocalizableString s_localizableMessage = new LocalizableResourceString(nameof(AnalyzersResources.Populate_switch), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
protected AbstractPopulateSwitchDiagnosticAnalyzer(string diagnosticId)
protected AbstractPopulateSwitchDiagnosticAnalyzer(string diagnosticId, EnforceOnBuild enforceOnBuild)
: base(diagnosticId,
enforceOnBuild,
option: null,
s_localizableTitle, s_localizableMessage)
{
......
......@@ -13,7 +13,8 @@ internal abstract class AbstractPopulateSwitchExpressionDiagnosticAnalyzer<TSwit
where TSwitchSyntax : SyntaxNode
{
protected AbstractPopulateSwitchExpressionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.PopulateSwitchExpressionDiagnosticId)
: base(IDEDiagnosticIds.PopulateSwitchExpressionDiagnosticId,
EnforceOnBuildValues.PopulateSwitchExpression)
{
}
......
......@@ -13,7 +13,8 @@ internal abstract class AbstractPopulateSwitchStatementDiagnosticAnalyzer<TSwitc
where TSwitchSyntax : SyntaxNode
{
protected AbstractPopulateSwitchStatementDiagnosticAnalyzer()
: base(IDEDiagnosticIds.PopulateSwitchStatementDiagnosticId)
: base(IDEDiagnosticIds.PopulateSwitchStatementDiagnosticId,
EnforceOnBuildValues.PopulateSwitchStatement)
{
}
......
......@@ -28,6 +28,7 @@ internal abstract class AbstractQualifyMemberAccessDiagnosticAnalyzer<
{
protected AbstractQualifyMemberAccessDiagnosticAnalyzer()
: base(IDEDiagnosticIds.AddQualificationDiagnosticId,
EnforceOnBuildValues.AddQualification,
options: ImmutableHashSet.Create<IPerLanguageOption>(CodeStyleOptions2.QualifyFieldAccess, CodeStyleOptions2.QualifyPropertyAccess, CodeStyleOptions2.QualifyMethodAccess, CodeStyleOptions2.QualifyEventAccess),
new LocalizableResourceString(nameof(AnalyzersResources.Member_access_should_be_qualified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Add_this_or_Me_qualification), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -17,6 +17,7 @@ internal abstract class AbstractRemoveRedundantEqualityDiagnosticAnalyzer
protected AbstractRemoveRedundantEqualityDiagnosticAnalyzer(ISyntaxFacts syntaxFacts)
: base(IDEDiagnosticIds.RemoveRedundantEqualityDiagnosticId,
EnforceOnBuildValues.RemoveRedundantEquality,
option: null,
new LocalizableResourceString(nameof(AnalyzersResources.Remove_redundant_equality), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
{
......
......@@ -19,6 +19,7 @@ internal abstract class AbstractRemoveUnnecessaryCastDiagnosticAnalyzer<
{
protected AbstractRemoveUnnecessaryCastDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveUnnecessaryCastDiagnosticId,
EnforceOnBuildValues.RemoveUnnecessaryCast,
option: null,
new LocalizableResourceString(nameof(AnalyzersResources.Remove_Unnecessary_Cast), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(CompilerExtensionsResources.Cast_is_redundant), CompilerExtensionsResources.ResourceManager, typeof(CompilerExtensionsResources)),
......
......@@ -9,6 +9,7 @@
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Fading;
using Microsoft.CodeAnalysis.Shared.Extensions;
......@@ -37,7 +38,7 @@ internal abstract class AbstractRemoveUnnecessaryImportsDiagnosticAnalyzer
title: "", messageFormat: "", category: "",
defaultSeverity: DiagnosticSeverity.Hidden,
isEnabledByDefault: true,
customTags: WellKnownDiagnosticTags.NotConfigurable);
customTags: DiagnosticCustomTags.NotConfigurable);
protected abstract LocalizableString GetTitleAndMessageFormatForClassificationIdDescriptor();
protected abstract ImmutableArray<SyntaxNode> MergeImports(ImmutableArray<SyntaxNode> unnecessaryImports);
......@@ -62,7 +63,7 @@ private void EnsureClassificationIdDescriptors()
DiagnosticCategory.Style,
DiagnosticSeverity.Hidden,
isEnabledByDefault: true,
customTags: DiagnosticCustomTags.Unnecessary);
customTags: DiagnosticCustomTags.Unnecessary.Concat(EnforceOnBuildValues.RemoveUnnecessaryImports.ToCustomTag()).ToArray());
_classificationIdDescriptor =
new DiagnosticDescriptor(IDEDiagnosticIds.RemoveUnnecessaryImportsDiagnosticId,
......@@ -70,7 +71,8 @@ private void EnsureClassificationIdDescriptors()
titleAndMessageFormat,
DiagnosticCategory.Style,
DiagnosticSeverity.Hidden,
isEnabledByDefault: true);
isEnabledByDefault: true,
customTags: EnforceOnBuildValues.RemoveUnnecessaryImports.ToCustomTag());
_unnecessaryGeneratedCodeClassificationIdDescriptor =
new DiagnosticDescriptor(IDEDiagnosticIds.RemoveUnnecessaryImportsDiagnosticId + "_gen",
......@@ -79,7 +81,7 @@ private void EnsureClassificationIdDescriptors()
DiagnosticCategory.Style,
DiagnosticSeverity.Hidden,
isEnabledByDefault: true,
customTags: new[] { WellKnownDiagnosticTags.Telemetry, WellKnownDiagnosticTags.Unnecessary, WellKnownDiagnosticTags.NotConfigurable });
customTags: DiagnosticCustomTags.UnnecessaryAndNotConfigurable);
_generatedCodeClassificationIdDescriptor =
new DiagnosticDescriptor(IDEDiagnosticIds.RemoveUnnecessaryImportsDiagnosticId + "_gen",
......@@ -88,7 +90,7 @@ private void EnsureClassificationIdDescriptors()
DiagnosticCategory.Style,
DiagnosticSeverity.Hidden,
isEnabledByDefault: true,
customTags: new[] { WellKnownDiagnosticTags.Telemetry, WellKnownDiagnosticTags.NotConfigurable });
customTags: DiagnosticCustomTags.NotConfigurable);
}
}
......
......@@ -23,6 +23,7 @@ internal abstract class AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer<
{
protected AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveUnnecessaryParenthesesDiagnosticId,
EnforceOnBuildValues.RemoveUnnecessaryParentheses,
new LocalizableResourceString(nameof(AnalyzersResources.Remove_unnecessary_parentheses), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Parentheses_can_be_removed), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
isUnnecessary: true)
......
......@@ -25,16 +25,22 @@ internal abstract class AbstractRemoveUnnecessaryAttributeSuppressionsDiagnostic
nameof(AnalyzersResources.Invalid_or_missing_target_for_SuppressMessageAttribute), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
private static readonly DiagnosticDescriptor s_invalidScopeDescriptor = CreateDescriptor(
IDEDiagnosticIds.InvalidSuppressMessageAttributeDiagnosticId, s_localizableTitle, s_localizableInvalidScopeMessage, isUnnecessary: true);
IDEDiagnosticIds.InvalidSuppressMessageAttributeDiagnosticId,
EnforceOnBuildValues.InvalidSuppressMessageAttribute,
s_localizableTitle, s_localizableInvalidScopeMessage, isUnnecessary: true);
private static readonly DiagnosticDescriptor s_invalidOrMissingTargetDescriptor = CreateDescriptor(
IDEDiagnosticIds.InvalidSuppressMessageAttributeDiagnosticId, s_localizableTitle, s_localizableInvalidOrMissingTargetMessage, isUnnecessary: true);
IDEDiagnosticIds.InvalidSuppressMessageAttributeDiagnosticId,
EnforceOnBuildValues.InvalidSuppressMessageAttribute,
s_localizableTitle, s_localizableInvalidOrMissingTargetMessage, isUnnecessary: true);
private static readonly LocalizableResourceString s_localizableLegacyFormatTitle = new(
nameof(AnalyzersResources.Avoid_legacy_format_target_in_SuppressMessageAttribute), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
private static readonly LocalizableResourceString s_localizableLegacyFormatMessage = new(
nameof(AnalyzersResources.Avoid_legacy_format_target_0_in_SuppressMessageAttribute), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
internal static readonly DiagnosticDescriptor LegacyFormatTargetDescriptor = CreateDescriptor(
IDEDiagnosticIds.LegacyFormatSuppressMessageAttributeDiagnosticId, s_localizableLegacyFormatTitle, s_localizableLegacyFormatMessage, isUnnecessary: false);
IDEDiagnosticIds.LegacyFormatSuppressMessageAttributeDiagnosticId,
EnforceOnBuildValues.LegacyFormatSuppressMessageAttribute,
s_localizableLegacyFormatTitle, s_localizableLegacyFormatMessage, isUnnecessary: false);
protected AbstractRemoveUnnecessaryAttributeSuppressionsDiagnosticAnalyzer()
: base(ImmutableArray.Create(s_invalidScopeDescriptor, s_invalidOrMissingTargetDescriptor, LegacyFormatTargetDescriptor), GeneratedCodeAnalysisFlags.None)
......
......@@ -28,7 +28,9 @@ internal abstract class AbstractRemoveUnnecessaryInlineSuppressionsDiagnosticAna
private static readonly LocalizableResourceString s_localizableRemoveUnnecessarySuppression = new(
nameof(AnalyzersResources.Remove_unnecessary_suppression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
internal static readonly DiagnosticDescriptor s_removeUnnecessarySuppressionDescriptor = CreateDescriptor(
IDEDiagnosticIds.RemoveUnnecessarySuppressionDiagnosticId, s_localizableRemoveUnnecessarySuppression, s_localizableRemoveUnnecessarySuppression, isUnnecessary: true);
IDEDiagnosticIds.RemoveUnnecessarySuppressionDiagnosticId,
EnforceOnBuildValues.RemoveUnnecessarySuppression,
s_localizableRemoveUnnecessarySuppression, s_localizableRemoveUnnecessarySuppression, isUnnecessary: true);
private readonly Lazy<ImmutableHashSet<int>> _lazySupportedCompilerErrorCodes;
......
......@@ -27,6 +27,7 @@ internal abstract class AbstractRemoveUnusedMembersDiagnosticAnalyzer<TDocumenta
// IDE0051: "Remove unused members" (Symbol is declared but never referenced)
private static readonly DiagnosticDescriptor s_removeUnusedMembersRule = CreateDescriptor(
IDEDiagnosticIds.RemoveUnusedMembersDiagnosticId,
EnforceOnBuildValues.RemoveUnusedMembers,
new LocalizableResourceString(nameof(AnalyzersResources.Remove_unused_private_members), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Private_member_0_is_unused), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
isUnnecessary: true);
......@@ -34,6 +35,7 @@ internal abstract class AbstractRemoveUnusedMembersDiagnosticAnalyzer<TDocumenta
// IDE0052: "Remove unread members" (Value is written and/or symbol is referenced, but the assigned value is never read)
private static readonly DiagnosticDescriptor s_removeUnreadMembersRule = CreateDescriptor(
IDEDiagnosticIds.RemoveUnreadMembersDiagnosticId,
EnforceOnBuildValues.RemoveUnreadMembers,
new LocalizableResourceString(nameof(AnalyzersResources.Remove_unread_private_members), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Private_member_0_can_be_removed_as_the_value_assigned_to_it_is_never_read), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
isUnnecessary: true);
......
......@@ -64,6 +64,7 @@ internal abstract partial class AbstractRemoveUnusedParametersAndValuesDiagnosti
// This is **not** an unnecessary (fading) diagnostic as the expression being flagged is not unncessary, but the dropped value is.
private static readonly DiagnosticDescriptor s_expressionValueIsUnusedRule = CreateDescriptorWithId(
IDEDiagnosticIds.ExpressionValueIsUnusedDiagnosticId,
EnforceOnBuildValues.ExpressionValueIsUnused,
new LocalizableResourceString(nameof(AnalyzersResources.Expression_value_is_never_used), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Expression_value_is_never_used), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
isUnnecessary: false);
......@@ -71,6 +72,7 @@ internal abstract partial class AbstractRemoveUnusedParametersAndValuesDiagnosti
// Diagnostic reported for value assignments to locals/parameters that are never used on any control flow path.
private static readonly DiagnosticDescriptor s_valueAssignedIsUnusedRule = CreateDescriptorWithId(
IDEDiagnosticIds.ValueAssignedIsUnusedDiagnosticId,
EnforceOnBuildValues.ValueAssignedIsUnused,
new LocalizableResourceString(nameof(AnalyzersResources.Unnecessary_assignment_of_a_value), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Unnecessary_assignment_of_a_value_to_0), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
description: new LocalizableResourceString(nameof(AnalyzersResources.Avoid_unnecessary_value_assignments_in_your_code_as_these_likely_indicate_redundant_value_computations_If_the_value_computation_is_not_redundant_and_you_intend_to_retain_the_assignmentcomma_then_change_the_assignment_target_to_a_local_variable_whose_name_starts_with_an_underscore_and_is_optionally_followed_by_an_integercomma_such_as___comma__1_comma__2_comma_etc), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
......@@ -79,6 +81,7 @@ internal abstract partial class AbstractRemoveUnusedParametersAndValuesDiagnosti
// Diagnostic reported for unnecessary parameters that can be removed.
private static readonly DiagnosticDescriptor s_unusedParameterRule = CreateDescriptorWithId(
IDEDiagnosticIds.UnusedParameterDiagnosticId,
EnforceOnBuildValues.UnusedParameter,
new LocalizableResourceString(nameof(AnalyzersResources.Remove_unused_parameter), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Remove_unused_parameter_0), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
description: new LocalizableResourceString(nameof(AnalyzersResources.Avoid_unused_parameters_in_your_code_If_the_parameter_cannot_be_removed_then_change_its_name_so_it_starts_with_an_underscore_and_is_optionally_followed_by_an_integer_such_as__comma__1_comma__2_etc_These_are_treated_as_special_discard_symbol_names), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
......
......@@ -40,6 +40,7 @@ internal abstract class AbstractSimplifyConditionalDiagnosticAnalyzer<
protected AbstractSimplifyConditionalDiagnosticAnalyzer()
: base(IDEDiagnosticIds.SimplifyConditionalExpressionDiagnosticId,
EnforceOnBuildValues.SimplifyConditionalExpression,
CodeStyleOptions2.PreferSimplifiedBooleanExpressions,
new LocalizableResourceString(nameof(AnalyzersResources.Simplify_conditional_expression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Conditional_expression_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -25,6 +25,7 @@ internal abstract class AbstractSimplifyInterpolationDiagnosticAnalyzer<
{
protected AbstractSimplifyInterpolationDiagnosticAnalyzer()
: base(IDEDiagnosticIds.SimplifyInterpolationId,
EnforceOnBuildValues.SimplifyInterpolation,
CodeStyleOptions2.PreferSimplifiedInterpolation,
new LocalizableResourceString(nameof(AnalyzersResources.Simplify_interpolation), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Interpolation_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
......
......@@ -27,7 +27,7 @@ internal abstract class AbstractUseAutoPropertyAnalyzer<
AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
protected AbstractUseAutoPropertyAnalyzer()
: base(IDEDiagnosticIds.UseAutoPropertyDiagnosticId, CodeStyleOptions2.PreferAutoProperties, s_title, s_title)
: base(IDEDiagnosticIds.UseAutoPropertyDiagnosticId, EnforceOnBuildValues.UseAutoProperty, CodeStyleOptions2.PreferAutoProperties, s_title, s_title)
{
}
......
......@@ -24,6 +24,7 @@ internal abstract class AbstractUseCoalesceExpressionDiagnosticAnalyzer<
{
protected AbstractUseCoalesceExpressionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseCoalesceExpressionDiagnosticId,
EnforceOnBuildValues.UseCoalesceExpression,
CodeStyleOptions2.PreferCoalesceExpression,
new LocalizableResourceString(nameof(AnalyzersResources.Use_coalesce_expression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Null_check_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -26,6 +26,7 @@ internal abstract class AbstractUseCoalesceExpressionForNullableDiagnosticAnalyz
{
protected AbstractUseCoalesceExpressionForNullableDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseCoalesceExpressionForNullableDiagnosticId,
EnforceOnBuildValues.UseCoalesceExpressionForNullable,
CodeStyleOptions2.PreferCoalesceExpression,
new LocalizableResourceString(nameof(AnalyzersResources.Use_coalesce_expression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
{
......
......@@ -35,6 +35,7 @@ public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
protected AbstractUseCollectionInitializerDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseCollectionInitializerDiagnosticId,
EnforceOnBuildValues.UseCollectionInitializer,
CodeStyleOptions2.PreferCollectionInitializer,
new LocalizableResourceString(nameof(AnalyzersResources.Simplify_collection_initialization), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Collection_initialization_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -34,6 +34,7 @@ internal abstract class AbstractUseCompoundAssignmentDiagnosticAnalyzer<
ISyntaxFacts syntaxFacts,
ImmutableArray<(TSyntaxKind exprKind, TSyntaxKind assignmentKind, TSyntaxKind tokenKind)> kinds)
: base(IDEDiagnosticIds.UseCompoundAssignmentDiagnosticId,
EnforceOnBuildValues.UseCompoundAssignment,
CodeStyleOptions2.PreferCompoundAssignment,
new LocalizableResourceString(
nameof(AnalyzersResources.Use_compound_assignment), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......@@ -45,12 +46,14 @@ internal abstract class AbstractUseCompoundAssignmentDiagnosticAnalyzer<
nameof(AnalyzersResources.Use_increment_operator), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
_incrementDescriptor = CreateDescriptorWithId(
IDEDiagnosticIds.UseCompoundAssignmentDiagnosticId,
EnforceOnBuildValues.UseCompoundAssignment,
useIncrementMessage, useIncrementMessage);
var useDecrementMessage = new LocalizableResourceString(
nameof(AnalyzersResources.Use_decrement_operator), AnalyzersResources.ResourceManager, typeof(AnalyzersResources));
_decrementDescriptor = CreateDescriptorWithId(
IDEDiagnosticIds.UseCompoundAssignmentDiagnosticId,
EnforceOnBuildValues.UseCompoundAssignment,
useDecrementMessage, useDecrementMessage);
}
......
......@@ -23,9 +23,11 @@ public sealed override DiagnosticAnalyzerCategory GetAnalyzerCategory()
protected AbstractUseConditionalExpressionDiagnosticAnalyzer(
string descriptorId,
EnforceOnBuild enforceOnBuild,
LocalizableResourceString message,
PerLanguageOption2<CodeStyleOption2<bool>> option)
: base(descriptorId,
enforceOnBuild,
option,
new LocalizableResourceString(nameof(AnalyzersResources.Convert_to_conditional_expression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
message)
......
......@@ -18,6 +18,7 @@ internal abstract class AbstractUseConditionalExpressionForAssignmentDiagnosticA
protected AbstractUseConditionalExpressionForAssignmentDiagnosticAnalyzer(
LocalizableResourceString message)
: base(IDEDiagnosticIds.UseConditionalExpressionForAssignmentDiagnosticId,
EnforceOnBuildValues.UseConditionalExpressionForAssignment,
message,
CodeStyleOptions2.PreferConditionalExpressionOverAssignment)
{
......
......@@ -16,6 +16,7 @@ internal abstract class AbstractUseConditionalExpressionForReturnDiagnosticAnaly
protected AbstractUseConditionalExpressionForReturnDiagnosticAnalyzer(
LocalizableResourceString message)
: base(IDEDiagnosticIds.UseConditionalExpressionForReturnDiagnosticId,
EnforceOnBuildValues.UseConditionalExpressionForReturn,
message,
CodeStyleOptions2.PreferConditionalExpressionOverReturn)
{
......
......@@ -20,6 +20,7 @@ internal class UseExplicitTupleNameDiagnosticAnalyzer : AbstractBuiltInCodeStyle
public UseExplicitTupleNameDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseExplicitTupleNameDiagnosticId,
EnforceOnBuildValues.UseExplicitTupleName,
CodeStyleOptions2.PreferExplicitTupleNames,
title: new LocalizableResourceString(nameof(AnalyzersResources.Use_explicitly_provided_tuple_name), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
messageFormat: new LocalizableResourceString(nameof(AnalyzersResources.Prefer_explicitly_provided_tuple_element_name), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -18,6 +18,7 @@ internal abstract class AbstractUseInferredMemberNameDiagnosticAnalyzer : Abstra
public AbstractUseInferredMemberNameDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseInferredMemberNameDiagnosticId,
EnforceOnBuildValues.UseInferredMemberName,
options: ImmutableHashSet.Create<IPerLanguageOption>(CodeStyleOptions2.PreferInferredAnonymousTypeMemberNames, CodeStyleOptions2.PreferInferredTupleNames),
new LocalizableResourceString(nameof(AnalyzersResources.Use_inferred_member_name), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Member_name_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -18,6 +18,7 @@ internal abstract class AbstractUseIsNullCheckForReferenceEqualsDiagnosticAnalyz
{
protected AbstractUseIsNullCheckForReferenceEqualsDiagnosticAnalyzer(LocalizableString title)
: base(IDEDiagnosticIds.UseIsNullCheckDiagnosticId,
EnforceOnBuildValues.UseIsNullCheck,
CodeStyleOptions2.PreferIsNullCheckOverReferenceEqualityMethod,
title,
new LocalizableResourceString(nameof(AnalyzersResources.Null_check_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -37,6 +37,7 @@ internal abstract class AbstractUseNullPropagationDiagnosticAnalyzer<
{
protected AbstractUseNullPropagationDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseNullPropagationDiagnosticId,
EnforceOnBuildValues.UseNullPropagation,
CodeStyleOptions2.PreferNullPropagation,
new LocalizableResourceString(nameof(AnalyzersResources.Use_null_propagation), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Null_check_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -32,6 +32,7 @@ internal abstract partial class AbstractUseObjectInitializerDiagnosticAnalyzer<
protected AbstractUseObjectInitializerDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseObjectInitializerDiagnosticId,
EnforceOnBuildValues.UseObjectInitializer,
CodeStyleOptions2.PreferObjectInitializer,
new LocalizableResourceString(nameof(AnalyzersResources.Simplify_object_initialization), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.Object_initialization_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -14,6 +14,7 @@ internal class UseSystemHashCodeDiagnosticAnalyzer : AbstractBuiltInCodeStyleDia
{
public UseSystemHashCodeDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseSystemHashCode,
EnforceOnBuildValues.UseSystemHashCode,
CodeStyleOptions2.PreferSystemHashCode,
new LocalizableResourceString(nameof(AnalyzersResources.Use_System_HashCode), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
new LocalizableResourceString(nameof(AnalyzersResources.GetHashCode_implementation_can_be_simplified), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)))
......
......@@ -40,6 +40,7 @@ internal abstract class AbstractUseThrowExpressionDiagnosticAnalyzer :
protected AbstractUseThrowExpressionDiagnosticAnalyzer(Option2<CodeStyleOption2<bool>> preferThrowExpressionOption, string language)
: base(IDEDiagnosticIds.UseThrowExpressionDiagnosticId,
EnforceOnBuildValues.UseThrowExpression,
preferThrowExpressionOption,
language,
new LocalizableResourceString(nameof(AnalyzersResources.Use_throw_expression), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)),
......
......@@ -5,6 +5,7 @@
using System.Collections.Immutable;
using System.Diagnostics;
using System.Text.RegularExpressions;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.LanguageServices;
using Roslyn.Utilities;
......@@ -39,7 +40,8 @@ internal abstract class AbstractValidateFormatStringDiagnosticAnalyzer<TSyntaxKi
DiagnosticCategory.Compiler,
DiagnosticSeverity.Info,
isEnabledByDefault: true,
description: Description);
description: Description,
customTags: EnforceOnBuildValues.ValidateFormatString.ToCustomTag());
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
=> ImmutableArray.Create(Rule);
......
......@@ -14,6 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.RemoveUnnecessaryByVal
Public Sub New()
MyBase.New(
diagnosticId:=IDEDiagnosticIds.RemoveUnnecessaryByValDiagnosticId,
enforceOnBuild:=EnforceOnBuildValues.RemoveUnnecessaryByVal,
[option]:=Nothing,
title:=New LocalizableResourceString(NameOf(VisualBasicAnalyzersResources.Remove_ByVal), VisualBasicAnalyzersResources.ResourceManager, GetType(VisualBasicAnalyzersResources)),
isUnnecessary:=True)
......
......@@ -25,6 +25,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseIsNotExpression
Public Sub New()
MyBase.New(IDEDiagnosticIds.UseIsNotExpressionDiagnosticId,
EnforceOnBuildValues.UseIsNotExpression,
VisualBasicCodeStyleOptions.PreferIsNotExpression,
LanguageNames.VisualBasic,
New LocalizableResourceString(
......
......@@ -16,6 +16,7 @@ internal abstract class AbstractFormattingAnalyzer
protected AbstractFormattingAnalyzer()
: base(
IDEDiagnosticIds.FormattingDiagnosticId,
EnforceOnBuildValues.Formatting,
option: null,
new LocalizableResourceString(nameof(CodeStyleResources.Fix_formatting), CodeStyleResources.ResourceManager, typeof(CodeStyleResources)),
new LocalizableResourceString(nameof(CodeStyleResources.Fix_formatting), CodeStyleResources.ResourceManager, typeof(CodeStyleResources)))
......
......@@ -22,6 +22,7 @@ public static class Program
private const int ExpectedArguments = 4;
private static readonly string s_neverTag = EnforceOnBuild.Never.ToCustomTag();
private static readonly string s_whenExplicitlyEnabledTag = EnforceOnBuild.WhenExplicitlyEnabled.ToCustomTag();
private static readonly string s_recommendedTag = EnforceOnBuild.Recommended.ToCustomTag();
private static readonly string s_highlyRecommendedTag = EnforceOnBuild.HighlyRecommended.ToCustomTag();
......@@ -152,6 +153,9 @@ bool AddRule(DiagnosticDescriptor rule)
(bool isEnabledByDefault, DiagnosticSeverity effectiveSeverity) GetEnabledByDefaultAndSeverity(DiagnosticDescriptor rule, AnalysisMode analysisMode)
{
Debug.Assert(rule.CustomTags.Any(c => c == s_neverTag || c == s_whenExplicitlyEnabledTag || c == s_recommendedTag || c == s_highlyRecommendedTag),
$"DiagnosticDescriptor for '{rule.Id}' must have a {nameof(EnforceOnBuild)} custom tag");
bool isEnabledInNonDefaultMode;
switch (analysisMode)
{
......
......@@ -7,6 +7,7 @@
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.Implementation.Diagnostics;
......@@ -59,7 +60,7 @@ private class Analyzer : DiagnosticAnalyzer
{
private readonly DiagnosticDescriptor _rule = new DiagnosticDescriptor(
"test", "test", "test", "test", DiagnosticSeverity.Error, true,
customTags: DiagnosticCustomTags.Create(isUnnecessary: true, isConfigurable: false));
customTags: DiagnosticCustomTags.Create(isUnnecessary: true, isConfigurable: false, EnforceOnBuild.Never));
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
=> ImmutableArray.Create(_rule);
......
......@@ -5,6 +5,7 @@
#nullable disable
using System.Linq;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
using Xunit;
......@@ -18,7 +19,7 @@ public void GetDescriptor()
var d = EditAndContinueDiagnosticDescriptors.GetDescriptor(RudeEditKind.ActiveStatementUpdate);
Assert.Equal("ENC0001", d.Id);
Assert.Equal(DiagnosticCategory.EditAndContinue, d.Category);
Assert.Equal(new[] { "EditAndContinue", "Telemetry", "NotConfigurable" }, d.CustomTags);
Assert.Equal(new[] { "EditAndContinue", "Telemetry", "NotConfigurable", EnforceOnBuild.Never.ToCustomTag() }, d.CustomTags);
Assert.Equal("", d.Description);
Assert.Equal("", d.HelpLinkUri);
Assert.Equal(new LocalizableResourceString(nameof(FeaturesResources.RudeEdit), FeaturesResources.ResourceManager, typeof(FeaturesResources)), d.Title);
......@@ -30,7 +31,7 @@ public void GetDescriptor()
d = EditAndContinueDiagnosticDescriptors.GetDescriptor(EditAndContinueErrorCode.ErrorReadingFile);
Assert.Equal("ENC1001", d.Id);
Assert.Equal(DiagnosticCategory.EditAndContinue, d.Category);
Assert.Equal(new[] { "EditAndContinue", "Telemetry", "NotConfigurable" }, d.CustomTags);
Assert.Equal(new[] { "EditAndContinue", "Telemetry", "NotConfigurable", EnforceOnBuild.Never.ToCustomTag() }, d.CustomTags);
Assert.Equal("", d.Description);
Assert.Equal("", d.HelpLinkUri);
Assert.Equal(new LocalizableResourceString(nameof(FeaturesResources.EditAndContinue), FeaturesResources.ResourceManager, typeof(FeaturesResources)), d.Title);
......@@ -40,7 +41,7 @@ public void GetDescriptor()
d = EditAndContinueDiagnosticDescriptors.GetModuleDiagnosticDescriptor(12);
Assert.Equal("ENC2012", d.Id);
Assert.Equal(DiagnosticCategory.EditAndContinue, d.Category);
Assert.Equal(new[] { "EditAndContinue", "Telemetry", "NotConfigurable" }, d.CustomTags);
Assert.Equal(new[] { "EditAndContinue", "Telemetry", "NotConfigurable", EnforceOnBuild.Never.ToCustomTag() }, d.CustomTags);
Assert.Equal("", d.Description);
Assert.Equal("", d.HelpLinkUri);
Assert.Equal(new LocalizableResourceString(nameof(FeaturesResources.EditAndContinue), FeaturesResources.ResourceManager, typeof(FeaturesResources)), d.Title);
......
......@@ -34,6 +34,7 @@ public UseExpressionBodyForLambdaCodeStyleProvider()
: base(CSharpCodeStyleOptions.PreferExpressionBodiedLambdas,
LanguageNames.CSharp,
IDEDiagnosticIds.UseExpressionBodyForLambdaExpressionsDiagnosticId,
EnforceOnBuildValues.UseExpressionBodyForLambdaExpressions,
UseExpressionBodyTitle,
UseExpressionBodyTitle)
{
......
......@@ -42,7 +42,8 @@ internal class CSharpIsAndCastCheckWithoutNameDiagnosticAnalyzer : AbstractBuilt
public CSharpIsAndCastCheckWithoutNameDiagnosticAnalyzer()
: base(IDEDiagnosticIds.InlineIsTypeWithoutNameCheckDiagnosticsId,
option: CSharpCodeStyleOptions.PreferPatternMatchingOverIsWithCastCheck,
EnforceOnBuildValues.InlineIsTypeWithoutName,
CSharpCodeStyleOptions.PreferPatternMatchingOverIsWithCastCheck,
LanguageNames.CSharp,
new LocalizableResourceString(
nameof(CSharpAnalyzersResources.Use_pattern_matching), CSharpAnalyzersResources.ResourceManager, typeof(CSharpAnalyzersResources)))
......
......@@ -28,6 +28,7 @@ protected DiagnosticAnalyzer(bool isUnnecessary = true, bool configurable = true
private DiagnosticAnalyzer(TCodeStyleProvider codeStyleProvider, bool isUnnecessary, bool configurable)
: base(codeStyleProvider._descriptorId,
codeStyleProvider._enforceOnBuild,
codeStyleProvider._option,
codeStyleProvider._language,
codeStyleProvider._title,
......
......@@ -36,6 +36,7 @@ internal abstract partial class AbstractCodeStyleProvider<
private readonly Option2<CodeStyleOption2<TOptionKind>> _option;
private readonly string _language;
private readonly string _descriptorId;
private readonly EnforceOnBuild _enforceOnBuild;
private readonly LocalizableString _title;
private readonly LocalizableString _message;
......@@ -43,12 +44,14 @@ internal abstract partial class AbstractCodeStyleProvider<
Option2<CodeStyleOption2<TOptionKind>> option,
string language,
string descriptorId,
EnforceOnBuild enforceOnBuild,
LocalizableString title,
LocalizableString message)
{
_option = option;
_language = language;
_descriptorId = descriptorId;
_enforceOnBuild = enforceOnBuild;
_title = title;
_message = message;
}
......
......@@ -46,6 +46,7 @@ private DisposableFieldsShouldBeDisposedDiagnosticAnalyzer(DiagnosticDescriptor
private static DiagnosticDescriptor CreateDescriptor(bool isEnabledByDefault)
=> CreateDescriptor(
IDEDiagnosticIds.DisposableFieldsShouldBeDisposedDiagnosticId,
EnforceOnBuildValues.DisposableFieldsShouldBeDisposed,
title: new LocalizableResourceString(nameof(FeaturesResources.Disposable_fields_should_be_disposed), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
messageFormat: new LocalizableResourceString(nameof(FeaturesResources.Disposable_field_0_is_never_disposed), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
description: new LocalizableResourceString(nameof(FeaturesResources.DisposableFieldsShouldBeDisposedDescription), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
......
......@@ -48,6 +48,7 @@ public DisposeObjectsBeforeLosingScopeDiagnosticAnalyzer(DiagnosticDescriptor di
private static DiagnosticDescriptor CreateDisposeObjectsBeforeLosingScopeRule(bool isEnabledByDefault)
=> CreateDescriptor(
IDEDiagnosticIds.DisposeObjectsBeforeLosingScopeDiagnosticId,
EnforceOnBuildValues.DisposeObjectsBeforeLosingScope,
title: new LocalizableResourceString(nameof(FeaturesResources.Dispose_objects_before_losing_scope), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
messageFormat: new LocalizableResourceString(nameof(FeaturesResources.Disposable_object_created_by_0_is_never_disposed), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
description: new LocalizableResourceString(nameof(FeaturesResources.UseRecommendedDisposePatternDescription), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
......@@ -57,6 +58,7 @@ private static DiagnosticDescriptor CreateDisposeObjectsBeforeLosingScopeRule(bo
private static DiagnosticDescriptor CreateUseRecommendedDisposePatternRule(bool isEnabledByDefault)
=> CreateDescriptor(
IDEDiagnosticIds.UseRecommendedDisposePatternDiagnosticId,
EnforceOnBuildValues.UseRecommendedDisposePattern,
title: new LocalizableResourceString(nameof(FeaturesResources.Use_recommended_dispose_pattern), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
messageFormat: new LocalizableResourceString(nameof(FeaturesResources.Use_recommended_dispose_pattern_to_ensure_that_object_created_by_0_is_disposed_on_all_paths_using_statement_declaration_or_try_finally), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
description: new LocalizableResourceString(nameof(FeaturesResources.UseRecommendedDisposePatternDescription), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
......
......@@ -25,6 +25,7 @@ internal abstract class AbstractRegexDiagnosticAnalyzer : AbstractBuiltInCodeSty
protected AbstractRegexDiagnosticAnalyzer(EmbeddedLanguageInfo info)
: base(DiagnosticId,
EnforceOnBuildValues.Regex,
RegularExpressionsOptions.ReportInvalidRegexPatterns,
new LocalizableResourceString(nameof(FeaturesResources.Regex_issue_0), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
new LocalizableResourceString(nameof(FeaturesResources.Regex_issue_0), FeaturesResources.ResourceManager, typeof(FeaturesResources)))
......
......@@ -16,6 +16,7 @@ internal class FormattingDiagnosticAnalyzer
public FormattingDiagnosticAnalyzer()
: base(
IDEDiagnosticIds.FormattingDiagnosticId,
EnforceOnBuildValues.Formatting,
option: null, // No unique option to configure diagnosticId
new LocalizableResourceString(nameof(FeaturesResources.Fix_formatting), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
new LocalizableResourceString(nameof(FeaturesResources.Fix_formatting), FeaturesResources.ResourceManager, typeof(FeaturesResources)))
......
......@@ -17,6 +17,7 @@ internal abstract class PreferFrameworkTypeDiagnosticAnalyzerBase<TSyntaxKind, T
{
protected PreferFrameworkTypeDiagnosticAnalyzerBase()
: base(IDEDiagnosticIds.PreferBuiltInOrFrameworkTypeDiagnosticId,
EnforceOnBuildValues.PreferBuiltInOrFrameworkType,
options: ImmutableHashSet.Create<IPerLanguageOption>(CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInDeclaration, CodeStyleOptions2.PreferIntrinsicPredefinedTypeKeywordInMemberAccess),
new LocalizableResourceString(nameof(FeaturesResources.Use_framework_type), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
new LocalizableResourceString(nameof(FeaturesResources.Use_framework_type), FeaturesResources.ResourceManager, typeof(FeaturesResources)))
......
......@@ -29,6 +29,7 @@ internal abstract class AbstractSimplifyThisOrMeDiagnosticAnalyzer<
protected AbstractSimplifyThisOrMeDiagnosticAnalyzer()
: base(IDEDiagnosticIds.RemoveQualificationDiagnosticId,
EnforceOnBuildValues.RemoveQualification,
ImmutableHashSet.Create<IPerLanguageOption>(CodeStyleOptions2.QualifyFieldAccess, CodeStyleOptions2.QualifyPropertyAccess, CodeStyleOptions2.QualifyMethodAccess, CodeStyleOptions2.QualifyEventAccess),
new LocalizableResourceString(nameof(FeaturesResources.Remove_qualification), FeaturesResources.ResourceManager, typeof(FeaturesResources)),
new LocalizableResourceString(nameof(WorkspacesResources.Name_can_be_simplified), WorkspacesResources.ResourceManager, typeof(WorkspacesResources)),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册