File: Semantics\NameOfTests.vb
Web Access
Project: src\src\Compilers\VisualBasic\Test\Semantic\Microsoft.CodeAnalysis.VisualBasic.Semantic.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.Semantic.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 System.Collections.Immutable
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.SpecialType
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests.Emit
Imports Roslyn.Test.Utilities
Imports Basic.Reference.Assemblies
 
Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.Semantics
 
    Public Class NameOfTests
        Inherits BasicTestBase
 
        <Fact>
        Public Sub TestParsing_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(Integer.MaxValue)
        Dim y = NameOf(Integer)
        Dim z = NameOf(Variant)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37244: This expression does not have a name.
        Dim y = NameOf(Integer)
                       ~~~~~~~
BC30804: 'Variant' is no longer a supported type; use the 'Object' type instead.
        Dim z = NameOf(Variant)
                       ~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim nodes = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().ToArray()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            If True Then
                Dim node1 = nodes(0)
                Assert.Equal("NameOf(Integer.MaxValue)", node1.ToString())
                Assert.Equal("MaxValue", model.GetConstantValue(node1).Value)
 
                typeInfo = model.GetTypeInfo(node1)
                Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
                symbolInfo = model.GetSymbolInfo(node1)
                Assert.Null(symbolInfo.Symbol)
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
                group = model.GetMemberGroup(node1)
                Assert.True(group.IsEmpty)
 
                Dim argument = node1.Argument
 
                typeInfo = model.GetTypeInfo(argument)
                Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
                symbolInfo = model.GetSymbolInfo(argument)
                Assert.Equal("System.Int32.MaxValue As System.Int32", symbolInfo.Symbol.ToTestDisplayString())
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
                group = model.GetMemberGroup(argument)
                Assert.True(group.IsEmpty)
 
                Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
                typeInfo = model.GetTypeInfo(receiver)
                Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
                symbolInfo = model.GetSymbolInfo(receiver)
                Assert.Equal("System.Int32", symbolInfo.Symbol.ToTestDisplayString())
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            End If
 
            If True Then
                Dim node2 = nodes(1)
                Assert.Equal("NameOf(Integer)", node2.ToString())
                Assert.Null(model.GetConstantValue(node2).Value)
 
                typeInfo = model.GetTypeInfo(node2)
                Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
                symbolInfo = model.GetSymbolInfo(node2)
                Assert.Null(symbolInfo.Symbol)
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
                group = model.GetMemberGroup(node2)
                Assert.True(group.IsEmpty)
 
                Dim argument = node2.Argument
 
                typeInfo = model.GetTypeInfo(argument)
                Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
                symbolInfo = model.GetSymbolInfo(argument)
                Assert.Equal("System.Int32", symbolInfo.Symbol.ToTestDisplayString())
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
                group = model.GetMemberGroup(argument)
                Assert.True(group.IsEmpty)
            End If
 
            If True Then
                Dim node3 = nodes(2)
                Assert.Equal("NameOf(Variant)", node3.ToString())
                Assert.Equal("Variant", model.GetConstantValue(node3).Value)
 
                typeInfo = model.GetTypeInfo(node3)
                Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
                symbolInfo = model.GetSymbolInfo(node3)
                Assert.Null(symbolInfo.Symbol)
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
                group = model.GetMemberGroup(node3)
                Assert.True(group.IsEmpty)
 
                Dim argument = node3.Argument
 
                typeInfo = model.GetTypeInfo(argument)
                Assert.Equal(SymbolKind.ErrorType, typeInfo.Type.Kind)
 
                symbolInfo = model.GetSymbolInfo(argument)
                Assert.Null(symbolInfo.Symbol)
                Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
                group = model.GetMemberGroup(argument)
                Assert.True(group.IsEmpty)
            End If
        End Sub
 
        <Fact>
        Public Sub TestParsing_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of ))
        Dim y = NameOf(C2(Of ).C3(Of Integer))
        Dim z = NameOf(C2(Of Integer).C3(Of Integer))
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
 
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30182: Type expected.
        Dim x = NameOf(C2(Of Integer).C3(Of ))
                                            ~
BC30182: Type expected.
        Dim y = NameOf(C2(Of ).C3(Of Integer))
                             ~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of ).M1)
        Dim y = NameOf(C2(Of ).C3(Of Integer).M1)
        Dim z = NameOf(C2(Of Integer).C3(Of Integer).M1)
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
        Sub M1()
        End Sub
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30182: Type expected.
        Dim x = NameOf(C2(Of Integer).C3(Of ).M1)
                                            ~
BC30182: Type expected.
        Dim y = NameOf(C2(Of ).C3(Of Integer).M1)
                             ~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(Global)
        Dim y = NameOf(Global.System)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC36000: 'Global' must be followed by '.' and an identifier.
        Dim x = NameOf(Global)
                       ~~~~~~
