Skip to content

Commit

Permalink
Merge pull request #909 from mavasani/Issue737
Browse files Browse the repository at this point in the history
Add support for catching incorrect usage/registration of Operation ac…
  • Loading branch information
mavasani committed Apr 1, 2016
2 parents 9219260 + 42458ea commit 5d7f034
Show file tree
Hide file tree
Showing 11 changed files with 599 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,20 @@ public class CSharpRegisterActionAnalyzer : RegisterActionAnalyzer<ClassDeclarat
internal static readonly string CSharpSyntaxKindName = typeof(SyntaxKind).FullName;
internal static readonly string BasicSyntaxKindName = @"Microsoft.CodeAnalysis.VisualBasic.SyntaxKind";

protected override RegisterActionCodeBlockAnalyzer GetCodeBlockAnalyzer(Compilation compilation, INamedTypeSymbol analysisContext, INamedTypeSymbol compilationStartAnalysisContext, INamedTypeSymbol codeBlockStartAnalysisContext, INamedTypeSymbol symbolKind, INamedTypeSymbol diagnosticAnalyzer, INamedTypeSymbol diagnosticAnalyzerAttribute)
protected override RegisterActionCodeBlockAnalyzer GetCodeBlockAnalyzer(
Compilation compilation,
INamedTypeSymbol analysisContext,
INamedTypeSymbol compilationStartAnalysisContext,
INamedTypeSymbol codeBlockStartAnalysisContext,
INamedTypeSymbol operationBlockStartAnalysisContext,
INamedTypeSymbol symbolKind,
INamedTypeSymbol diagnosticAnalyzer,
INamedTypeSymbol diagnosticAnalyzerAttribute)
{
INamedTypeSymbol csharpSyntaxKind = compilation.GetTypeByMetadataName(CSharpSyntaxKindName);
INamedTypeSymbol basicSyntaxKind = compilation.GetTypeByMetadataName(BasicSyntaxKindName);
return new CSharpRegisterActionCodeBlockAnalyzer(csharpSyntaxKind, basicSyntaxKind, analysisContext, compilationStartAnalysisContext, codeBlockStartAnalysisContext, symbolKind, diagnosticAnalyzer, diagnosticAnalyzerAttribute);
return new CSharpRegisterActionCodeBlockAnalyzer(csharpSyntaxKind, basicSyntaxKind, analysisContext, compilationStartAnalysisContext,
codeBlockStartAnalysisContext, operationBlockStartAnalysisContext, symbolKind, diagnosticAnalyzer, diagnosticAnalyzerAttribute);
}

