Skip to content

Commit

Permalink
Merge pull request #23390 from zaytsev-victor/Fixed22776
Browse files Browse the repository at this point in the history
Fixed 'Qualify member access' analyzer for object initializer
  • Loading branch information
sharwell authored Nov 28, 2017
2 parents 21127b7 + 5f1603d commit 925ac9b
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1238,6 +1238,44 @@ await TestAsyncWithOption(
public string Foo { get; set; }
public string Bar { get { return Foo; } => this.Foo; }
}",
CodeStyleOptions.QualifyPropertyAccess);
}

[WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task DoNotReportToQualify_InObjectInitializer1()
{
await TestMissingAsyncWithOption(
@"public class C
{
public string Foo { get; set; }
public void Bar()
{
var c = new C
{
[|Foo|] = string.Empty
};
}
}",
CodeStyleOptions.QualifyPropertyAccess);
}

[WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task DoNotReportToQualify_InObjectInitializer2()
{
await TestMissingAsyncWithOption(
@"public class C
{
public string Foo;
public void Bar()
{
var c = new C
{
[|Foo|] = string.Empty
};
}
}",
CodeStyleOptions.QualifyPropertyAccess);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,36 @@ Class C
Private Shared Field As String = NameOf([|Value|])
End Class
",
CodeStyleOptions.QualifyFieldAccess)
End Function

<WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function DoNotReportToQualify_InObjectInitializer1() As Task
Await TestMissingAsyncWithOption("
class C
Public Foo As Integer

Sub Bar()
Dim c = New C() With { [|.Foo = 1|] }
End Sub
End Class
",
CodeStyleOptions.QualifyFieldAccess)
End Function

<WorkItem(22776, "https://github.com/dotnet/roslyn/issues/22776")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function DoNotReportToQualify_InObjectInitializer2() As Task
Await TestMissingAsyncWithOption("
class C
Public Property Foo As Integer

Sub Bar()
Dim c = New C() With { [|.Foo|] = 1 }
End Sub
End Class
",
CodeStyleOptions.QualifyFieldAccess)
End Function
End Class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,13 @@ protected override string GetLanguageName()
protected override bool IsAlreadyQualifiedMemberAccess(SyntaxNode node)
=> node.IsKind(SyntaxKind.ThisExpression);

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

private bool IsInPropertyOrFieldInitialization(ISymbol containingSymbol, SyntaxNode node)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.QualifyMemberAccess
End Function

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

0 comments on commit 925ac9b

Please sign in to comment.