diff --git a/src/Analyzers/CSharp/Analyzers/UseAutoProperty/CSharpUseAutoPropertyAnalyzer.cs b/src/Analyzers/CSharp/Analyzers/UseAutoProperty/CSharpUseAutoPropertyAnalyzer.cs index ac65a9e833852..f233637622a7f 100644 --- a/src/Analyzers/CSharp/Analyzers/UseAutoProperty/CSharpUseAutoPropertyAnalyzer.cs +++ b/src/Analyzers/CSharp/Analyzers/UseAutoProperty/CSharpUseAutoPropertyAnalyzer.cs @@ -10,7 +10,6 @@ using Microsoft.CodeAnalysis.CSharp.Extensions; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Diagnostics; -using Microsoft.CodeAnalysis.LanguageService; using Microsoft.CodeAnalysis.Shared.Extensions; using Microsoft.CodeAnalysis.UseAutoProperty; using Roslyn.Utilities; @@ -18,14 +17,14 @@ namespace Microsoft.CodeAnalysis.CSharp.UseAutoProperty; [DiagnosticAnalyzer(LanguageNames.CSharp)] -internal sealed class CSharpUseAutoPropertyAnalyzer : AbstractUseAutoPropertyAnalyzer< +internal sealed class CSharpUseAutoPropertyAnalyzer() : AbstractUseAutoPropertyAnalyzer< SyntaxKind, PropertyDeclarationSyntax, ConstructorDeclarationSyntax, FieldDeclarationSyntax, VariableDeclaratorSyntax, ExpressionSyntax, - IdentifierNameSyntax> + IdentifierNameSyntax>(CSharpSemanticFacts.Instance) { protected override SyntaxKind PropertyDeclarationKind => SyntaxKind.PropertyDeclaration; @@ -36,9 +35,6 @@ protected override bool CanExplicitInterfaceImplementationsBeFixed protected override bool SupportsFieldAttributesOnProperties => true; - protected override ISemanticFacts SemanticFacts - => CSharpSemanticFacts.Instance; - protected override bool SupportsReadOnlyProperties(Compilation compilation) => compilation.LanguageVersion() >= LanguageVersion.CSharp6; diff --git a/src/Analyzers/CSharp/Tests/UseAutoProperty/UseAutoPropertyTests.cs b/src/Analyzers/CSharp/Tests/UseAutoProperty/UseAutoPropertyTests.cs index 96306663905c7..79e405093f252 100644 --- a/src/Analyzers/CSharp/Tests/UseAutoProperty/UseAutoPropertyTests.cs +++ b/src/Analyzers/CSharp/Tests/UseAutoProperty/UseAutoPropertyTests.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Microsoft.CodeAnalysis.CodeFixes; using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Shared.Extensions; using Microsoft.CodeAnalysis.CSharp.Test.Utilities; using Microsoft.CodeAnalysis.CSharp.UseAutoProperty; using Microsoft.CodeAnalysis.Diagnostics; @@ -3115,4 +3114,24 @@ public required string Action } """); } + + [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/76634")] + public async Task TestRefField() + { + await TestMissingInRegularAndScriptAsync( + """ + class Class + { + [|ref int i|]; + + int P + { + get + { + return i; + } + } + } + """); + } } diff --git a/src/Analyzers/Core/Analyzers/UseAutoProperty/AbstractUseAutoPropertyAnalyzer.cs b/src/Analyzers/Core/Analyzers/UseAutoProperty/AbstractUseAutoPropertyAnalyzer.cs index cd99a47d46ffd..811855d577c41 100644 --- a/src/Analyzers/Core/Analyzers/UseAutoProperty/AbstractUseAutoPropertyAnalyzer.cs +++ b/src/Analyzers/Core/Analyzers/UseAutoProperty/AbstractUseAutoPropertyAnalyzer.cs @@ -28,7 +28,12 @@ internal abstract partial class AbstractUseAutoPropertyAnalyzer< TFieldDeclaration, TVariableDeclarator, TExpression, - TIdentifierName> : AbstractBuiltInCodeStyleDiagnosticAnalyzer + TIdentifierName>(ISemanticFacts semanticFacts) + : AbstractBuiltInCodeStyleDiagnosticAnalyzer(IDEDiagnosticIds.UseAutoPropertyDiagnosticId, + EnforceOnBuildValues.UseAutoProperty, + CodeStyleOptions2.PreferAutoProperties, + new LocalizableResourceString(nameof(AnalyzersResources.Use_auto_property), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), + new LocalizableResourceString(nameof(AnalyzersResources.Use_auto_property), AnalyzersResources.ResourceManager, typeof(AnalyzersResources))) where TSyntaxKind : struct, Enum where TPropertyDeclaration : SyntaxNode where TConstructorDeclaration : SyntaxNode @@ -48,17 +53,7 @@ internal abstract partial class AbstractUseAutoPropertyAnalyzer< /// /// Not static as this has different semantics around case sensitivity for C# and VB. /// - private readonly ObjectPool> _fieldNamesPool; - - protected AbstractUseAutoPropertyAnalyzer() - : base(IDEDiagnosticIds.UseAutoPropertyDiagnosticId, - EnforceOnBuildValues.UseAutoProperty, - CodeStyleOptions2.PreferAutoProperties, - new LocalizableResourceString(nameof(AnalyzersResources.Use_auto_property), AnalyzersResources.ResourceManager, typeof(AnalyzersResources)), - new LocalizableResourceString(nameof(AnalyzersResources.Use_auto_property), AnalyzersResources.ResourceManager, typeof(AnalyzersResources))) - { - _fieldNamesPool = new(() => new(this.SyntaxFacts.StringComparer)); - } + private readonly ObjectPool> _fieldNamesPool = new(() => new(semanticFacts.SyntaxFacts.StringComparer)); protected static void AddFieldUsage(ConcurrentDictionary> fieldWrites, IFieldSymbol field, SyntaxNode location) => fieldWrites.GetOrAdd(field, static _ => s_nodeSetPool.Allocate()).Add(location); @@ -78,8 +73,8 @@ private static void ClearAndFree(ConcurrentDictionary DiagnosticAnalyzerCategory.SemanticDocumentAnalysis; - protected abstract ISemanticFacts SemanticFacts { get; } - protected ISyntaxFacts SyntaxFacts => this.SemanticFacts.SyntaxFacts; + private ISemanticFacts SemanticFacts { get; } = semanticFacts; + private ISyntaxFacts SyntaxFacts => SemanticFacts.SyntaxFacts; protected abstract TSyntaxKind PropertyDeclarationKind { get; } @@ -139,6 +134,8 @@ protected sealed override void InitializeWorker(AnalysisContext context) IsConst: false, // Can't preserve volatile semantics on a property. IsVolatile: false, + // Can't have an autoprop that returns by-ref. + RefKind: RefKind.None, // To make processing later on easier, limit to well-behaved fields (versus having multiple // fields merged together in error recoery scenarios). DeclaringSyntaxReferences.Length: 1, diff --git a/src/Analyzers/VisualBasic/Analyzers/UseAutoProperty/VisualBasicUseAutoPropertyAnalyzer.vb b/src/Analyzers/VisualBasic/Analyzers/UseAutoProperty/VisualBasicUseAutoPropertyAnalyzer.vb index 044d82e42b2f8..a11a47261b69b 100644 --- a/src/Analyzers/VisualBasic/Analyzers/UseAutoProperty/VisualBasicUseAutoPropertyAnalyzer.vb +++ b/src/Analyzers/VisualBasic/Analyzers/UseAutoProperty/VisualBasicUseAutoPropertyAnalyzer.vb @@ -3,16 +3,14 @@ ' See the LICENSE file in the project root for more information. Imports System.Collections.Concurrent -Imports System.Collections.Immutable Imports System.Threading Imports Microsoft.CodeAnalysis.Diagnostics -Imports Microsoft.CodeAnalysis.LanguageService Imports Microsoft.CodeAnalysis.UseAutoProperty Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.UseAutoProperty - Friend Class VisualBasicUseAutoPropertyAnalyzer + Friend NotInheritable Class VisualBasicUseAutoPropertyAnalyzer Inherits AbstractUseAutoPropertyAnalyzer(Of SyntaxKind, PropertyBlockSyntax, @@ -22,9 +20,11 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.UseAutoProperty ExpressionSyntax, IdentifierNameSyntax) - Protected Overrides ReadOnly Property PropertyDeclarationKind As SyntaxKind = SyntaxKind.PropertyBlock + Public Sub New() + MyBase.New(VisualBasicSemanticFacts.Instance) + End Sub - Protected Overrides ReadOnly Property SemanticFacts As ISemanticFacts = VisualBasicSemanticFacts.Instance + Protected Overrides ReadOnly Property PropertyDeclarationKind As SyntaxKind = SyntaxKind.PropertyBlock Protected Overrides Function SupportsReadOnlyProperties(compilation As Compilation) As Boolean Return DirectCast(compilation, VisualBasicCompilation).LanguageVersion >= LanguageVersion.VisualBasic14