BC37244: This expression does not have a name.
        Dim x = NameOf(Global)
                       ~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_05()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
    End Sub
End Module
 
Class CTest
    Sub Test1()
        Dim x = NameOf(MyClass)
        Dim y = NameOf(MyClass.Test1)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC32028: 'MyClass' must be followed by '.' and an identifier.
        Dim x = NameOf(MyClass)
                       ~~~~~~~
BC37244: This expression does not have a name.
        Dim x = NameOf(MyClass)
                       ~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_06()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
    End Sub
End Module
 
Class CTest
    Sub Test1()
        Dim x = NameOf(MyBase)
        Dim y = NameOf(MyBase.GetHashCode)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC32027: 'MyBase' must be followed by '.' and an identifier.
        Dim x = NameOf(MyBase)
                       ~~~~~~
BC37244: This expression does not have a name.
        Dim x = NameOf(MyBase)
                       ~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_07()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
    End Sub
End Module
 
Class CTest
    Sub Test1()
        Dim x = NameOf(Me)
        Dim y = NameOf(Me.GetHashCode)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37244: This expression does not have a name.
        Dim x = NameOf(Me)
                       ~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_08()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(Integer?)
        Dim y = NameOf(Integer?.GetValueOrDefault)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37244: This expression does not have a name.
        Dim x = NameOf(Integer?)
                       ~~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_09()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As Integer? = Nothing
        Dim y = NameOf(x.GetValueOrDefault)
        Dim z = NameOf((x).GetValueOrDefault)
        Dim u = NameOf(New Integer?().GetValueOrDefault)
        Dim v = NameOf(GetVal().GetValueOrDefault)
        Dim w = NameOf(GetVal.GetValueOrDefault)
    End Sub
 
    Function GetVal() As Integer?
        Return Nothing
    End Function
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37245: This sub-expression cannot be used inside NameOf argument.
        Dim z = NameOf((x).GetValueOrDefault)
                       ~~~
BC37245: This sub-expression cannot be used inside NameOf argument.
        Dim u = NameOf(New Integer?().GetValueOrDefault)
                       ~~~~~~~~~~~~~~
BC37245: This sub-expression cannot be used inside NameOf argument.
        Dim v = NameOf(GetVal().GetValueOrDefault)
                       ~~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub TestParsing_10()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As Integer? = Nothing
        NameOf(x.GetValueOrDefault)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30035: Syntax error.
        NameOf(x.GetValueOrDefault)
        ~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub Namespace_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(Global.System))
        System.Console.WriteLine(NameOf(Global.system))
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
System
system
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(Global.System)", node1.ToString())
            Assert.Equal("System", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("System", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("Global", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub Method_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2(Of Integer).C3(Of Short).M1))
        System.Console.WriteLine(NameOf(C2(Of Integer).C3(Of Short).m1))
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
        Sub M1()
        End Sub
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
m1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short).M1)", node1.ToString())
            Assert.Equal("M1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Sub C2(Of System.Int32).C3(Of System.Int16).M1()", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(1, group.Length)
            Assert.Equal("Sub C2(Of System.Int32).C3(Of System.Int16).M1()", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            receiver = DirectCast(receiver, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub Method_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C1.M1))
        System.Console.WriteLine(NameOf(C1.m1))
    End Sub
End Module
 
Class C1
    Sub M1(Of T)()
    End Sub
 
    Sub M1(x as Integer)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
m1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C1.M1)", node1.ToString())
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal(2, symbolInfo.CandidateSymbols.Length)
            Assert.Equal("Sub C1.M1(Of T)()", symbolInfo.CandidateSymbols(0).ToTestDisplayString())
            Assert.Equal("Sub C1.M1(x As System.Int32)", symbolInfo.CandidateSymbols(1).ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(2, group.Length)
            Assert.Equal("Sub C1.M1(Of T)()", group(0).ToTestDisplayString())
            Assert.Equal("Sub C1.M1(x As System.Int32)", group(1).ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub Method_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C1.M1))
    End Sub
End Module
 
Class C1
    Sub M1(Of T)()
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C1.M1)", node1.ToString())
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Sub C1.M1(Of T)()", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Sub C1.M1(Of T)()", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub Method_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C1.M1(Of Integer)))
    End Sub
End Module
 
Class C1
    Sub M1(Of T)()
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37246: Method type arguments unexpected.
        System.Console.WriteLine(NameOf(C1.M1(Of Integer)))
                                             ~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C1.M1(Of Integer))", node1.ToString())
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Sub C1.M1(Of System.Int32)()", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Sub C1.M1(Of System.Int32)()", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub Method_05()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C1.M1(Of Integer)))
    End Sub
