File: src\Analyzers\VisualBasic\Tests\RemoveUnusedMembers\RemoveUnusedMembersTests.vb
Web Access
Project: src\src\CodeStyle\VisualBasic\Tests\Microsoft.CodeAnalysis.VisualBasic.CodeStyle.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.CodeStyle.UnitTests)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics
Imports Microsoft.CodeAnalysis.VisualBasic.RemoveUnusedMembers
 
Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.RemoveUnusedMembers
    <Trait(Traits.Feature, Traits.Features.CodeActionsRemoveUnusedMembers)>
    Public Class RemoveUnusedMembersTests
        Inherits AbstractVisualBasicDiagnosticProviderBasedUserDiagnosticTest_NoEditor
 
        Friend Overrides Function CreateDiagnosticProviderAndFixer(workspace As Workspace) As (DiagnosticAnalyzer, CodeFixProvider)
            Return (New VisualBasicRemoveUnusedMembersDiagnosticAnalyzer(), New VisualBasicRemoveUnusedMembersCodeFixProvider())
        End Function
 
        ' Ensure that we explicitly test missing IDE0052, which has no corresponding code fix (non-fixable diagnostic).
        Private Overloads Function TestDiagnosticMissingAsync(initialMarkup As String) As Task
            Return TestDiagnosticMissingAsync(initialMarkup, New TestParameters(retainNonFixableDiagnostics:=True))
        End Function
 
        Private Shared Function Diagnostic(id As String) As DiagnosticDescription
            Return TestHelpers.Diagnostic(id)
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateField(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} [|_goo|] As Integer
End Class")
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateFieldWithConstantInitializer(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} [|_goo|] As Integer = 0
End Class")
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateFieldWithNonConstantInitializer(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} [|_goo|] As Integer = _goo2
    Private Shared ReadOnly _goo2 As Integer = 0
End Class")
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateMethod(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} Sub [|M|]
    End Sub
