Esempio n. 1
0
        internal static string[] Create(
            bool isUnnecessary,
            bool isConfigurable,
            EnforceOnBuild enforceOnBuild
            )
        {
            Debug.Assert(isConfigurable || enforceOnBuild == EnforceOnBuild.Never);

            var customTagsBuilder = ImmutableArray.CreateBuilder <string>();

            customTagsBuilder.AddRange(Microsoft);

            customTagsBuilder.Add(enforceOnBuild.ToCustomTag());

            if (!isConfigurable)
            {
                customTagsBuilder.Add(WellKnownDiagnosticTags.NotConfigurable);
            }

            if (isUnnecessary)
            {
                customTagsBuilder.Add(WellKnownDiagnosticTags.Unnecessary);
            }

            return(customTagsBuilder.ToArray());
        }
 protected AbstractPopulateSwitchDiagnosticAnalyzer(string diagnosticId, EnforceOnBuild enforceOnBuild)
     : base(diagnosticId,
            enforceOnBuild,
            option: null,
            s_localizableTitle, s_localizableMessage)
 {
 }
Esempio n. 3
0
 protected CSharpTypeStyleDiagnosticAnalyzerBase(
     string diagnosticId, EnforceOnBuild enforceOnBuild, LocalizableString title, LocalizableString message)
     : base(diagnosticId,
            enforceOnBuild,
            ImmutableHashSet.Create <IOption2>(CSharpCodeStyleOptions.VarForBuiltInTypes, CSharpCodeStyleOptions.VarWhenTypeIsApparent, CSharpCodeStyleOptions.VarElsewhere),
            title, message)
 {
 }
 protected static DiagnosticDescriptor CreateDescriptorWithId(
     string id,
     EnforceOnBuild enforceOnBuild,
     LocalizableString title,
     LocalizableString messageFormat,
     bool isUnnecessary            = false,
     bool isConfigurable           = true,
     LocalizableString?description = null)
 => new(
 protected AbstractParenthesesDiagnosticAnalyzer(
     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,
            isUnnecessary: isUnnecessary)
 {
 }
 protected static DiagnosticDescriptor CreateDescriptor(
     string id,
     EnforceOnBuild enforceOnBuild,
     LocalizableString title,
     LocalizableString messageFormat,
     bool isUnnecessary,
     bool isEnabledByDefault       = true,
     bool isConfigurable           = true,
     LocalizableString description = null)
 => new(
Esempio n. 7
0
        protected static DiagnosticDescriptor CreateDescriptorWithId(
            string id,
            EnforceOnBuild enforceOnBuild,
            LocalizableString title,
            LocalizableString?messageFormat = null,
            bool isUnnecessary            = false,
            bool isConfigurable           = true,
            LocalizableString?description = null)
#pragma warning disable RS0030 // Do not used banned APIs
        => new(
        protected static DiagnosticDescriptor CreateDescriptor(
            string id,
            EnforceOnBuild enforceOnBuild,
            LocalizableString title,
            LocalizableString messageFormat,
            bool isUnnecessary,
            bool isEnabledByDefault       = true,
            bool isConfigurable           = true,
            LocalizableString description = null)
#pragma warning disable RS0030 // Do not used banned APIs
        => new(
 /// <summary>
 /// Constructor for an unnecessary code style analyzer with a single diagnostic descriptor and
 /// unique <see cref="IPerLanguageValuedOption"/> 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.
 /// </param>
 /// <param name="fadingOption">
 /// Per-language fading option that can be used to configure if the diagnostic should be faded in the IDE or not.
 /// <see langword="null"/>, if there is no such unique fading option.
 /// </param>
 /// <param name="title">Title for the diagnostic descriptor</param>
 /// <param name="messageFormat">
 /// Message for the diagnostic descriptor.
 /// <see langword="null"/> if the message is identical to the title.
 /// </param>
 /// <param name="configurable">Flag indicating if the reported diagnostics are configurable by the end users</param>
 protected AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer(
     string diagnosticId,
     EnforceOnBuild enforceOnBuild,
     IPerLanguageValuedOption?option,
     PerLanguageOption2 <bool>?fadingOption,
     LocalizableString title,
     LocalizableString?messageFormat = null,
     bool configurable = true)
     : base(diagnosticId, enforceOnBuild, option, title, messageFormat, isUnnecessary: true, configurable)
 {
     AddDiagnosticIdToFadingOptionMapping(diagnosticId, fadingOption);
 }
Esempio n. 10
0
 /// <summary>
 /// Constructor for a code style analyzer with a single diagnostic descriptor and
 /// 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.
 /// </param>
 /// <param name="title">Title for the diagnostic descriptor</param>
 /// <param name="messageFormat">
 /// Message for the diagnostic descriptor.
 /// <see langword="null"/> if the message is identical to the title.
 /// </param>
 /// <param name="isUnnecessary"><see langword="true"/> if the diagnostic is reported on unnecessary code; otherwise, <see langword="false"/>.</param>
 /// <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, enforceOnBuild, title, messageFormat, isUnnecessary, configurable)
 {
     AddDiagnosticIdToOptionMapping(diagnosticId, option);
 }
 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)
 {
 }
Esempio n. 12
0
 /// <summary>
 /// Constructor for a code style analyzer with a single diagnostic descriptor and
 /// 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>
 /// <param name="title">Title for the diagnostic descriptor</param>
 /// <param name="messageFormat">
 /// Message for the diagnostic descriptor.
 /// Null if the message is identical to the title.
 /// </param>
 /// <param name="isUnnecessary"><see langword="true"/> if the diagnostic is reported on unnecessary code; otherwise, <see langword="false"/>.</param>
 /// <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, enforceOnBuild, title, messageFormat, isUnnecessary, configurable)
 {
     RoslynDebug.Assert(options != null);
     Debug.Assert(options.Count > 1);
     AddDiagnosticIdToOptionMapping(diagnosticId, options);
 }
        private AbstractBuiltInCodeStyleDiagnosticAnalyzer(
            string descriptorId,
            EnforceOnBuild enforceOnBuild,
            LocalizableString title,
            LocalizableString?messageFormat,
            bool isUnnecessary,
            bool configurable)
        {
            // 'isUnnecessary' should be true only for sub-types of AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer.
            Debug.Assert(!isUnnecessary || this is AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer);

            Descriptor           = CreateDescriptorWithId(descriptorId, enforceOnBuild, title, messageFormat ?? title, isUnnecessary: isUnnecessary, isConfigurable: configurable);
            SupportedDiagnostics = ImmutableArray.Create(Descriptor);
        }
 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;
     SyntaxKinds            = syntaxKinds;
 }
Esempio n. 15
0
        private AbstractBuiltInCodeStyleDiagnosticAnalyzer(
            string descriptorId,
            EnforceOnBuild enforceOnBuild,
            LocalizableString title,
            LocalizableString?messageFormat,
            bool isUnnecessary,
            bool configurable)
        {
            DescriptorId              = descriptorId;
            _localizableTitle         = title;
            _localizableMessageFormat = messageFormat ?? title;

            Descriptor           = CreateDescriptorWithId(DescriptorId, enforceOnBuild, _localizableTitle, _localizableMessageFormat, isUnnecessary: isUnnecessary, isConfigurable: configurable);
            SupportedDiagnostics = ImmutableArray.Create(Descriptor);
        }
 protected AbstractCodeStyleProvider(
     Option2 <CodeStyleOption2 <TOptionValue> > option,
     string language,
     string descriptorId,
     EnforceOnBuild enforceOnBuild,
     LocalizableString title,
     LocalizableString message)
 {
     _option         = option;
     _language       = language;
     _descriptorId   = descriptorId;
     _enforceOnBuild = enforceOnBuild;
     _title          = title;
     _message        = message;
 }
Esempio n. 17
0
        private AbstractBuiltInCodeStyleDiagnosticAnalyzer(
            string descriptorId,
            EnforceOnBuild enforceOnBuild,
            LocalizableString title,
            LocalizableString?messageFormat,
            bool isUnnecessary,
            bool configurable)
        {
            // 'isUnnecessary' should be true only for sub-types of AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer.
            // NOTE: AbstractParenthesesDiagnosticAnalyzer is an exception as it is a common sub-type for
            // AbstractRemoveUnnecessaryParenthesesDiagnosticAnalyzer (unnecessary code analyzer) and
            // AbstractAddRequiredParenthesesDiagnosticAnalyzer (non-unnecessary code analyzer).
            Debug.Assert(!isUnnecessary ||
                         this is AbstractBuiltInUnnecessaryCodeStyleDiagnosticAnalyzer ||
                         this is AbstractParenthesesDiagnosticAnalyzer);

            Descriptor           = CreateDescriptorWithId(descriptorId, enforceOnBuild, title, messageFormat ?? title, isUnnecessary: isUnnecessary, isConfigurable: configurable);
            SupportedDiagnostics = ImmutableArray.Create(Descriptor);
        }
 public static string ToCustomTag(this EnforceOnBuild enforceOnBuild)
 => $"{nameof(EnforceOnBuild)}_{enforceOnBuild}";