End Module
 
Class C1
    Sub M1(Of T)()
    End Sub
 
    Sub M1(x as Integer)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37246: Method type arguments unexpected.
        System.Console.WriteLine(NameOf(C1.M1(Of Integer)))
                                             ~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C1.M1(Of Integer))", node1.ToString())
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Sub C1.M1(Of System.Int32)()", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Sub C1.M1(Of System.Int32)()", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub Method_06()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C1.M1(Of Integer)))
    End Sub
End Module
 
Class C1
    Sub M1(x as Integer)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC37246: Method type arguments unexpected.
        System.Console.WriteLine(NameOf(C1.M1(Of Integer)))
                                             ~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C1.M1(Of Integer))", node1.ToString())
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            Assert.Equal(0, symbolInfo.CandidateSymbols.Length)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub GenericType_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2(Of Integer).C3(Of Short)))
        System.Console.WriteLine(NameOf(C2(Of Integer).c3(Of Short)))
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
C3
c3
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short))", node1.ToString())
            Assert.Equal("C3", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub AmbiguousType_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2(Of Integer).CC3))
        System.Console.WriteLine(NameOf(C2(Of Integer).cc3))
    End Sub
End Module
 
Class C2(Of T)
    Class Cc3(Of S)
    End Class
 
    Class cC3(Of U, V)
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC32042: Too few type arguments to 'C2(Of Integer).Cc3(Of S)'.
        System.Console.WriteLine(NameOf(C2(Of Integer).CC3))
                                        ~~~~~~~~~~~~~~~~~~
BC32042: Too few type arguments to 'C2(Of Integer).Cc3(Of S)'.
        System.Console.WriteLine(NameOf(C2(Of Integer).cc3))
                                        ~~~~~~~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).CC3)", node1.ToString())
            Assert.Equal("CC3", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("C2(Of System.Int32).Cc3(Of S)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.WrongArity, symbolInfo.CandidateReason)
            Assert.Equal("C2(Of System.Int32).Cc3(Of S)", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub AmbiguousType_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.CC3))
        System.Console.WriteLine(NameOf(C2.cc3))
    End Sub
End Module
 
Class C1
    Class Cc3(Of S)
    End Class
End Class
 
Class C2
    Inherits C1
 
    Class cC3(Of U, V)
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC32042: Too few type arguments to 'C2.cC3(Of U, V)'.
        System.Console.WriteLine(NameOf(C2.CC3))
                                        ~~~~~~
BC32042: Too few type arguments to 'C2.cC3(Of U, V)'.
        System.Console.WriteLine(NameOf(C2.cc3))
                                        ~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InaccessibleNonGenericType_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.CC3))
    End Sub
End Module
 
