From 500735cc955b55d9b0bba0753c48089b56fd9233 Mon Sep 17 00:00:00 2001 From: Manish Vasani Date: Mon, 19 Apr 2021 01:52:03 -0700 Subject: [PATCH 1/2] Ensure that we register to analyzer generated code for MakeFieldReadOnly analyzer Fixes #50925 Note that we only pass in the `Analyze` flag, not the `ReportDiagnostics` flag, so that fields defined in generated code are not flagged. --- .../MakeFieldReadonlyTests.cs | 33 +++++++++++++++++++ ...BuiltInCodeStyleDiagnosticAnalyzer_Core.cs | 6 ++-- .../MakeFieldReadonlyDiagnosticAnalyzer.cs | 3 ++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Analyzers/CSharp/Tests/MakeFieldReadonly/MakeFieldReadonlyTests.cs b/src/Analyzers/CSharp/Tests/MakeFieldReadonly/MakeFieldReadonlyTests.cs index 58a279a732dec..811f51493f746 100644 --- a/src/Analyzers/CSharp/Tests/MakeFieldReadonly/MakeFieldReadonlyTests.cs +++ b/src/Analyzers/CSharp/Tests/MakeFieldReadonly/MakeFieldReadonlyTests.cs @@ -1746,5 +1746,38 @@ class Program private static object [|t_obj|]; }"); } + + [WorkItem(50925, "https://github.com/dotnet/roslyn/issues/50925")] + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsMakeFieldReadonly)] + public async Task Test_MemberUsedInGeneratedCode() + { + await TestMissingInRegularAndScriptAsync( +@" + + +public sealed partial class Test +{ + private int [|_value|]; + + public static void M() + => _ = new Test { Value = 1 }; +} + + +using System.CodeDom.Compiler; + +[GeneratedCode(null, null)] +public sealed partial class Test +{ + public int Value + { + get => _value; + set => _value = value; + } +} + + +"); + } } } diff --git a/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs b/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs index 5793dc9e32a43..c34f2c550297a 100644 --- a/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs +++ b/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs @@ -65,10 +65,12 @@ protected static DiagnosticDescriptor CreateDescriptorWithId( customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, enforceOnBuild)); #pragma warning restore RS0030 // Do not used banned APIs + // Code style analyzers should not run on generated code, unless explicitly required by the analyzer. + protected virtual GeneratedCodeAnalysisFlags GeneratedCodeAnalysisFlags => GeneratedCodeAnalysisFlags.None; + public sealed override void Initialize(AnalysisContext context) { - // Code style analyzers should not run on generated code. - context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags); context.EnableConcurrentExecution(); InitializeWorker(context); diff --git a/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs index 273404db77b94..ccf362a7ab32d 100644 --- a/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs @@ -31,6 +31,9 @@ public MakeFieldReadonlyDiagnosticAnalyzer() public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; + // We need to analyze generated code to get callbacks for read/writes to non-generated members in generated code. + protected override GeneratedCodeAnalysisFlags GeneratedCodeAnalysisFlags => GeneratedCodeAnalysisFlags.Analyze; + protected override void InitializeWorker(AnalysisContext context) { context.RegisterCompilationStartAction(compilationStartContext => From de17f29dd427abc78bfd6ec295a820948d88ef28 Mon Sep 17 00:00:00 2001 From: Manish Vasani Date: Mon, 19 Apr 2021 03:56:18 -0700 Subject: [PATCH 2/2] Address feedback --- .../AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs | 10 +++++++--- .../MakeFieldReadonlyDiagnosticAnalyzer.cs | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs b/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs index c34f2c550297a..8d0a0b3688a4f 100644 --- a/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs +++ b/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs @@ -65,12 +65,16 @@ protected static DiagnosticDescriptor CreateDescriptorWithId( customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, enforceOnBuild)); #pragma warning restore RS0030 // Do not used banned APIs - // Code style analyzers should not run on generated code, unless explicitly required by the analyzer. - protected virtual GeneratedCodeAnalysisFlags GeneratedCodeAnalysisFlags => GeneratedCodeAnalysisFlags.None; + /// + /// Flag indicating whether or not analyzer should receive analysis callbacks for generated code. + /// By default, code style analyzers should not run on generated code, so the value is false. + /// + protected virtual bool ReceiveAnalysisCallbacksForGeneratedCode => false; public sealed override void Initialize(AnalysisContext context) { - context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags); + var flags = ReceiveAnalysisCallbacksForGeneratedCode ? GeneratedCodeAnalysisFlags.Analyze : GeneratedCodeAnalysisFlags.None; + context.ConfigureGeneratedCodeAnalysis(flags); context.EnableConcurrentExecution(); InitializeWorker(context); diff --git a/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs b/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs index ccf362a7ab32d..af266f53e39ad 100644 --- a/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/MakeFieldReadonly/MakeFieldReadonlyDiagnosticAnalyzer.cs @@ -32,7 +32,7 @@ public MakeFieldReadonlyDiagnosticAnalyzer() public override DiagnosticAnalyzerCategory GetAnalyzerCategory() => DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; // We need to analyze generated code to get callbacks for read/writes to non-generated members in generated code. - protected override GeneratedCodeAnalysisFlags GeneratedCodeAnalysisFlags => GeneratedCodeAnalysisFlags.Analyze; + protected override bool ReceiveAnalysisCallbacksForGeneratedCode => true; protected override void InitializeWorker(AnalysisContext context) {