File: Extensions\StatementSyntaxExtensionTests.vb
Web Access
Project: ..\..\..\src\EditorFeatures\VisualBasicTest\Microsoft.CodeAnalysis.VisualBasic.EditorFeatures.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.EditorFeatures.UnitTests)
' Licensed to the .NET Foundation under one or more agreements.
' The .NET Foundation licenses this file to you under the MIT license.
' See the LICENSE file in the project root for more information.
 
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions
Imports Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery
Imports System.Threading
 
Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Extensions
    Public Class StatementSyntaxExtensionTests
 
        Private Shared Sub TestStatementDeclarationWithPublicModifier(Of T As StatementSyntax)(node As T)
            Dim modifierList = SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
            Dim newNode = DirectCast(node.WithModifiers(modifierList), T)
            Dim actual = newNode.GetModifiers().First().ToString()
            Assert.Equal("Public", actual)
        End Sub
 
        Private Shared Sub VerifyTokenName(Of T As DeclarationStatementSyntax)(code As String, expectedName As String)
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of T).First()
            Dim actualNameToken = node.GetNameToken()
            Assert.Equal(expectedName, actualNameToken.ToString())
        End Sub
 
        <Fact>
        Public Sub MethodReturnType()
            Dim methodDeclaration = SyntaxFactory.FunctionStatement(attributeLists:=Nothing,
                                                              modifiers:=Nothing,
                                                              identifier:=SyntaxFactory.Identifier("F1"),
                                                              typeParameterList:=Nothing,
                                                              parameterList:=Nothing,
                                                              asClause:=SyntaxFactory.SimpleAsClause(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntegerKeyword))),
                                                              handlesClause:=Nothing,
                                                              implementsClause:=Nothing)
            Assert.True(methodDeclaration.HasReturnType())
 
            Dim result = methodDeclaration.GetReturnType()
            Dim returnTypeName = result.ToString()
            Assert.Equal("Integer", returnTypeName)
        End Sub
 
        <Fact>
        Public Sub PropertyReturnType()
            Dim propertyDeclaration = SyntaxFactory.PropertyStatement(attributeLists:=Nothing,
                                                               modifiers:=Nothing,
                                                               identifier:=SyntaxFactory.Identifier("P1"),
                                                               parameterList:=Nothing,
                                                               asClause:=SyntaxFactory.SimpleAsClause(SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ByteKeyword))),
                                                               initializer:=Nothing,
                                                               implementsClause:=Nothing)
            Assert.True(propertyDeclaration.HasReturnType())
 
            Dim result = propertyDeclaration.GetReturnType()
            Dim returnTypeName = result.ToString()
            Assert.Equal("Byte", returnTypeName)
        End Sub
 
        Private Shared Sub TestTypeBlockWithPublicModifier(Of T As TypeBlockSyntax)(code As String)
            Dim node = SyntaxFactory.ParseCompilationUnit(code).Members.First()
            Dim modifierList = SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword))
            Dim newNode = DirectCast(node.WithModifiers(modifierList), T)
            Dim actual = newNode.GetModifiers().First().ToString()
            Assert.Equal("Public", actual)
        End Sub
 
        <Fact>
        Public Sub GetClassStatementModifiers()
            Dim code = <String>Public Class C</String>.Value
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of ClassStatementSyntax).First()
            Dim actualModifierName = node.Modifiers().First().ToString()
            Assert.Equal("Public", actualModifierName)
        End Sub
 
        <Fact>
        Public Sub GetEnumStatementModifiers()
            Dim code = <String>Public Enum E</String>.Value
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of EnumStatementSyntax).First()
            Dim actualModifierName = node.Modifiers().First().ToString()
            Assert.Equal("Public", actualModifierName)
        End Sub
 
        <Fact>
        Public Sub InterfaceBlockWithPublicModifier()
            Dim code = <String>Interface I
End Interface</String>.Value
 
            TestTypeBlockWithPublicModifier(Of InterfaceBlockSyntax)(code)
        End Sub
 
        <Fact>
        Public Sub ModuleBlockWithPublicModifier()
            Dim code = <String>Module M
