提交 81583b39 编写于 作者: H Heejae Chang

make sure all IDE analyzers implements IBuildInAnalyzer

IDEAnalyzer does this special thing that compiler analyzer can't do.
that is reporting all its diagnostic descriptor as hidden and change its
severity on runtime.

engine has special treatment for this behavior only if the analyzer implements
IBuiltInAnalyzer. otherwise, the analyzer will be treated as normal
compiler analyzer and things won't work as expected
上级 fda1cfef
......@@ -10,7 +10,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Diagnostics.AddBraces
{
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal sealed class CSharpAddBracesDiagnosticAnalyzer :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
{
public CSharpAddBracesDiagnosticAnalyzer()
: base(IDEDiagnosticIds.AddBracesDiagnosticId,
......@@ -19,7 +19,7 @@ public CSharpAddBracesDiagnosticAnalyzer()
{
}
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
private static readonly ImmutableArray<SyntaxKind> s_syntaxKindsOfInterest =
ImmutableArray.Create(
......@@ -36,7 +36,7 @@ public CSharpAddBracesDiagnosticAnalyzer()
protected override void InitializeWorker(AnalysisContext context)
=> context.RegisterSyntaxNodeAction(AnalyzeNode, s_syntaxKindsOfInterest);
public DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
public void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
......
......@@ -14,7 +14,7 @@
namespace Microsoft.CodeAnalysis.CSharp.Diagnostics.TypeStyle
{
internal abstract partial class CSharpTypeStyleDiagnosticAnalyzerBase :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
{
protected CSharpTypeStyleDiagnosticAnalyzerBase(
string diagnosticId, LocalizableString title, LocalizableString message)
......@@ -22,9 +22,9 @@ internal abstract partial class CSharpTypeStyleDiagnosticAnalyzerBase :
{
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
public bool OpenFileOnly(Workspace workspace)
public override bool OpenFileOnly(Workspace workspace)
{
var forIntrinsicTypesOption = workspace.Options.GetOption(CSharpCodeStyleOptions.UseImplicitTypeForIntrinsicTypes).Notification;
var whereApparentOption = workspace.Options.GetOption(CSharpCodeStyleOptions.UseImplicitTypeWhereApparent).Notification;
......
......@@ -36,10 +36,10 @@ public CSharpInlineDeclarationDiagnosticAnalyzer()
{
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
=> DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
protected override void InitializeWorker(AnalysisContext context)
{
......
......@@ -18,7 +18,7 @@ internal static class Constants
}
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal class InvokeDelegateWithConditionalAccessAnalyzer : AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
internal class InvokeDelegateWithConditionalAccessAnalyzer : AbstractCodeStyleDiagnosticAnalyzer
{
public InvokeDelegateWithConditionalAccessAnalyzer()
: base(IDEDiagnosticIds.InvokeDelegateWithConditionalAccessId,
......@@ -26,7 +26,7 @@ public InvokeDelegateWithConditionalAccessAnalyzer()
{
}
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
protected override void InitializeWorker(AnalysisContext context)
=> context.RegisterSyntaxNodeAction(SyntaxNodeAction, SyntaxKind.IfStatement);
......@@ -298,7 +298,7 @@ private void SyntaxNodeAction(SyntaxNodeAnalysisContext syntaxContext)
private bool IsNullCheckExpression(ExpressionSyntax left, ExpressionSyntax right) =>
left.IsKind(SyntaxKind.IdentifierName) && right.IsKind(SyntaxKind.NullLiteralExpression);
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
{
return DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
}
......
......@@ -10,7 +10,7 @@
namespace Microsoft.CodeAnalysis.CSharp.UseExpressionBody
{
internal abstract class AbstractUseExpressionBodyDiagnosticAnalyzer<TDeclaration> :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
where TDeclaration : SyntaxNode
{
private readonly ImmutableArray<SyntaxKind> _syntaxKinds;
......@@ -18,7 +18,7 @@ internal abstract class AbstractUseExpressionBodyDiagnosticAnalyzer<TDeclaration
private readonly LocalizableString _expressionBodyTitle;
private readonly LocalizableString _blockBodyTitle;
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
protected AbstractUseExpressionBodyDiagnosticAnalyzer(
string diagnosticId,
......@@ -34,7 +34,7 @@ internal abstract class AbstractUseExpressionBodyDiagnosticAnalyzer<TDeclaration
_blockBodyTitle = blockBodyTitle;
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
protected override void InitializeWorker(AnalysisContext context)
=> context.RegisterSyntaxNodeAction(AnalyzeSyntax, _syntaxKinds);
......
......@@ -24,9 +24,9 @@ namespace Microsoft.CodeAnalysis.CSharp.UsePatternMatching
/// if (o is Type x) ...
/// </summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal class CSharpAsAndNullCheckDiagnosticAnalyzer : AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
internal class CSharpAsAndNullCheckDiagnosticAnalyzer : AbstractCodeStyleDiagnosticAnalyzer
{
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
public CSharpAsAndNullCheckDiagnosticAnalyzer()
: base(IDEDiagnosticIds.InlineAsTypeCheckId,
......@@ -240,7 +240,7 @@ private BinaryExpressionSyntax GetLeftmostCondition(ExpressionSyntax condition)
private bool IsNullCheckExpression(ExpressionSyntax left, ExpressionSyntax right) =>
left.IsKind(SyntaxKind.IdentifierName) && right.IsKind(SyntaxKind.NullLiteralExpression);
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
{
return DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
}
......
......@@ -26,9 +26,9 @@ namespace Microsoft.CodeAnalysis.CSharp.UsePatternMatching
/// }
/// </summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
internal class CSharpIsAndCastCheckDiagnosticAnalyzer : AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
internal class CSharpIsAndCastCheckDiagnosticAnalyzer : AbstractCodeStyleDiagnosticAnalyzer
{
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
public CSharpIsAndCastCheckDiagnosticAnalyzer()
: base(IDEDiagnosticIds.InlineIsTypeCheckId,
......@@ -163,7 +163,7 @@ private void SyntaxNodeAction(SyntaxNodeAnalysisContext syntaxContext)
.Any(d => d.Identifier.ValueText.Equals(variableName));
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
{
return DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
}
......
......@@ -6,7 +6,7 @@
namespace Microsoft.CodeAnalysis.CodeStyle
{
internal abstract class AbstractCodeStyleDiagnosticAnalyzer : DiagnosticAnalyzer
internal abstract class AbstractCodeStyleDiagnosticAnalyzer : DiagnosticAnalyzer, IBuiltInAnalyzer
{
protected readonly string DescriptorId;
......@@ -104,5 +104,8 @@ public sealed override void Initialize(AnalysisContext context)
}
protected abstract void InitializeWorker(AnalysisContext context);
public abstract DiagnosticAnalyzerCategory GetAnalyzerCategory();
public abstract bool OpenFileOnly(Workspace workspace);
}
}
\ No newline at end of file
......@@ -13,7 +13,7 @@
namespace Microsoft.CodeAnalysis.Diagnostics.Analyzers.NamingStyles
{
internal abstract class NamingStyleDiagnosticAnalyzerBase :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
{
private static readonly LocalizableString s_localizableMessage = new LocalizableResourceString(nameof(FeaturesResources.Naming_Styles), FeaturesResources.ResourceManager, typeof(FeaturesResources));
private static readonly LocalizableString s_localizableTitleNamingStyle = new LocalizableResourceString(nameof(FeaturesResources.Naming_Styles), FeaturesResources.ResourceManager, typeof(FeaturesResources));
......@@ -36,7 +36,7 @@ protected NamingStyleDiagnosticAnalyzerBase()
SymbolKind.Property,
SymbolKind.Parameter);
public bool OpenFileOnly(Workspace workspace) => true;
public override bool OpenFileOnly(Workspace workspace) => true;
protected override void InitializeWorker(AnalysisContext context)
=> context.RegisterCompilationStartAction(CompilationStartAction);
......@@ -101,7 +101,7 @@ private void CompilationStartAction(CompilationStartAnalysisContext context)
context.ReportDiagnostic(Diagnostic.Create(descriptor, context.Symbol.Locations.First(), builder.ToImmutable()));
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
=> DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
}
}
\ No newline at end of file
......@@ -5,6 +5,13 @@ namespace Microsoft.CodeAnalysis.Diagnostics
/// <summary>
/// This interface is a marker for all the analyzers that are built in.
/// We will record non-fatal-watson if any analyzer with this interface throws an exception.
///
/// also, built in analyzer can do things that third-party analyzer (command line analyzer) can't do
/// such as reporting all diagnostic descriptors as hidden when it can return different severity on runtime.
///
/// or reporting diagnostics ID that is not reported by SupportedDiagnostics.
///
/// this interface is used by the engine to allow this special behavior over command line analyzers.
/// </summary>
internal interface IBuiltInAnalyzer
{
......
......@@ -13,7 +13,7 @@ namespace Microsoft.CodeAnalysis.PopulateSwitch
{
[DiagnosticAnalyzer(LanguageNames.CSharp, LanguageNames.VisualBasic)]
internal sealed class PopulateSwitchDiagnosticAnalyzer :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
{
private static readonly LocalizableString s_localizableTitle = new LocalizableResourceString(nameof(FeaturesResources.Add_missing_cases), FeaturesResources.ResourceManager, typeof(FeaturesResources));
private static readonly LocalizableString s_localizableMessage = new LocalizableResourceString(nameof(WorkspacesResources.Populate_switch), WorkspacesResources.ResourceManager, typeof(WorkspacesResources));
......@@ -26,7 +26,7 @@ public PopulateSwitchDiagnosticAnalyzer()
#region Interface methods
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
private static MethodInfo s_registerMethod = typeof(AnalysisContext).GetTypeInfo().GetDeclaredMethod("RegisterOperationActionImmutableArrayInternal");
......@@ -72,6 +72,6 @@ private void AnalyzeOperation(OperationAnalysisContext context)
return missingDefaultCase || missingCases;
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
}
}
\ No newline at end of file
......@@ -12,7 +12,7 @@
namespace Microsoft.CodeAnalysis.QualifyMemberAccess
{
internal abstract class AbstractQualifyMemberAccessDiagnosticAnalyzer<TLanguageKindEnum> :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
where TLanguageKindEnum : struct
{
protected AbstractQualifyMemberAccessDiagnosticAnalyzer()
......@@ -22,7 +22,7 @@ protected AbstractQualifyMemberAccessDiagnosticAnalyzer()
{
}
public bool OpenFileOnly(Workspace workspace)
public override bool OpenFileOnly(Workspace workspace)
{
var qualifyFieldAccessOption = workspace.Options.GetOption(CodeStyleOptions.QualifyFieldAccess, GetLanguageName()).Notification;
var qualifyPropertyAccessOption = workspace.Options.GetOption(CodeStyleOptions.QualifyPropertyAccess, GetLanguageName()).Notification;
......@@ -48,7 +48,7 @@ protected override void InitializeWorker(AnalysisContext context)
ImmutableArray.Create(OperationKind.FieldReferenceExpression, OperationKind.PropertyReferenceExpression, OperationKind.MethodBindingExpression)
});
public DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
private void AnalyzeOperation(OperationAnalysisContext context)
{
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
......@@ -14,7 +15,7 @@ internal static class Constants
public const string SymbolEquivalenceKey = nameof(SymbolEquivalenceKey);
}
internal abstract class AbstractUseAutoPropertyAnalyzer<TPropertyDeclaration, TFieldDeclaration, TVariableDeclarator, TExpression> :
internal abstract class AbstractUseAutoPropertyAnalyzer<TPropertyDeclaration, TFieldDeclaration, TVariableDeclarator, TExpression> :
AbstractCodeStyleDiagnosticAnalyzer
where TPropertyDeclaration : SyntaxNode
where TFieldDeclaration : SyntaxNode
......@@ -29,6 +30,9 @@ protected AbstractUseAutoPropertyAnalyzer()
{
}
public override bool OpenFileOnly(Workspace workspace) => false;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.ProjectAnalysis;
protected abstract void RegisterIneligibleFieldsAction(CompilationStartAnalysisContext context, ConcurrentBag<IFieldSymbol> ineligibleFields);
protected abstract bool SupportsReadOnlyProperties(Compilation compilation);
protected abstract bool SupportsPropertyInitializer(Compilation compilation);
......@@ -42,10 +46,10 @@ protected sealed override void InitializeWorker(AnalysisContext context)
{
var analysisResults = new ConcurrentBag<AnalysisResult>();
var ineligibleFields = new ConcurrentBag<IFieldSymbol>();
csac.RegisterSymbolAction(sac => AnalyzeProperty(analysisResults, sac), SymbolKind.Property);
RegisterIneligibleFieldsAction(csac, ineligibleFields);
csac.RegisterCompilationEndAction(cac => Process(analysisResults, ineligibleFields, cac));
});
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
......@@ -24,6 +25,9 @@ protected AbstractUseCoalesceExpressionDiagnosticAnalyzer()
{
}
public override bool OpenFileOnly(Workspace workspace) => false;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
protected abstract TSyntaxKind GetSyntaxKindToAnalyze();
protected abstract ISyntaxFactsService GetSyntaxFactsService();
protected abstract bool IsEquals(TBinaryExpressionSyntax condition);
......
......@@ -22,12 +22,15 @@ internal abstract class AbstractUseCoalesceExpressionForNullableDiagnosticAnalyz
where TMemberAccessExpression : TExpressionSyntax
where TPrefixUnaryExpressionSyntax : TExpressionSyntax
{
protected AbstractUseCoalesceExpressionForNullableDiagnosticAnalyzer()
protected AbstractUseCoalesceExpressionForNullableDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseCoalesceExpressionForNullableDiagnosticId,
new LocalizableResourceString(nameof(FeaturesResources.Use_coalesce_expression), FeaturesResources.ResourceManager, typeof(FeaturesResources)))
{
}
public override bool OpenFileOnly(Workspace workspace) => false;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
protected abstract TSyntaxKind GetSyntaxKindToAnalyze();
protected abstract ISyntaxFactsService GetSyntaxFactsService();
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CodeStyle;
using Microsoft.CodeAnalysis.Diagnostics;
......@@ -28,7 +29,8 @@ internal abstract partial class AbstractUseCollectionInitializerDiagnosticAnalyz
where TExpressionStatementSyntax : TStatementSyntax
where TVariableDeclaratorSyntax : SyntaxNode
{
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
protected AbstractUseCollectionInitializerDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseCollectionInitializerDiagnosticId,
......
......@@ -25,6 +25,9 @@ public UseExplicitTupleNameDiagnosticAnalyzer()
{
}
public override bool OpenFileOnly(Workspace workspace) => false;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticSpanAnalysis;
protected override void InitializeWorker(AnalysisContext context)
=> s_registerMethod.Invoke(context, new object[]
{
......
......@@ -33,6 +33,9 @@ protected AbstractUseNullPropagationDiagnosticAnalyzer()
{
}
public override bool OpenFileOnly(Workspace workspace) => false;
public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
protected abstract TSyntaxKind GetSyntaxKindToAnalyze();
protected abstract ISyntaxFactsService GetSyntaxFactsService();
protected abstract bool IsEquals(TBinaryExpressionSyntax condition);
......
......@@ -17,7 +17,7 @@ internal abstract partial class AbstractUseObjectInitializerDiagnosticAnalyzer<
TMemberAccessExpressionSyntax,
TAssignmentStatementSyntax,
TVariableDeclaratorSyntax>
: AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
: AbstractCodeStyleDiagnosticAnalyzer
where TSyntaxKind : struct
where TExpressionSyntax : SyntaxNode
where TStatementSyntax : SyntaxNode
......@@ -28,7 +28,7 @@ internal abstract partial class AbstractUseObjectInitializerDiagnosticAnalyzer<
{
protected abstract bool FadeOutOperatorToken { get; }
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
protected AbstractUseObjectInitializerDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseObjectInitializerDiagnosticId,
......@@ -132,7 +132,7 @@ private void AnalyzeNode(SyntaxNodeAnalysisContext context)
protected abstract ISyntaxFactsService GetSyntaxFactsService();
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
{
return DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
}
......
......@@ -32,7 +32,7 @@ namespace Microsoft.CodeAnalysis.UseThrowExpression
/// expressions as well.
/// </summary>
internal abstract class AbstractUseThrowExpressionDiagnosticAnalyzer :
AbstractCodeStyleDiagnosticAnalyzer, IBuiltInAnalyzer
AbstractCodeStyleDiagnosticAnalyzer
{
protected AbstractUseThrowExpressionDiagnosticAnalyzer()
: base(IDEDiagnosticIds.UseThrowExpressionDiagnosticId,
......@@ -41,10 +41,10 @@ protected AbstractUseThrowExpressionDiagnosticAnalyzer()
{
}
public DiagnosticAnalyzerCategory GetAnalyzerCategory()
public override DiagnosticAnalyzerCategory GetAnalyzerCategory()
=> DiagnosticAnalyzerCategory.SemanticDocumentAnalysis;
public bool OpenFileOnly(Workspace workspace) => false;
public override bool OpenFileOnly(Workspace workspace) => false;
private static MethodInfo s_registerOperationActionInfo =
typeof(CompilationStartAnalysisContext).GetTypeInfo().GetDeclaredMethod("RegisterOperationActionImmutableArrayInternal");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册