Class C2
    protected Class Cc3
    End Class
 
    Class cC3(Of U, V)
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30389: 'C2.Cc3' is not accessible in this context because it is 'Protected'.
        System.Console.WriteLine(NameOf(C2.CC3))
                                        ~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.CC3)", node1.ToString())
            Assert.Equal("CC3", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("C2.Cc3", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason)
            Assert.Equal("C2.Cc3", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub Alias_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Imports [alias] = System
 
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf([alias]))
        System.Console.WriteLine(NameOf([ALIAS]))
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
alias
ALIAS
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf([alias])", node1.ToString())
            Assert.Equal("alias", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("System", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Assert.Equal("[alias]=System", model.GetAliasInfo(argument).ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub InaccessibleMethod_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of Short).M1)
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
        Protected Sub M1()
        End Sub
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30390: 'C3.Protected Sub M1()' is not accessible in this context because it is 'Protected'.
        Dim x = NameOf(C2(Of Integer).C3(Of Short).M1)
                                                   ~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short).M1)", node1.ToString())
            Assert.Equal("M1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason)
            Assert.Equal("Sub C2(Of System.Int32).C3(Of System.Int16).M1()", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(1, group.Length)
            Assert.Equal("Sub C2(Of System.Int32).C3(Of System.Int16).M1()", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            receiver = DirectCast(receiver, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InaccessibleProperty_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of Short).P1)
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
        Protected Property P1 As Integer
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30389: 'C2(Of Integer).C3(Of Short).P1' is not accessible in this context because it is 'Protected'.
        Dim x = NameOf(C2(Of Integer).C3(Of Short).P1)
                                                   ~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short).P1)", node1.ToString())
            Assert.Equal("P1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason)
            Assert.Equal("Property C2(Of System.Int32).C3(Of System.Int16).P1 As System.Int32", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(1, group.Length)
            Assert.Equal("Property C2(Of System.Int32).C3(Of System.Int16).P1 As System.Int32", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            receiver = DirectCast(receiver, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InaccessibleField_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of Short).F1)
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
        Protected F1 As Integer
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30389: 'C2(Of Integer).C3(Of Short).F1' is not accessible in this context because it is 'Protected'.
        Dim x = NameOf(C2(Of Integer).C3(Of Short).F1)
                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short).F1)", node1.ToString())
            Assert.Equal("F1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16).F1 As System.Int32", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            receiver = DirectCast(receiver, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InaccessibleEvent_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of Short).E1)
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
        Protected Event E1 As System.Action
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30389: 'C2(Of Integer).C3(Of Short).E1' is not accessible in this context because it is 'Protected'.
        Dim x = NameOf(C2(Of Integer).C3(Of Short).E1)
                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short).E1)", node1.ToString())
            Assert.Equal("E1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.Inaccessible, symbolInfo.CandidateReason)
            Assert.Equal("Event C2(Of System.Int32).C3(Of System.Int16).E1 As System.Action", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            receiver = DirectCast(receiver, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub Missing_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(C2(Of Integer).C3(Of Short).Missing)
    End Sub
End Module
 
Class C2(Of T)
    Class C3(Of S)
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30456: 'Missing' is not a member of 'C2(Of Integer).C3(Of Short)'.
        Dim x = NameOf(C2(Of Integer).C3(Of Short).Missing)
                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2(Of Integer).C3(Of Short).Missing)", node1.ToString())
            Assert.Equal("Missing", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal(SymbolKind.ErrorType, typeInfo.Type.Kind)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            Assert.Equal(0, symbolInfo.CandidateSymbols.Length)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32).C3(Of System.Int16)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            receiver = DirectCast(receiver, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2(Of System.Int32)", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub Missing_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(Missing.M1)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30451: 'Missing' is not declared. It may be inaccessible due to its protection level.
        Dim x = NameOf(Missing.M1)
                       ~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub Missing_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x = NameOf(Missing)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30451: 'Missing' is not declared. It may be inaccessible due to its protection level.
        Dim x = NameOf(Missing)
                       ~~~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub AmbiguousMethod_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(Ambiguous))
    End Sub
End Module
 
Module Module2
    Sub Ambiguous()
    End Sub
End Module
 
Module Module3
    Sub Ambiguous()
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30562: 'Ambiguous' is ambiguous between declarations in Modules 'Module2, Module3'.
        System.Console.WriteLine(NameOf(Ambiguous))
                                        ~~~~~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(Ambiguous)", node1.ToString())
            Assert.Equal("Ambiguous", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Void", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.Ambiguous, symbolInfo.CandidateReason)
            Assert.Equal(2, symbolInfo.CandidateSymbols.Length)
            Assert.Equal("Sub Module2.Ambiguous()", symbolInfo.CandidateSymbols(0).ToTestDisplayString())
            Assert.Equal("Sub Module3.Ambiguous()", symbolInfo.CandidateSymbols(1).ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub AmbiguousMethod_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(I3.Ambiguous))
    End Sub
End Module
 
Interface I1
    Sub Ambiguous()
End Interface
 
Interface I2
    Sub Ambiguous(x as Integer)
End Interface
 
Interface I3
    Inherits I1, I2
End Interface
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
Ambiguous
]]>)
        End Sub
 
        <Fact>
        Public Sub Local_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim local As Integer = 0
        System.Console.WriteLine(NameOf(LOCAL))
        System.Console.WriteLine(NameOf(loCal))
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
LOCAL
loCal
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(LOCAL)", node1.ToString())
            Assert.Equal("LOCAL", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("local As System.Int32", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Local_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(LOCAL))
        Dim local As Integer = 0
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef)
 
            AssertTheseDiagnostics(comp,
<expected>
BC32000: Local variable 'local' cannot be referred to before it is declared.
        System.Console.WriteLine(NameOf(LOCAL))
                                        ~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(LOCAL)", node1.ToString())
            Assert.Equal("LOCAL", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("local As System.Int32", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Local_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim local = NameOf(LOCAL)
        System.Console.WriteLine(local)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30980: Type of 'local' cannot be inferred from an expression containing 'local'.
        Dim local = NameOf(LOCAL)
                           ~~~~~
</expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(LOCAL)", node1.ToString())
            Assert.Equal("LOCAL", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal(SymbolKind.ErrorType, typeInfo.Type.Kind)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("local As System.String", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Local_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Option Explicit Off
 
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(LOCAL))
        local = 0
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
LOCAL
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(LOCAL)", node1.ToString())
            Assert.Equal("LOCAL", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Object", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("LOCAL As System.Object", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Local_05()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Option Explicit Off
 
Module Module1
    Sub Main()
        local = 3
        System.Console.WriteLine(NameOf(LOCAL))
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
LOCAL
]]>)
        End Sub
 
        <Fact>
        Public Sub Local_06()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Option Explicit Off
 
Module Module1
    Sub Main()
        local = NameOf(LOCAL)
        System.Console.WriteLine(local)
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
LOCAL
]]>)
        End Sub
 
        <Fact>
        Public Sub TypeParameterAsQualifier_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Option Explicit Off
 