End Module</String>.Value
 
            TestTypeBlockWithPublicModifier(Of ModuleBlockSyntax)(code)
        End Sub
 
        <Fact>
        Public Sub StructureBlockWithPublicModifier()
            Dim code = <string>Structure S
End Structure</string>.Value
 
            TestTypeBlockWithPublicModifier(Of StructureBlockSyntax)(code)
        End Sub
 
        <Fact>
        Public Sub EnumBlockWithPublicModifier()
            Dim code = <String>Enum E
End Enum</String>.Value
 
            Dim node = DirectCast(SyntaxFactory.ParseCompilationUnit(code).Members.First(), EnumBlockSyntax)
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub ClassStatementWithPublicModifier()
            Dim node = SyntaxFactory.ClassStatement(SyntaxFactory.Identifier("C"))
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub EnumStatementWithPublicModifier()
            Dim node = SyntaxFactory.EnumStatement(SyntaxFactory.Identifier("E"))
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub FieldDeclarationWithPublicModifier()
            Dim code = <String>Class C
    dim _field as Integer = 1
End Class</String>.Value
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of FieldDeclarationSyntax).First()
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub EventBlockWithPublicModifier()
            Dim code = <String>Custom Event E As EventHandler
End Event</String>.Value
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of EventBlockSyntax).First()
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub EventStatementWithPublicModifier()
            Dim node = SyntaxFactory.EventStatement(SyntaxFactory.Identifier("E"))
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub PropertyBlockWithPublicModifier()
            Dim code = <String>Property P as Integer
End Property</String>.Value
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of PropertyBlockSyntax).First()
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub SubBlockWithPublicModifier()
            Dim code = <String>Sub Goo
End Sub</String>.Value
            Dim node = SyntaxFactory.ParseCompilationUnit(code).DescendantNodes.OfType(Of MethodBlockSyntax).First()
            TestStatementDeclarationWithPublicModifier(node)
        End Sub
 
        <Fact>
        Public Sub VerifyClassNameToken()
            Dim code = <String>Class C
End Class</String>.Value
            VerifyTokenName(Of ClassBlockSyntax)(code, "C")
        End Sub
 
        <Fact>
        Public Sub VerifyInterfaceNameToken()
            Dim code = <String>Interface I
End Interface</String>.Value
            VerifyTokenName(Of InterfaceBlockSyntax)(code, "I")
        End Sub
 
        <Fact>
        Public Sub VerifyStructureNameToken()
            Dim code = <String>Structure S
End Structure</String>.Value
            VerifyTokenName(Of StructureBlockSyntax)(code, "S")
        End Sub
 
        <Fact>
        Public Sub VerifyModuleNameToken()
            Dim code = <String>Module M
End Module</String>.Value
            VerifyTokenName(Of ModuleBlockSyntax)(code, "M")
        End Sub
 
        <Fact>
        Public Sub VerifyStructureStatementNameToken()
            Dim code = <String>Structure SS
</String>.Value
            VerifyTokenName(Of StructureStatementSyntax)(code, "SS")
        End Sub
 
        <Fact>
        Public Sub VerifyConstructorNameTokenIsNothing()
            Dim code = <String>Class C
    Sub New()
End Class</String>.Value
            VerifyTokenName(Of SubNewStatementSyntax)(code, "")
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/552823")>
        Public Sub TestIsInStatementBlockOfKindForBrokenCode()
            Dim code = <String>End Sub
End Module
End Namespace
d</String>.Value
 
            Dim tree = SyntaxFactory.ParseSyntaxTree(code)
 
            Dim token = tree.GetRoot() _
                            .DescendantTokens() _
                            .Where(Function(t) t.Kind = SyntaxKind.NamespaceKeyword) _
                            .First()
 
            For position = token.SpanStart To token.Span.End
                Dim targetToken = tree.GetTargetToken(position, CancellationToken.None)
                tree.IsInStatementBlockOfKind(position, targetToken, CancellationToken.None)
            Next
        End Sub
    End Class
End Namespace