Skip to content

Commit

Permalink
convert analyzer to be IOperation-based
Browse files Browse the repository at this point in the history
Due to issues dotnet#7584 and dotnet#7587 adding `this.`/`Me.` is disabled for
methods and events.

Also add tests for verifying that no diagnostics are generated for static
access or `base`/`MyBase` access.
  • Loading branch information
brettfo committed Feb 26, 2016
1 parent 863cdf4 commit eb954db
Show file tree
Hide file tree
Showing 8 changed files with 246 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ private Task TestAsyncWithOption(string code, string expected, PerLanguageOption
return TestAsync(code, expected, options: Option(option, true));
}

private Task TestMissingAsyncWithOption(string code, PerLanguageOption<bool> option)
{
return TestMissingAsync(code, options: Option(option, true));
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyFieldAccess_LHS()
Expand Down Expand Up @@ -75,6 +80,24 @@ await TestAsyncWithOption(
SimplificationOptions.QualifyFieldAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyFieldAccess_NotSuggestedOnBase()
{
await TestMissingAsyncWithOption(
@"class Base { protected int i; } class Derived : Base { void M() { [|i|] = 1; } }",
SimplificationOptions.QualifyFieldAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyFieldAccess_NotSuggestedOnStatic()
{
await TestMissingAsyncWithOption(
@"class C { static int i; void M() { [|i|] = 1; } }",
SimplificationOptions.QualifyFieldAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyPropertyAccess_LHS()
Expand Down Expand Up @@ -127,6 +150,24 @@ await TestAsyncWithOption(

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyPropertyAccess_NotSuggestedOnBase()
{
await TestMissingAsyncWithOption(
@"class Base { protected int i { get; set; } } class Derived : Base { void M() { [|i|] = 1; } }",
SimplificationOptions.QualifyPropertyAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyPropertyAccess_NotSuggestedOnStatic()
{
await TestMissingAsyncWithOption(
@"class C { static int i { get; set; } void M() { [|i|] = 1; } }",
SimplificationOptions.QualifyPropertyAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_VoidCallWithArguments()
{
await TestAsyncWithOption(
Expand All @@ -136,7 +177,7 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_AsReturn()
{
await TestAsyncWithOption(
Expand All @@ -146,7 +187,7 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_ChainedAccess()
{
await TestAsyncWithOption(
Expand All @@ -156,7 +197,7 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_ConditionalAccess()
{
await TestAsyncWithOption(
Expand All @@ -166,7 +207,7 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_EventSubscription1()
{
await TestAsyncWithOption(
Expand All @@ -176,7 +217,7 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_EventSubscription2()
{
await TestAsyncWithOption(
Expand All @@ -187,6 +228,24 @@ await TestAsyncWithOption(

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_NotSuggestedOnBase()
{
await TestMissingAsyncWithOption(
@"class Base { protected void Method() { } } class Derived : Base { void M() { [|Method|](); } }",
SimplificationOptions.QualifyMethodAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyMethodAccess_NotSuggestedOnStatic()
{
await TestMissingAsyncWithOption(
@"class C { static void Method() { } void M() { [|Method|](); } }",
SimplificationOptions.QualifyMethodAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7587"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccess_EventSubscription()
{
await TestAsyncWithOption(
Expand All @@ -196,7 +255,17 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7587"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccessAsProperty_EventSubscription()
{
await TestAsyncWithOption(
@"using System; class C { event EventHandler e { add { } remove { } } void Handler(object sender, EventArgs args) { [|e|] += Handler; } }",
@"using System; class C { event EventHandler e { add { } remove { } } void Handler(object sender, EventArgs args) { this.e += Handler; } }",
SimplificationOptions.QualifyEventAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7587"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccess_InvokeEvent1()
{
await TestAsyncWithOption(
Expand All @@ -206,7 +275,7 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7587"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccess_InvokeEvent2()
{
await TestAsyncWithOption(
Expand All @@ -216,12 +285,30 @@ await TestAsyncWithOption(
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
[Fact(Skip = "https://github.com/dotnet/roslyn/issues/7587"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccess_InvokeEvent3()
{
await TestAsyncWithOption(
@"using System; class C { event EventHandler e; void OnSomeEvent() { [|e|]?.Invoke(this, new EventArgs()); } }",
@"using System; class C { event EventHandler e; void OnSomeEvent() { this.e?.Invoke(this, new EventArgs()); } }",
SimplificationOptions.QualifyEventAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccess_NotSuggestedOnBase()
{
await TestMissingAsyncWithOption(
@"using System; class Base { protected event EventHandler e; } class Derived : Base { void Handler(object sender, EventArgs args) { [|e|] += Handler; } }",
SimplificationOptions.QualifyEventAccess);
}

[WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")]
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)]
public async Task QualifyEventAccess_NotSuggestedOnStatic()
{
await TestMissingAsyncWithOption(
@"using System; class C { static event EventHandler e; } void Handler(object sender, EventArgs args) { [|e|] += Handler; } }",
SimplificationOptions.QualifyEventAccess);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.Qualif
Return TestAsync(code, expected, options:=[Option](opt, True))
End Function

Private Function TestMissingAsyncWithOption(code As String, opt As PerLanguageOption(Of Boolean)) As Task
Return TestMissingAsync(code, options:=[Option](opt, True))
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyFieldAccess_LHS() As Task
Expand Down Expand Up @@ -65,6 +69,31 @@ SimplificationOptions.QualifyFieldAccess)
SimplificationOptions.QualifyFieldAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyFieldAccess_NotSuggestedOnBase() As Task
Await TestMissingAsyncWithOption("
Class Base
Protected i As Integer
End Class
Class Derived
Inherits Base
Sub M()
[|i|] = 1
End Sub
End Class
",
SimplificationOptions.QualifyFieldAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyFieldAccess_NotSuggestedOnShared() As Task
Await TestMissingAsyncWithOption(
"Class C : Shared i As Integer : Sub M() : [|i|] = 1 : End Sub : End Class",
SimplificationOptions.QualifyFieldAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyPropertyAccess_LHS() As Task
Expand Down Expand Up @@ -112,6 +141,31 @@ SimplificationOptions.QualifyPropertyAccess)

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyPropertyAccess_NotSuggestedOnBase() As Task
Await TestMissingAsyncWithOption("
Class Base
Protected Property i As Integer
End Class
Class Derived
Inherits Base
Sub M()
[|i|] = 1
End Sub
End Class
",
SimplificationOptions.QualifyPropertyAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyPropertyAccess_NotSuggestedOnShared() As Task
Await TestMissingAsyncWithOption(
"Class C : Shared i As Integer : Sub M() : [|i|] = 1 : End Sub : End Class",
SimplificationOptions.QualifyPropertyAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_FunctionCallWithReturnType() As Task
Await TestAsyncWithOption(
"Class C : Function M() As Integer : Return [|M|]() : End Function : End Class",
Expand All @@ -120,7 +174,7 @@ SimplificationOptions.QualifyMethodAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_ChainedAccess() As Task
Await TestAsyncWithOption(
"Class C : Function M() As String : Return [|M|]().ToString() : End Function : End Class",
Expand All @@ -129,7 +183,7 @@ SimplificationOptions.QualifyMethodAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_ConditionalAccess() As Task
Await TestAsyncWithOption(
"Class C : Function M() As String : Return [|M|]()?.ToString() : End Function : End Class",
Expand All @@ -138,7 +192,7 @@ SimplificationOptions.QualifyMethodAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_EventSubscription1() As Task
Await TestAsyncWithOption("
Imports System
Expand All @@ -160,7 +214,7 @@ SimplificationOptions.QualifyMethodAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/7584"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_EventSubscription2() As Task
Await TestAsyncWithOption("
Imports System
Expand All @@ -183,6 +237,32 @@ SimplificationOptions.QualifyMethodAccess)

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_NotSuggestedOnBase() As Task
Await TestMissingAsyncWithOption("
Class Base
Protected Sub Method()
End Sub
End Class
Class Derived
Inherits Base
Sub M()
[|Method|]()
End Sub
End Class
",
SimplificationOptions.QualifyMethodAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyMethodAccess_NotSuggestedOnShared() As Task
Await TestMissingAsyncWithOption(
"Class C : Shared Sub Method() : End Sub : Sub M() : [|Method|]() : End Sub : End Class",
SimplificationOptions.QualifyMethodAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact(Skip:="https://github.com/dotnet/roslyn/issues/7587"), Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyEventAccess_AddHandler() As Task
Await TestAsyncWithOption("
Imports System
Expand All @@ -200,6 +280,37 @@ Class C
AddHandler Me.e, AddressOf Handler
End Function
End Class",
SimplificationOptions.QualifyEventAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyEventAccess_NotSuggestedOnBase() As Task
Await TestMissingAsyncWithOption("
Imports System
Class Base
Protected Event e As EventHandler
End Class
Class Derived
Inherits Base
Sub Handler(sender As Object, args As EventArgs)
AddHandler [|e|], AddressOf Handler
End Function
End Class",
SimplificationOptions.QualifyEventAccess)
End Function

<WorkItem(7065, "https://github.com/dotnet/roslyn/issues/7065")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsQualifyMemberAccess)>
Public Async Function QualifyEventAccess_NotSuggestedOnShared() As Task
Await TestMissingAsyncWithOption("
Imports System
Class C
Shared Event e As EventHandler
Sub Handler(sender As Object, args As EventArgs)
AddHandler [|e|], AddressOf Handler
End Function
End Class",
SimplificationOptions.QualifyEventAccess)
End Function

Expand Down
Loading

0 comments on commit eb954db

Please sign in to comment.