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..8d0a0b3688a4f 100644 --- a/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs +++ b/src/Analyzers/Core/Analyzers/AbstractBuiltInCodeStyleDiagnosticAnalyzer_Core.cs @@ -65,10 +65,16 @@ protected static DiagnosticDescriptor CreateDescriptorWithId( customTags: DiagnosticCustomTags.Create(isUnnecessary, isConfigurable, enforceOnBuild)); #pragma warning restore RS0030 // Do not used banned APIs + /// + /// 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) { - // Code style analyzers should not run on generated code. - context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + 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 273404db77b94..af266f53e39ad 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 bool ReceiveAnalysisCallbacksForGeneratedCode => true; + protected override void InitializeWorker(AnalysisContext context) { context.RegisterCompilationStartAction(compilationStartContext =>