private sealed class CSharpRegisterActionCodeBlockAnalyzer : RegisterActionCodeBlockAnalyzer
Expand All @@ -31,10 +40,11 @@ public CSharpRegisterActionCodeBlockAnalyzer(
INamedTypeSymbol analysisContext,
INamedTypeSymbol compilationStartAnalysisContext,
INamedTypeSymbol codeBlockStartAnalysisContext,
INamedTypeSymbol operationBlockStartAnalysisContext,
INamedTypeSymbol symbolKind,
INamedTypeSymbol diagnosticAnalyzer,
INamedTypeSymbol diagnosticAnalyzerAttribute)
: base(analysisContext, compilationStartAnalysisContext, codeBlockStartAnalysisContext, symbolKind, diagnosticAnalyzer, diagnosticAnalyzerAttribute)
: base(analysisContext, compilationStartAnalysisContext, codeBlockStartAnalysisContext, operationBlockStartAnalysisContext, symbolKind, diagnosticAnalyzer, diagnosticAnalyzerAttribute)
{
_csharpSyntaxKind = csharpSyntaxKind;
_basicSyntaxKind = basicSyntaxKind;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,26 @@
<data name="ApplyDiagnosticAnalyzerAttribute_2" xml:space="preserve">
<value>Apply DiagnosticAnalyzer attribute for both '{0}' and '{1}'.</value>
</data>
<data name="MissingKindArgumentToRegisterActionMessage" xml:space="preserve">
<value>Specify at least one '{0}' of interest while registering a {1} analyzer action.</value>
<data name="MissingSymbolKindArgumentToRegisterActionMessage" xml:space="preserve">
<value>Specify at least one SymbolKind of interest when registering a symbol analyzer action.</value>
</data>
<data name="MissingSyntaxKindArgumentToRegisterActionMessage" xml:space="preserve">
<value>Specify at least one SyntaxKind of interest when registering a syntax node analyzer action.</value>
</data>
<data name="MissingOperationKindArgumentToRegisterActionMessage" xml:space="preserve">
<value>Specify at least one OperationKind of interest when registering an operation analyzer action.</value>
</data>
<data name="MissingKindArgumentToRegisterActionTitle" xml:space="preserve">
<value>Missing kind argument while registering an analyzer action.</value>
<value>Missing kind argument when registering an analyzer action.</value>
</data>
<data name="MissingKindArgumentToRegisterActionDescription" xml:space="preserve">
<value>You must specify at least one syntax/symbol kinds of interest while registering a syntax/symbol analyzer action. Otherwise, the registered action will be dead code and will never be invoked during analysis.</value>
<value>You must specify at least one syntax, symbol or operation kind when registering a syntax, symbol, or operation analyzer action respectively. Otherwise, the registered action will never be invoked during analysis.</value>
</data>
<data name="UnsupportedSymbolKindArgumentToRegisterActionMessage" xml:space="preserve">
<value>SymbolKind '{0}' is not supported for symbol analyzer actions.</value>
</data>
<data name="UnsupportedSymbolKindArgumentToRegisterActionTitle" xml:space="preserve">
<value>Unsupported SymbolKind argument while registering a symbol analyzer action.</value>
<value>Unsupported SymbolKind argument when registering a symbol analyzer action.</value>
</data>
<data name="InvalidReportDiagnosticMessage" xml:space="preserve">
<value>ReportDiagnostic invoked with an unsupported DiagnosticDescriptor '{0}'.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,21 @@ public abstract partial class DiagnosticAnalyzerCorrectnessAnalyzer : Diagnostic
internal static readonly string SyntaxNodeAnalysisContextFullName = typeof(SyntaxNodeAnalysisContext).FullName;
internal static readonly string SyntaxTreeAnalysisContextFullName = typeof(SyntaxTreeAnalysisContext).FullName;
internal static readonly string CodeBlockStartAnalysisContextFullName = typeof(CodeBlockStartAnalysisContext<>).FullName;
internal static readonly string CodeBlockEndAnalysisContextFullName = typeof(CodeBlockAnalysisContext).FullName;
internal static readonly string CodeBlockAnalysisContextFullName = typeof(CodeBlockAnalysisContext).FullName;
internal static readonly string OperationBlockStartAnalysisContextFullName = typeof(OperationBlockStartAnalysisContext).FullName;
internal static readonly string OperationBlockAnalysisContextFullName = typeof(OperationBlockAnalysisContext).FullName;
internal static readonly string OperationAnalysisContextFullName = typeof(OperationAnalysisContext).FullName;
internal static readonly string SymbolKindFullName = typeof(SymbolKind).FullName;

internal const string RegisterSyntaxNodeActionName = nameof(AnalysisContext.RegisterSyntaxNodeAction);
internal const string RegisterSymbolActionName = nameof(AnalysisContext.RegisterSymbolAction);
internal const string RegisterCodeBlockStartActionName = nameof(AnalysisContext.RegisterCodeBlockStartAction);
internal const string RegisterCodeBlockEndActionName = nameof(CodeBlockStartAnalysisContext<int>.RegisterCodeBlockEndAction);
internal const string RegisterCodeBlockActionName = nameof(AnalysisContext.RegisterCodeBlockAction);
internal const string RegisterOperationBlockStartActionName = nameof(AnalysisContext.RegisterOperationBlockStartAction);
internal const string RegisterOperationBlockEndActionName = nameof(OperationBlockStartAnalysisContext.RegisterOperationBlockEndAction);
internal const string RegisterOperationBlockActionName = nameof(AnalysisContext.RegisterOperationBlockAction);
internal const string RegisterOperationActionName = nameof(AnalysisContext.RegisterOperationAction);
internal const string RegisterCompilationStartActionName = nameof(AnalysisContext.RegisterCompilationStartAction);
internal const string RegisterCompilationEndActionName = nameof(CompilationStartAnalysisContext.RegisterCompilationEndAction);
internal const string RegisterCompilationActionName = nameof(AnalysisContext.RegisterCompilationAction);
Expand Down
Loading

0 comments on commit 5d7f034

Please sign in to comment.