Module Module1
    Sub Main()
        C3(Of C2).Test()
    End Sub
End Module
 
Class C2
    Sub M1()
    End Sub
End Class
 
Class C3(Of T As C2)
    Shared Sub Test()
        System.Console.WriteLine(NameOf(T.M1))
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC32098: Type parameters cannot be used as qualifiers.
        System.Console.WriteLine(NameOf(T.M1))
                                        ~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.F1))
    End Sub
End Module
 
Class C2
    Public F1 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
F1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.F1)", node1.ToString())
            Assert.Equal("F1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("C2.F1 As System.Int32", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            Assert.Equal(0, symbolInfo.CandidateSymbols.Length)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.F1.F2))
    End Sub
End Module
 
Class C2
    Public F1 As C3
End Class
 
Class C3
    Public F2 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30469: Reference to a non-shared member requires an object reference.
        System.Console.WriteLine(NameOf(C2.F1.F2))
                                        ~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.P1))
    End Sub
End Module
 
Class C2
    Public Property P1 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
P1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.P1)", node1.ToString())
            Assert.Equal("P1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Property C2.P1 As System.Int32", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Property C2.P1 As System.Int32", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.P1.P2))
    End Sub
End Module
 
Class C2
    Public Property P1 As C3
End Class
 
Class C3
    Public Property P2 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30469: Reference to a non-shared member requires an object reference.
        System.Console.WriteLine(NameOf(C2.P1.P2))
                                        ~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_05()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.M1))
    End Sub
End Module
 
Class C2
    Public Function M1() As Integer
        Return Nothing
    End Function
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.M1)", node1.ToString())
            Assert.Equal("M1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Function C2.M1() As System.Int32", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Function C2.M1() As System.Int32", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_06()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.M1.M2))
    End Sub
End Module
 
Class C2
    Public Function M1() As C3
        Return Nothing
    End Function
End Class
 
Class C3
    Public Sub M2()
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30469: Reference to a non-shared member requires an object reference.
        System.Console.WriteLine(NameOf(C2.M1.M2))
                                        ~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_07()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.M1))
    End Sub

    <System.Runtime.CompilerServices.Extension>
    Public Function M1(this As C2) As Integer
        Return Nothing
    End Function
End Module

Class C2
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(compilationDef, {Net40.References.SystemCore}, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.M1)", node1.ToString())
            Assert.Equal("M1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Function C2.M1() As System.Int32", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Function C2.M1() As System.Int32", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_08()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.M1.M2))
    End Sub

    <System.Runtime.CompilerServices.Extension>
    Public Function M1(this As C2) As C3
        Return Nothing
    End Function
End Module

Class C2
End Class

Class C3
    Public Sub M2()
    End Sub
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(compilationDef, {Net40.References.SystemCore}, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30469: Reference to a non-shared member requires an object reference.
        System.Console.WriteLine(NameOf(C2.M1.M2))
                                        ~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_09()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.E1))
    End Sub
End Module
 
Class C2
    Public Event E1 As System.Action
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
E1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.E1)", node1.ToString())
            Assert.Equal("E1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Action", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("Event C2.E1 As System.Action", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            Assert.Equal(0, symbolInfo.CandidateSymbols.Length)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("C2", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("C2", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub InstanceOfType_10()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.E1.Invoke))
    End Sub
End Module
 
Class C2
    Public Event E1 As System.Action
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC30469: Reference to a non-shared member requires an object reference.
        System.Console.WriteLine(NameOf(C2.E1.Invoke))
                                        ~~~~~
</expected>)
        End Sub
 
        <Fact>
        Public Sub SharedOfValue_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New C2()
        System.Console.WriteLine(NameOf(x.F1))
        System.Console.WriteLine(NameOf(x.F1.F2))
    End Sub
End Module
 
Class C2
    Shared Public F1 As C3
End Class
 
Class C3
    Shared Public F2 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.F1))
                                        ~~~~
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.F1.F2))
                                        ~~~~
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.F1.F2))
                                        ~~~~~~~
</expected>)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
F1
F2
]]>)
        End Sub
 
        <Fact>
        Public Sub SharedOfValue_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New C2()
        System.Console.WriteLine(NameOf(x.P1))
        System.Console.WriteLine(NameOf(x.P1.P2))
    End Sub