End Class")
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateProperty(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} Property [|P|] As Integer
End Class")
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateIndexer(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
End Class")
        End Function
 
        <Theory>
        <InlineData("Public")>
        <InlineData("Friend")>
        <InlineData("Protected")>
        <InlineData("Protected Friend")>
        Public Async Function NonPrivateEvent(accessibility As String) As Task
            Await TestDiagnosticMissingAsync(
$"Class C
    {accessibility} Event [|E|] As EventHandler
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private [|_goo|] As Integer
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Sub [|M()|]
    End Sub
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function GenericMethodIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Sub [|M|](Of T)()
    End Sub
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodInGenericTypeIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C(Of T)
    Private Sub [|M|]()
    End Sub
End Class",
"Class C(Of T)
End Class")
        End Function
 
        <Fact>
        Public Async Function InstanceConstructorIsUnused_NoArguments() As Task
            ' We only flag constructors with arguments.
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|New()|]
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function InstanceConstructorIsUnused_WithArguments() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Sub [|New(i As Integer)|]
    End Sub
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function StaticConstructorIsNotFlagged() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Shared Sub [|New()|]
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function PropertyIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Property [|P|] As Integer
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function IndexerIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Event [|E|] As System.EventHandler
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnused_ReadOnly() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private ReadOnly [|_goo|] As Integer
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function PropertyIsUnused_ReadOnly() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private ReadOnly Property [|P|] As Integer
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsUnused_ReadOnly() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private ReadOnly Event [|E|] As System.EventHandler
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnused_Shared() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Shared [|_goo|] As Integer
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodIsUnused_Shared() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Shared Sub [|M()|]
    End Sub
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function PropertyIsUnused_Shared() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Shared Property [|P|] As Integer
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function IndexerIsUnused_Shared() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Shared Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsUnused_Shared() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Shared Event [|E|] As System.EventHandler
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsUnused_Custom() As Task
            Await TestInRegularAndScriptAsync(
"Imports System
 
Class C
    Private Custom Event [|E|] As EventHandler
        AddHandler(value As EventHandler)
        End AddHandler
        RemoveHandler(value As EventHandler)
        End RemoveHandler
        RaiseEvent(sender As Object, e As EventArgs)
        End RaiseEvent
    End Event
End Class",
"Imports System
 
Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnused_Const() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Const [|_goo|] As Integer = 0
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Function M() As Integer
        Return _goo
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_Lambda() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Function M() As Integer
        Dim getGoo As Func(Of Integer) = Function() _goo
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_Accessor() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Property P As Integer
        Get
            Return _goo
        End Get
    End Property
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_DifferentInstance() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Function M() As Integer
        Return New C()._goo
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_ObjectInitializer() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Function M() As C2
        Return New C2() With {.F = _goo}
    End Function
End Class
 
Class C2
    Public F As Integer
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_ObjectInitializer_02() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Dim _goo2 As Integer
    Public Function M() As C
        Return New C() With {._goo = 0, ._goo2 = ._goo}
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_MeInstance() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Function M() As Integer
        Return Me._goo}
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_Attribute() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Const [|_goo|] As String = """"
 
    <System.Obsolete(_goo)>
    Public Sub M()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodIsInvoked() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M|]()
    End Sub
 
    Private Sub M2()
        M()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodIsAddressTaken() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M|]()
    End Sub
 
    Private Sub M2()
        Dim x As System.Action = AddressOf M
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function GenericMethodIsInvoked_ExplicitTypeArguments() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M1|](Of T)()
    End Sub
 
    Private Sub M2()
        M1(Of Integer)()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function GenericMethodIsInvoked_ImplicitTypeArguments() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M1|](Of T)(t1 As T)
    End Sub
 
    Private Sub M2()
        M1(0)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodInGenericTypeIsInvoked_NoTypeArguments() As Task
            Await TestDiagnosticMissingAsync(
"Class C(Of T)
    Private Sub [|M1|]()
    End Sub
 
    Private Sub M2()
        M1()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodInGenericTypeIsInvoked_NonConstructedType() As Task
            Await TestDiagnosticMissingAsync(
"Class C(Of T)
    Private Sub [|M1|]()
    End Sub
 
    Private Sub M2(m As C(Of T))
        m.M1()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodInGenericTypeIsInvoked_ConstructedType() As Task
            Await TestDiagnosticMissingAsync(
"Class C(Of T)
    Private Sub [|M1|]()
    End Sub
 
    Private Sub M2(m As C(Of Integer))
        m.M1()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function InstanceConstructorIsUsed_NoArguments() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|New|]()
    End Sub
 
    Public Shared ReadOnly Instance As C = New C()
End Class")
        End Function
 
        <Fact>
        Public Async Function InstanceConstructorIsUsed_NoArguments_AsNew() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|New|]()
    End Sub
 
    Public Shared ReadOnly Instance As New C()
End Class")
        End Function
 
        <Fact>
        Public Async Function InstanceConstructorIsUsed_WithArguments() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|New|](i As Integer)
    End Sub
 
    Public Shared ReadOnly Instance As C = New C(0)
End Class")
        End Function
 
        <Fact>
        Public Async Function InstanceConstructorIsUsed_WithArguments_AsNew() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|New|](i As Integer)
    End Sub
 
    Public Shared ReadOnly Instance As New C(0)
End Class")
        End Function
 
        <Fact>
        Public Async Function PropertyIsRead() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private ReadOnly Property [|P|] As Integer
    Public Function M() As Integer
        Return P
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function IndexerIsRead() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Shared Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
 
    Public Function M(x As Integer) As Integer
        Return P(x)
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsRead() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Event [|E|] As System.EventHandler
 
    Public Function M() As System.EventHandler
        Return E
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsSubscribed() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Event [|E|] As System.EventHandler
 
    Public Function M(e2 As System.EventHandler) As System.EventHandler
        AddHandler E, e2
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsRaised() As Task
            Await TestDiagnosticMissingAsync(
"Imports System
 
Class C
    Private Event [|_eventHandler|] As System.EventHandler
 
    Public Sub RaiseAnEvent(args As EventArgs)
        RaiseEvent _eventHandler(Me, args)
    End Sub
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/32488")>
        Public Async Function FieldInNameOf() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] As Integer
    Private _goo2 As String = NameOf(_goo)
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/31581")>
        Public Async Function MethodInNameOf() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M|]()
    End Sub
    Private _goo2 As String = NameOf(M)
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/31581")>
        Public Async Function PropertyInNameOf() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private ReadOnly Property [|P|] As Integer
    Private _goo2 As String = NameOf(P)
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldInDocComment() As Task
            Await TestDiagnosticsAsync(
"
''' <summary>
''' <see cref=""C._goo""/>
''' </summary>
Class C
    Private Shared [|_goo|] As Integer
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldInDocComment_02() As Task
            Await TestDiagnosticsAsync(
"
Class C
    ''' <summary>
    ''' <see cref=""_goo""/>
    ''' </summary>
    Private Shared [|_goo|] As Integer
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldInDocComment_03() As Task
            Await TestDiagnosticsAsync(
"
Class C
    ''' <summary>
    ''' <see cref=""_goo""/>
    ''' </summary>
    Public Sub M()
    End Sub
 
    Private Shared [|_goo|] As Integer
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsOnlyWritten() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private [|_goo|] As Integer
    Public Sub M()
        _goo = 0
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function PropertyIsOnlyWritten() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private Property [|P|] As Integer
    Public Sub M()
        P = 0
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function IndexerIsOnlyWritten() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private Property [|P|](x As Integer) As Integer
        Get
            Return 0
        End Get
        Set
        End Set
    End Property
    Public Sub M(x As Integer)
        P(x) = 0
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function EventIsOnlyWritten() As Task
            Await TestDiagnosticsAsync(
"Imports System
 
Class C
    Private Custom Event [|E|] As EventHandler
        AddHandler(value As EventHandler)
        End AddHandler
        RemoveHandler(value As EventHandler)
        End RemoveHandler
        RaiseEvent(sender As Object, e As EventArgs)
        End RaiseEvent
    End Event
    Public Sub M()
        ' BC32022: 'Private Event E As EventHandler' is an event, and cannot be called directly. Use a 'RaiseEvent' statement to raise an event.
        E = Nothing
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsOnlyInitialized_NonConstant() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private [|_goo|] As Integer = M()
    Public Shared Function M() As Integer
        Return 0
    End Function
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsOnlyInitialized_NonConstant_02() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private [|_goo|] = 0 ' Implicit conversion to Object type in the initializer, hence it is a non constant initializer.
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsOnlyWritten_ObjectInitializer() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private [|_goo|] As Integer
    Public Sub M()
        Dim x = New C() With { ._goo = 0 }
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsOnlyWritten_InProperty() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private [|_goo|] As Integer
    Public Property P As Integer
        Get 
            Return 0
        End Get
        Set
            _goo = value
        End Set
    End Property
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsReadAndWritten() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Sub M()
        _goo = 0
        System.Console.WriteLine(_goo)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function PropertyIsReadAndWritten() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private ReadOnly Property [|P|] As Integer
    Public Sub M()
        P = 0
        System.Console.WriteLine(P)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function IndexerIsReadAndWritten() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
 
    Public Function M(x As Integer) As Integer
        P(x) = 0
        System.Console.WriteLine(P(x))
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsTargetOfCompoundAssignment() As Task
            Await TestDiagnosticsAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Sub M()
        _goo += 1
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function PropertyIsTargetOfCompoundAssignment() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private ReadOnly Property [|P|] As Integer
    Public Sub M()
        P += 1
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function IndexerIsTargetOfCompoundAssignment() As Task
            Await TestDiagnosticsAsync(
"Class C
    Private Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
 
    Public Sub M(x As Integer)
        P(x) += 1
    End Sub
End Class", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsArg() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Sub M1()
        M2(_goo)
    End Sub
    Public Sub M2(x As Integer)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsByRefArg() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Dim [|_goo|] As Integer
    Public Sub M1()
        M2(_goo)
    End Sub
    Public Sub M2(ByRef x As Integer)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodIsArg() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M()|]
    End Sub
 
    Public Sub M1()
        M2(AddressOf M)
    End Sub
    Public Sub M2(x As System.Action)
    End Sub
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/30895")>
        Public Async Function MethodWithHandlesClause() As Task
            Await TestDiagnosticMissingAsync(
"Public Interface I
    Event M()
End Interface
 
Public Class C
    Private WithEvents _field1 As I
 
    Private Sub [|M|]() Handles _field1.M
    End Sub
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/30895")>
        Public Async Function FieldReferencedInHandlesClause() As Task
            Await TestDiagnosticMissingAsync(
"Public Interface I
    Event M()
End Interface
 
Public Class C
    Private WithEvents [|_field1|] As I
 
    Private Sub M() Handles _field1.M
    End Sub
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/30895")>
        Public Async Function FieldReferencedInHandlesClause_02() As Task
            Await TestDiagnosticMissingAsync(
"Public Interface I
    Event M()
End Interface
 
Public Class C
    Private WithEvents _field1 As I
    Private WithEvents [|_field2|] As I
 
    Private Sub M() Handles _field1.M, _field2.M
    End Sub
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/30895")>
        Public Async Function EventReferencedInHandlesClause() As Task
            Await TestDiagnosticMissingAsync(
"Public Class B
    Private Event [|M|]()
 
    Public Class C
        Private WithEvents _field1 As B
 
        Private Sub M() Handles _field1.M
        End Sub
    End Class
End Class")
        End Function
 
        <Fact>
        Public Async Function PropertyIsArg() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private ReadOnly Property [|P|] As Integer
    Public Sub M1()
        M2(P)
    End Sub
    Public Sub M2(x As Integer)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function IndexerIsArg() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Property [|P|](i As Integer) As Integer
        Get
            Return 0
        End Get
        Set(value As Integer)
        End Set
    End Property
 
    Public Sub M1(x As Integer)
        M2(P(x))
    End Sub
    Public Sub M2(x As Integer)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function EventIsArg() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Event [|_goo|] As System.EventHandler
    Public Sub M1()
        M2(_goo)
    End Sub
    Public Sub M2(x As System.EventHandler)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function MultipleFields_AllUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private [|_goo|], _goo2 As Integer, _goo3 = """", _goo4 As String
End Class",
"Class C
    Private _goo2 As Integer, _goo3 = """", _goo4 As String
End Class")
        End Function
 
        <Fact>
        Public Async Function MultipleFields_AllUnused_02() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private _goo, _goo2 As Integer, [|_goo3|] As Integer = 0, _goo4 As String
End Class",
"Class C
    Private _goo, _goo2 As Integer, _goo4 As String
End Class")
        End Function
 
        <Fact>
        Public Async Function MultipleFields_SomeUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private [|_goo|] As Integer = 0, _goo2 As Integer = 0
    Public Function M() As Integer
        Return _goo2
    End Function
End Class",
"Class C
    Private _goo2 As Integer = 0
    Public Function M() As Integer
        Return _goo2
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function MultipleFields_SomeUnused_02() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] = 0, _goo2 = 0
    Public Function M() As Integer
        Return _goo
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_InNestedType() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] As Integer
    Private Class Nested
        Public Function M() As Integer
            Return _goo
        End Function
    End Class
End Class")
        End Function
 
        <Fact>
        Public Async Function MethodIsInvoked_InNestedType() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Sub [|M1|]()
    End Sub
 
    Private Class Nested
        Public Sub M2()
            M1()
        End Sub
    End Class
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldOfNestedTypeIsUnused() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Class Nested
        Private [|_goo|] As Integer
    End Class
End Class",
"Class C
    Private Class Nested
    End Class
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldOfNestedTypeIsRead() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private Class Nested
        Private [|_goo|] As Integer
        Public Function M() As Integer
            Return _goo
        End Function
    End Class
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnused_PartialClass() As Task
            Await TestInRegularAndScriptAsync(
"Partial Class C
    Private [|_goo|] As Integer
End Class",
"Partial Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_PartialClass() As Task
            Await TestDiagnosticMissingAsync(
"Partial Class C
    Private [|_goo|] As Integer
End Class
 
Partial Class C
    Public Function M() As Integer
        Return _goo
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_PartialClass_DifferentFile() As Task
            Await TestDiagnosticMissingAsync(
"<Workspace>
    <Project Language=""Visual Basic"" AssemblyName=""Assembly1"" CommonReferences=""true"">
        <Document>
Partial Class C
    Private [|_goo|] As Integer
End Class
        </Document>
        <Document>
Partial Class C
    Public Function M() As Integer
        Return _goo
    End Function
End Class
        </Document>
    </Project>
</Workspace>")
        End Function
 
        <Fact>
        Public Async Function FieldIsOnlyWritten_PartialClass_DifferentFile() As Task
            Await TestDiagnosticsAsync(
"<Workspace>
    <Project Language=""Visual Basic"" AssemblyName=""Assembly1"" CommonReferences=""true"">
        <Document>
Partial Class C
    Private [|_goo|] As Integer
End Class
        </Document>
        <Document>
Partial Class C
    Public Sub M()
        _goo = 0
    End Sub
End Class
        </Document>
    </Project>
</Workspace>", parameters:=Nothing,
    Diagnostic("IDE0052"))
        End Function
 
        <Fact>
        Public Async Function FieldIsRead_InParens() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] As Integer
    Public Function M() As Integer
        Return (_goo)
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsWritten_InParens() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] As Integer
    Public Sub M()
        ' Below is a syntax error, _goo is parsed as skipped trivia
        (_goo) = 0
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnusedInType_SyntaxError() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] As Integer
    Public Sub M()
        Return =
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnusedInType_SemanticError() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|_goo|] As Integer
    Public Sub M()
        ' _goo2 is undefined
        Return _goo2
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnusedInType_SemanticErrorInDifferentType() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private [|_goo|] As Integer
End Class
 
Class C2
    Public Sub M()
        ' _goo2 is undefined
        Return _goo2
    End Sub
End Class",
"Class C
End Class
 
Class C2
    Public Sub M()
        ' _goo2 is undefined
        Return _goo2
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldInTypeWithGeneratedCode() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private [|i|] As Integer
 
    <System.CodeDom.Compiler.GeneratedCodeAttribute("""", """")>
    Private j As Integer
 
    Public Sub M()
    End Sub
End Class",
"Class C
    <System.CodeDom.Compiler.GeneratedCodeAttribute("""", """")>
    Private j As Integer
 
    Public Sub M()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldIsGeneratedCode() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    <System.CodeDom.Compiler.GeneratedCodeAttribute("""", """")>
    Private [|i|] As Integer
 
    Public Sub M()
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FieldUsedInGeneratedCode() As Task
            Await TestDiagnosticMissingAsync(
"Class C
    Private [|i|] As Integer
 
    <System.CodeDom.Compiler.GeneratedCodeAttribute("""", """")>
    Public Function M() As Integer
        Return i
    End Function
End Class")
        End Function
 
        <Fact>
        Public Async Function FixAllFields_Document() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private {|FixAllInDocument:_goo|}, _goo2 As Integer, _goo3 As Integer = 0, _goo4, _goo5 As Char
    Private _goo6, _goo7 As Integer, _goo8 As Integer = 0
    Private _goo9, _goo10 As New String("""") ' Non constant initializer
    Private _goo11 = 0  ' Implicit conversion to Object type in the initializer, hence it is a non constant initializer.
 
    Public Sub M()
        Dim x = _goo4
    End Sub
End Class",
"Class C
    Private _goo4 As Char
    Private _goo9, _goo10 As New String("""") ' Non constant initializer
    Private _goo11 = 0  ' Implicit conversion to Object type in the initializer, hence it is a non constant initializer.
 
    Public Sub M()
        Dim x = _goo4
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FixAllMethods_Document() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Sub {|FixAllInDocument:M()|}
    End Sub
 
    Private Sub M2()
    End Sub
 
    Private Shared Sub M3()
    End Sub
 
    Private Class NestedClass
        Private Sub M4()
        End Sub
    End Class
End Class",
"Class C
    Private Class NestedClass
    End Class
End Class")
        End Function
 
        <Fact>
        Public Async Function FixAllProperties_Document() As Task
            Await TestInRegularAndScriptAsync(
"Class C
    Private Property {|FixAllInDocument:P|} As Integer
 
    Private ReadOnly Property P2 As Integer
 
    Private Property P3 As Integer
        Get
            Return 0
        End Get
        Set
        End Set
    End Property
 
    Private Property P4(x As Integer) As Integer
        Get
            Return 0
        End Get
        Set
        End Set
    End Property
End Class",
"Class C
End Class")
        End Function
 
        <Fact>
        Public Async Function FixAllEvents_Document() As Task
            Await TestInRegularAndScriptAsync(
"Imports System
 
Class C
    Private Event {|FixAllInDocument:E1|} As EventHandler
    Private Event E2 As EventHandler
    Private Shared Event E3 As EventHandler
 
    Private Custom Event E4 As EventHandler
        AddHandler(value As EventHandler)
        End AddHandler
        RemoveHandler(value As EventHandler)
        End RemoveHandler
        RaiseEvent(sender As Object, e As EventArgs)
        End RaiseEvent
    End Event
 
    Public Sub M()
        Dim x1 = E2
    End Sub
End Class",
"Imports System
 
Class C
    Private Event E2 As EventHandler
 
    Public Sub M()
        Dim x1 = E2
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function FixAllMembers_Project() As Task
            Await TestInRegularAndScriptAsync(
"<Workspace>
    <Project Language=""Visual Basic"" AssemblyName=""Assembly1"" CommonReferences=""true"">
        <Document>
Partial Class C
    Private {|FixAllInProject:_goo|} As Integer, _goo2 = 0, _goo3 As Integer
    Private Sub M1()
    End Sub
    Private Property P1 As Integer
    Private Property P2(x As Integer) As Integer
        Get
            Return 0
        End Get
        Set
        End Set
    End Property
    Private Event E1 As System.EventHandler
End Class
 
Class C2
    Private Sub M2()
    End Sub
End Class
        </Document>
        <Document>
Partial Class C
    Private Sub M3()
    End Sub
    Public Function M4() As Integer
        Return _goo2
    End Function
End Class
 
Shared Class C3
    Private Shared Sub M5()
    End Sub
End Class
        </Document>
    </Project>
</Workspace>",
"<Workspace>
    <Project Language=""Visual Basic"" AssemblyName=""Assembly1"" CommonReferences=""true"">
        <Document>
Partial Class C
    Private _goo2 = 0
End Class
 
Class C2
End Class
        </Document>
        <Document>
Partial Class C
    Public Function M4() As Integer
        Return _goo2
    End Function
End Class
 
Shared Class C3
End Class
        </Document>
    </Project>
</Workspace>")
        End Function
 
        <Fact>
        Public Async Function FieldIsUnused_Module() As Task
            Await TestInRegularAndScriptAsync(
"Module C
    Private [|_goo|] As Integer
End Module",
"Module C
End Module")
        End Function
 
        <Fact>
        Public Async Function RedimStatement_NoPreserve() As Task
            Await TestMissingInRegularAndScriptAsync(
"Public Class C
    Private [|intArray|](10, 10, 10) As Integer
 
    Public Sub M()
        ReDim intArray(10, 10, 20)
    End Sub
End Class")
        End Function
 
        <Fact>
        Public Async Function RedimStatement_Preserve() As Task
            Await TestMissingInRegularAndScriptAsync(
"Public Class C
    Private [|intArray|](10, 10, 10) As Integer
 
    Public Sub M()
        ReDim Preserve intArray(10, 10, 20)
    End Sub
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/37213")>
        Public Async Function UsedPrivateExtensionMethod() As Task
            Await TestMissingInRegularAndScriptAsync(
"Imports System.Runtime.CompilerServices
 
Public Module B
    <Extension()>
    Sub PublicExtensionMethod(s As String)
        s.PrivateExtensionMethod()
    End Sub
 
    <Extension()>
    Private Sub [|PrivateExtensionMethod|](s As String)
    End Sub
End Module")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/33142")>
        Public Async Function XmlLiteral_NoDiagnostic() As Task
            Await TestMissingInRegularAndScriptAsync(
"Public Class C
    Public Sub Foo()
        Dim xml = <tag><%= Me.M() %></tag>
    End Sub
 
    Private Function [|M|]() As Integer
        Return 42
    End Function
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/33142")>
        Public Async Function Attribute_Diagnostic() As Task
            Await TestInRegularAndScriptAsync(
"Public Class C
    <MyAttribute>
    Private Function [|M|]() As Integer
        Return 42
    End Function
End Class
 
Public Class MyAttribute
    Inherits System.Attribute
End Class",
"Public Class C
End Class
 
Public Class MyAttribute
    Inherits System.Attribute
End Class")
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/30884")>
        Public Async Function TestMessageForSubNew() As Task
            Await TestDiagnosticInfoAsync(
"Class C
    Private Sub [|New|](i As Integer)
    End Sub
End Class",
parseOptions:=Nothing,
compilationOptions:=Nothing,
options:=Nothing,
"IDE0051",
DiagnosticSeverity.Info,
diagnosticMessage:=String.Format(AnalyzersResources.Private_member_0_is_unused, "C.New"))
        End Function
    End Class
End Namespace