Skip to content

Commit 925ac9b

Browse files
authored
Merge pull request #23390 from zaytsev-victor/Fixed22776
Fixed 'Qualify member access' analyzer for object initializer
2 parents 21127b7 + 5f1603d commit 925ac9b

File tree

4 files changed

+77
-4
lines changed

4 files changed

+77
-4
lines changed

src/EditorFeatures/CSharpTest/QualifyMemberAccess/QualifyMemberAccessTests.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,44 @@ await TestAsyncWithOption(
12381238
public string Foo { get; set; }
12391239
public string Bar { get { return Foo; } => this.Foo; }
12401240
}",
1241+
CodeStyleOptions.QualifyPropertyAccess);
1242+
}
1243+
1244+
[WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")]
1245+
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
1246+
public async Task DoNotReportToQualify_InObjectInitializer1()
1247+
{
1248+
await TestMissingAsyncWithOption(
1249+
@"public class C
1250+
{
1251+
public string Foo { get; set; }
1252+
public void Bar()
1253+
{
1254+
var c = new C
1255+
{
1256+
[|Foo|] = string.Empty
1257+
};
1258+
}
1259+
}",
1260+
CodeStyleOptions.QualifyPropertyAccess);
1261+
}
1262+
1263+
[WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")]
1264+
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
1265+
public async Task DoNotReportToQualify_InObjectInitializer2()
1266+
{
1267+
await TestMissingAsyncWithOption(
1268+
@"public class C
1269+
{
1270+
public string Foo;
1271+
public void Bar()
1272+
{
1273+
var c = new C
1274+
{
1275+
[|Foo|] = string.Empty
1276+
};
1277+
}
1278+
}",
12411279
CodeStyleOptions.QualifyPropertyAccess);
12421280
}
12431281
}

src/EditorFeatures/VisualBasicTest/QualifyMemberAccess/QualifyMemberAccessTests.vb

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,36 @@ Class C
586586
Private Shared Field As String = NameOf([|Value|])
587587
End Class
588588
",
589+
CodeStyleOptions.QualifyFieldAccess)
590+
End Function
591+
592+
<WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")>
593+
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
594+
Public Async Function DoNotReportToQualify_InObjectInitializer1() As Task
595+
Await TestMissingAsyncWithOption("
596+
class C
597+
Public Foo As Integer
598+
599+
Sub Bar()
600+
Dim c = New C() With { [|.Foo = 1|] }
601+
End Sub
602+
End Class
603+
",
604+
CodeStyleOptions.QualifyFieldAccess)
605+
End Function
606+
607+
<WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")>
608+
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
609+
Public Async Function DoNotReportToQualify_InObjectInitializer2() As Task
610+
Await TestMissingAsyncWithOption("
611+
class C
612+
Public Property Foo As Integer
613+
614+
Sub Bar()
615+
Dim c = New C() With { [|.Foo|] = 1 }
616+
End Sub
617+
End Class
618+
",
589619
CodeStyleOptions.QualifyFieldAccess)
590620
End Function
591621
End Class

src/Features/CSharp/Portable/QualifyMemberAccess/CSharpQualifyMemberAccessDiagnosticAnalyzer.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@ protected override string GetLanguageName()
1616
protected override bool IsAlreadyQualifiedMemberAccess(SyntaxNode node)
1717
=> node.IsKind(SyntaxKind.ThisExpression);
1818

19-
// If the member is already qualified with `base.`, it cannot be further qualified.
19+
// If the member is already qualified with `base.`,
20+
// or member is in object initialization context,
21+
// or member in property or field initialization, it cannot be qualified.
2022
protected override bool CanMemberAccessBeQualified(ISymbol containingSymbol, SyntaxNode node)
21-
=> !(node.IsKind(SyntaxKind.BaseExpression) || IsInPropertyOrFieldInitialization(containingSymbol, node));
23+
=> !(node.IsKind(SyntaxKind.BaseExpression) ||
24+
node.Parent.Parent.IsKind(SyntaxKind.ObjectInitializerExpression) ||
25+
IsInPropertyOrFieldInitialization(containingSymbol, node));
2226

2327
private bool IsInPropertyOrFieldInitialization(ISymbol containingSymbol, SyntaxNode node)
2428
{

src/Features/VisualBasic/Portable/Diagnostics/Analyzers/VisualBasicQualifyMemberAccessDiagnosticAnalyzer.vb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.QualifyMemberAccess
1717
End Function
1818

1919
Protected Overrides Function CanMemberAccessBeQualified(containingSymbol As ISymbol, node As SyntaxNode) As Boolean
20-
' If the member is already qualified with `MyBase.`, or `MyClass.`, it cannot be further qualified.
21-
Return Not (node.IsKind(SyntaxKind.MyBaseExpression) OrElse node.IsKind(SyntaxKind.MyClassExpression))
20+
' If the member is already qualified with `MyBase.`, or `MyClass.`,
21+
' or member is in object initialization context, it cannot be qualified.
22+
Return Not (node.IsKind(SyntaxKind.MyBaseExpression) OrElse node.IsKind(SyntaxKind.MyClassExpression) OrElse node.IsKind(SyntaxKind.ObjectCreationExpression))
2223
End Function
2324
End Class
2425
End Namespace

0 commit comments

Comments
 (0)