End Module
 
Class C2
    Shared Public Property P1 As C3
End Class
 
Class C3
    Shared Public Property P2 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.P1.P2))
                                        ~~~~
</expected>)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
P1
P2
]]>)
        End Sub
 
        <Fact>
        Public Sub SharedOfValue_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New C2()
        System.Console.WriteLine(NameOf(x.M1))
        System.Console.WriteLine(NameOf(x.M1.M2))
    End Sub
End Module
 
Class C2
    Shared Public Function M1() As C3
        Return Nothing
    End Function
End Class
 
Class C3
    Shared Public Sub M2()
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.M1.M2))
                                        ~~~~
</expected>)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
M2
]]>)
        End Sub
 
        <Fact>
        Public Sub SharedOfValue_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New C2()
        System.Console.WriteLine(NameOf(x.E1))
    End Sub
End Module
 
Class C2
    Shared Public Event E1 As System.Action
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertNoDiagnostics(comp)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
E1
]]>)
        End Sub
 
        <Fact>
        Public Sub SharedOfValue_05()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As New C2()
        System.Console.WriteLine(NameOf(x.T1))
        System.Console.WriteLine(NameOf(x.P1.T2))
        System.Console.WriteLine(NameOf(x.P1))
    End Sub
End Module
 
Class C2
    Shared Public Property P1 As C3
 
    Public Class T1
    End Class
End Class
 
Class C3
    Public Class T2
    End Class
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected>
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.T1))
                                        ~~~~
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.P1.T2))
                                        ~~~~
BC42025: Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.
        System.Console.WriteLine(NameOf(x.P1.T2))
                                        ~~~~~~~
</expected>)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
T1
T2
P1
]]>)
        End Sub
 
        <Fact>
        Public Sub DataFlow_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Module1
    Sub Main()
        Dim x As C2
        System.Console.WriteLine(NameOf(x.F1))
 
        Dim y As C2
 
        Return 
        System.Console.WriteLine(y.F1)
    End Sub
End Module
 
Class C2
    Public F1 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
F1
]]>).VerifyDiagnostics()
        End Sub
 
        <Fact>
        Public Sub Attribute_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
<System.Diagnostics.DebuggerDisplay("={" + NameOf(Test.MTest) + "()}")>
Class Test

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    Function MTest() As String
        Return ""
    End Function
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
={MTest()}
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(Test.MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Function Test.MTest() As System.String", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Function Test.MTest() As System.String", group.Single.ToTestDisplayString())
 
            Dim receiver = DirectCast(argument, MemberAccessExpressionSyntax).Expression
 
            typeInfo = model.GetTypeInfo(receiver)
            Assert.Equal("Test", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(receiver)
            Assert.Equal("Test", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
        End Sub
 
        <Fact>
        Public Sub Attribute_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
<System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
Class Test

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    Function MTest() As String
        Return ""
    End Function
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected><![CDATA[
BC30059: Constant expression is required.
<System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BC30451: 'MTest' is not declared. It may be inaccessible due to its protection level.
<System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
                                                  ~~~~~
]]></expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal(SymbolKind.ErrorType, typeInfo.Type.Kind)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Attribute_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
<System.Diagnostics.DebuggerDisplay("={" + NameOf(.MTest) + "()}")>
Class Test

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    Function MTest() As String
        Return ""
    End Function
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            AssertTheseDiagnostics(comp,
<expected><![CDATA[
BC30059: Constant expression is required.
<System.Diagnostics.DebuggerDisplay("={" + NameOf(.MTest) + "()}")>
                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BC30157: Leading '.' or '!' can only appear inside a 'With' statement.
<System.Diagnostics.DebuggerDisplay("={" + NameOf(.MTest) + "()}")>
                                                  ~~~~~~
]]></expected>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(.MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal(SymbolKind.ErrorType, typeInfo.Type.Kind)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Attribute_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Class Module1

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    <System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
    Class Test
    End Class

    Function MTest() As String
        Return ""
    End Function
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
={MTest()}
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Function Module1.MTest() As System.String", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Function Module1.MTest() As System.String", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub Attribute_05()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Class Module1

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    <System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
    Class Test
    End Class

    Property MTest As String
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
={MTest()}
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Property Module1.MTest As System.String", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Property Module1.MTest As System.String", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub Attribute_06()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Class Module1

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    <System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
    Class Test
    End Class

    Dim MTest As String
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
={MTest()}
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("Module1.MTest As System.String", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub Attribute_07()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Class Module1

    Shared Sub Main()
        System.Console.WriteLine(DirectCast(GetType(Test).GetCustomAttributes(GetType(System.Diagnostics.DebuggerDisplayAttribute), False)(0), System.Diagnostics.DebuggerDisplayAttribute).Value)
    End Sub

    <System.Diagnostics.DebuggerDisplay("={" + NameOf(MTest) + "()}")>
    Class Test
    End Class

    Event MTest As System.Action
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
={MTest()}
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Action", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("Event Module1.MTest As System.Action", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub InstanceAndExtension()
            Dim compilationDef =
<compilation>
    <file name="a.vb"><![CDATA[
Module Module1
    Sub Main()
        System.Console.WriteLine(NameOf(C2.M1))
    End Sub

    <System.Runtime.CompilerServices.Extension>
    Public Function M1(this As C2) As Integer
        Return Nothing
    End Function
End Module

Class C2
    Sub M1(x as Integer)
    End Sub
End Class
    ]]></file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntimeAndReferences(compilationDef, {Net40.References.SystemCore}, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(C2.M1)", node1.ToString())
            Assert.Equal("M1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal(2, symbolInfo.CandidateSymbols.Length)
            Assert.Equal("Sub C2.M1(x As System.Int32)", symbolInfo.CandidateSymbols(0).ToTestDisplayString())
            Assert.Equal("Function C2.M1() As System.Int32", symbolInfo.CandidateSymbols(1).ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(2, group.Length)
            Assert.Equal("Sub C2.M1(x As System.Int32)", group(0).ToTestDisplayString())
            Assert.Equal("Function C2.M1() As System.Int32", group(1).ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub InstanceInShared_01()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Class Module1
    Shared Sub Main()
        System.Console.WriteLine(NameOf(F1))
    End Sub
 
    Public F1 As Integer
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
F1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(F1)", node1.ToString())
            Assert.Equal("F1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Int32", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("Module1.F1 As System.Int32", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            Assert.Equal(0, symbolInfo.CandidateSymbols.Length)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub InstanceInShared_02()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Class Module1
    Shared Sub Main()
        System.Console.WriteLine(NameOf(F1))
    End Sub
 
    Event F1 As System.Action
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
F1
]]>)
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(F1)", node1.ToString())
            Assert.Equal("F1", model.GetConstantValue(node1).Value)
 
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Equal("System.Action", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Equal("Event Module1.F1 As System.Action", symbolInfo.Symbol.ToTestDisplayString())
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
            Assert.Equal(0, symbolInfo.CandidateSymbols.Length)
 
            group = model.GetMemberGroup(argument)
            Assert.Equal(0, group.Length)
        End Sub
 
        <Fact>
        Public Sub InstanceInShared_03()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Class Module1
    Shared Sub Main()
        System.Console.WriteLine(NameOf(MTest))
    End Sub
 
    Function MTest() As String
        Return ""
    End Function
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
MTest
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Function Module1.MTest() As System.String", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Function Module1.MTest() As System.String", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact>
        Public Sub InstanceInShared_04()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Class Module1
    Shared Sub Main()
        System.Console.WriteLine(NameOf(MTest))
    End Sub
 
    Property MTest As String
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
 
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
MTest
]]>).VerifyDiagnostics()
 
            Dim tree = comp.SyntaxTrees.First
            Dim model = comp.GetSemanticModel(tree)
            Dim node1 = tree.GetRoot().DescendantNodes().Where(Function(n) n.Kind() = SyntaxKind.NameOfExpression).Cast(Of NameOfExpressionSyntax)().First()
 
            Dim typeInfo As TypeInfo
            Dim symbolInfo As SymbolInfo
            Dim group As ImmutableArray(Of ISymbol)
 
            Assert.Equal("NameOf(MTest)", node1.ToString())
            Assert.Equal("MTest", model.GetConstantValue(node1).Value)
            typeInfo = model.GetTypeInfo(node1)
            Assert.Equal("System.String", typeInfo.Type.ToTestDisplayString())
 
            symbolInfo = model.GetSymbolInfo(node1)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.None, symbolInfo.CandidateReason)
 
            group = model.GetMemberGroup(node1)
            Assert.True(group.IsEmpty)
 
            Dim argument = node1.Argument
 
            typeInfo = model.GetTypeInfo(argument)
            Assert.Null(typeInfo.Type)
 
            symbolInfo = model.GetSymbolInfo(argument)
            Assert.Null(symbolInfo.Symbol)
            Assert.Equal(CandidateReason.MemberGroup, symbolInfo.CandidateReason)
            Assert.Equal("Property Module1.MTest As System.String", symbolInfo.CandidateSymbols.Single.ToTestDisplayString())
 
            group = model.GetMemberGroup(argument)
            Assert.Equal("Property Module1.MTest As System.String", group.Single.ToTestDisplayString())
        End Sub
 
        <Fact, WorkItem(543, "https://github.com/dotnet/roslyn")>
        Public Sub NameOfConstantInInitializer()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Class Module1
    Const N1 As String = NameOf(N1)
    Shared Sub Main()
        Const N2 As String = NameOf(N2)
        System.Console.WriteLine(N1 &amp; N2)
    End Sub
End Class
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
N1N2
]]>).VerifyDiagnostics()
        End Sub
 
        <Fact, WorkItem(564, "https://github.com/dotnet/roslyn/issues/564")>
        Public Sub NameOfTypeParameterInDefaultValue()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Module Program
    Sub M(Of TP)(Optional name As String = NameOf(TP))
        System.Console.WriteLine(name)
    End Sub
    Sub Main()
        M(Of String)()
    End Sub
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
TP
]]>).VerifyDiagnostics()
        End Sub
 
        <Fact, WorkItem(10839, "https://github.com/dotnet/roslyn/issues/10839")>
        Public Sub NameOfByRefInLambda()
            Dim compilationDef =
                <compilation>
                    <file name="a.vb">
Module Program
    Sub DoSomething(ByRef x As Integer)
        Dim f = Function()
                    Return NameOf(x)
                End Function
        System.Console.WriteLine(f())
    End Sub
    Sub Main()
        Dim x =  5
        DoSomething(x)
    End Sub
End Module
                </file>
                </compilation>
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugExe)
            CompileAndVerify(comp, expectedOutput:="x").VerifyDiagnostics()
        End Sub
 
        <Fact, WorkItem(10839, "https://github.com/dotnet/roslyn/issues/10839")>
        Public Sub NameOfByRefInQuery()
            Dim compilationDef =
                <compilation>
                    <file name="a.vb">
Imports System.Linq
 
Module Program
    Sub DoSomething(ByRef x As Integer)
        Dim f = from y in {1, 2, 3}
                select nameof(x)
        System.Console.WriteLine(f.Aggregate("", Function(a, b) a + b))
    End Sub
    Sub Main()
        Dim x =  5
        DoSomething(x)
    End Sub
End Module
                </file>
                </compilation>
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, options:=TestOptions.DebugExe, additionalRefs:={LinqAssemblyRef})
            CompileAndVerify(comp, expectedOutput:="xxx").VerifyDiagnostics()
        End Sub
 
        <Fact, WorkItem(10839, "https://github.com/dotnet/roslyn/issues/10839")>
        Public Sub ForbidInstanceQualifiedFromTypeInNestedExpression()
            Dim compilationDef =
                <compilation>
                    <file name="a.vb">
Class C
    Public MyInstance As String
    Public Shared MyStatic As String
 
    Sub M()
        Dim X As String
        X = NameOf(C.MyInstance)
        X = NameOf(C.MyInstance.Length)
        X = NameOf(C.MyStatic)
        X = NameOf(C.MyStatic.Length)
    End Sub
End Class
Class C(Of T)
    Public MyInstance As String
    Public Shared MyStatic As String
 
    Sub M()
        Dim X As String
        X = NameOf(C(Of Integer).MyInstance)
        X = NameOf(C(Of Integer).MyInstance.Length)
        X = NameOf(C(Of Integer).MyStatic)
        X = NameOf(C(Of Integer).MyStatic.Length)
    End Sub
End Class
                </file>
                </compilation>
            Dim comp = CreateCompilationWithMscorlib40AndVBRuntime(compilationDef, TestOptions.DebugDll)
 
            AssertTheseDiagnostics(comp,
<expected><![CDATA[
BC30469: Reference to a non-shared member requires an object reference.
        X = NameOf(C.MyInstance.Length)
                   ~~~~~~~~~~~~
BC30469: Reference to a non-shared member requires an object reference.
        X = NameOf(C(Of Integer).MyInstance.Length)
                   ~~~~~~~~~~~~~~~~~~~~~~~~
]]></expected>)
        End Sub
 
        <Fact, WorkItem(23019, "https://github.com/dotnet/roslyn/issues/23019")>
        Public Sub NameOfInAsync()
            Dim compilationDef =
<compilation>
    <file name="a.vb">
Imports System
Imports System.Threading.Tasks
 
Module Module1
    Sub Main()
        M().GetAwaiter().GetResult()
    End Sub
    Async Function M() As Task
        Console.WriteLine(NameOf(M))
        Await Task.CompletedTask
    End Function
End Module
    </file>
</compilation>
 
            Dim comp = CreateCompilation(compilationDef, options:=TestOptions.DebugExe)
            CompileAndVerify(comp, expectedOutput:=
            <![CDATA[
M
]]>).VerifyDiagnostics()
        End Sub
    End Class
End Namespace