Imports System.Globalization Imports Microsoft.CodeAnalysis.CodeGeneration Imports Microsoft.CodeAnalysis.Options Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Imports Xunit Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests.CodeGeneration Public Class SyntaxGeneratorTests Private ReadOnly g As SyntaxGenerator = SyntaxGenerator.GetGenerator(New CustomWorkspace(), LanguageNames.VisualBasic) Private ReadOnly emptyCompilation As VisualBasicCompilation = VisualBasicCompilation.Create("empty", references:={TestReferences.NetFx.v4_0_30319.mscorlib}) Private ienumerableInt As INamedTypeSymbol Public Sub New() Me.ienumerableInt = emptyCompilation.GetSpecialType(SpecialType.System_Collections_Generic_IEnumerable_T).Construct(emptyCompilation.GetSpecialType(SpecialType.System_Int32)) End Sub Private Sub VerifySyntax(Of TSyntax As SyntaxNode)(type As SyntaxNode, expectedText As String) Assert.IsAssignableFrom(GetType(TSyntax), type) Dim normalized = type.NormalizeWhitespace().ToFullString() Dim fixedExpectations = expectedText.Replace(vbLf, vbCrLf) Assert.Equal(fixedExpectations, normalized) End Sub Private Function ParseCompilationUnit(text As String) As CompilationUnitSyntax Dim fixedText = text.Replace(vbLf, vbCrLf) Return SyntaxFactory.ParseCompilationUnit(fixedText) End Function Public Sub TestLiteralExpressions() VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0), "0") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(1), "1") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(-1), "-1") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Integer.MinValue), "Global.System.Int32.MinValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Integer.MaxValue), "Global.System.Int32.MaxValue") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0L), "0L") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(1L), "1L") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(-1L), "-1L") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Long.MinValue), "Global.System.Int64.MinValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Long.MaxValue), "Global.System.Int64.MaxValue") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0UL), "0UL") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(1UL), "1UL") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(ULong.MinValue), "0UL") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(ULong.MaxValue), "Global.System.UInt64.MaxValue") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0.0F), "0F") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(1.0F), "1F") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(-1.0F), "-1F") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Single.MinValue), "Global.System.Single.MinValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Single.MaxValue), "Global.System.Single.MaxValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Single.Epsilon), "Global.System.Single.Epsilon") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Single.NaN), "Global.System.Single.NaN") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Single.NegativeInfinity), "Global.System.Single.NegativeInfinity") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Single.PositiveInfinity), "Global.System.Single.PositiveInfinity") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0.0), "0R") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(1.0), "1R") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(-1.0), "-1R") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Double.MinValue), "Global.System.Double.MinValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Double.MaxValue), "Global.System.Double.MaxValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Double.Epsilon), "Global.System.Double.Epsilon") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Double.NaN), "Global.System.Double.NaN") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Double.NegativeInfinity), "Global.System.Double.NegativeInfinity") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Double.PositiveInfinity), "Global.System.Double.PositiveInfinity") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0D), "0D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(0.00D), "0.00D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("1.00", CultureInfo.InvariantCulture)), "1.00D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("-1.00", CultureInfo.InvariantCulture)), "-1.00D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("1.0000000000", CultureInfo.InvariantCulture)), "1.0000000000D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("0.000000", CultureInfo.InvariantCulture)), "0.000000D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("0.0000000", CultureInfo.InvariantCulture)), "0.0000000D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(1000000000D), "1000000000D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(123456789.123456789D), "123456789.123456789D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("1E-28", NumberStyles.Any, CultureInfo.InvariantCulture)), "0.0000000000000000000000000001D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("0E-28", NumberStyles.Any, CultureInfo.InvariantCulture)), "0.0000000000000000000000000000D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("1E-29", NumberStyles.Any, CultureInfo.InvariantCulture)), "0.0000000000000000000000000000D") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(Decimal.Parse("-1E-29", NumberStyles.Any, CultureInfo.InvariantCulture)), "0.0000000000000000000000000000D") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Decimal.MinValue), "Global.System.Decimal.MinValue") VerifySyntax(Of MemberAccessExpressionSyntax)(g.LiteralExpression(Decimal.MaxValue), "Global.System.Decimal.MaxValue") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression("c"c), """c""c") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression("str"), """str""") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(True), "True") VerifySyntax(Of LiteralExpressionSyntax)(g.LiteralExpression(False), "False") End Sub Public Sub TestNameExpressions() VerifySyntax(Of IdentifierNameSyntax)(g.IdentifierName("x"), "x") VerifySyntax(Of QualifiedNameSyntax)(g.QualifiedName(g.IdentifierName("x"), g.IdentifierName("y")), "x.y") VerifySyntax(Of QualifiedNameSyntax)(g.DottedName("x.y"), "x.y") VerifySyntax(Of GenericNameSyntax)(g.GenericName("x", g.IdentifierName("y")), "x(Of y)") VerifySyntax(Of GenericNameSyntax)(g.GenericName("x", g.IdentifierName("y"), g.IdentifierName("z")), "x(Of y, z)") ' convert identifer name into generic name VerifySyntax(Of GenericNameSyntax)(g.WithTypeArguments(g.IdentifierName("x"), g.IdentifierName("y")), "x(Of y)") ' convert qualified name into qualified generic name VerifySyntax(Of QualifiedNameSyntax)(g.WithTypeArguments(g.DottedName("x.y"), g.IdentifierName("z")), "x.y(Of z)") ' convert member access expression into generic member access expression VerifySyntax(Of MemberAccessExpressionSyntax)(g.WithTypeArguments(g.MemberAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x.y(Of z)") ' convert existing generic name into a different generic name Dim gname = g.WithTypeArguments(g.IdentifierName("x"), g.IdentifierName("y")) VerifySyntax(Of GenericNameSyntax)(gname, "x(Of y)") VerifySyntax(Of GenericNameSyntax)(g.WithTypeArguments(gname, g.IdentifierName("z")), "x(Of z)") End Sub Public Sub TestTypeExpressions() ' these are all type syntax too VerifySyntax(Of TypeSyntax)(g.IdentifierName("x"), "x") VerifySyntax(Of TypeSyntax)(g.QualifiedName(g.IdentifierName("x"), g.IdentifierName("y")), "x.y") VerifySyntax(Of TypeSyntax)(g.DottedName("x.y"), "x.y") VerifySyntax(Of TypeSyntax)(g.GenericName("x", g.IdentifierName("y")), "x(Of y)") VerifySyntax(Of TypeSyntax)(g.GenericName("x", g.IdentifierName("y"), g.IdentifierName("z")), "x(Of y, z)") VerifySyntax(Of TypeSyntax)(g.ArrayTypeExpression(g.IdentifierName("x")), "x()") VerifySyntax(Of TypeSyntax)(g.ArrayTypeExpression(g.ArrayTypeExpression(g.IdentifierName("x"))), "x()()") VerifySyntax(Of TypeSyntax)(g.NullableTypeExpression(g.IdentifierName("x")), "x?") VerifySyntax(Of TypeSyntax)(g.NullableTypeExpression(g.NullableTypeExpression(g.IdentifierName("x"))), "x?") End Sub Public Sub TestSpecialTypeExpression() VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Byte), "Byte") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_SByte), "SByte") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Int16), "Short") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_UInt16), "UShort") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Int32), "Integer") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_UInt32), "UInteger") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Int64), "Long") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_UInt64), "ULong") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Single), "Single") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Double), "Double") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Char), "Char") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_String), "String") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Object), "Object") VerifySyntax(Of TypeSyntax)(g.TypeExpression(SpecialType.System_Decimal), "Decimal") End Sub Public Sub TestSymbolTypeExpressions() Dim genericType = emptyCompilation.GetSpecialType(SpecialType.System_Collections_Generic_IEnumerable_T) VerifySyntax(Of QualifiedNameSyntax)(g.TypeExpression(genericType), "Global.System.Collections.Generic.IEnumerable(Of T)") Dim arrayType = emptyCompilation.CreateArrayTypeSymbol(emptyCompilation.GetSpecialType(SpecialType.System_Int32)) VerifySyntax(Of ArrayTypeSyntax)(g.TypeExpression(arrayType), "System.Int32()") End Sub Public Sub TestMathAndLogicExpressions() VerifySyntax(Of UnaryExpressionSyntax)(g.NegateExpression(g.IdentifierName("x")), "-(x)") VerifySyntax(Of BinaryExpressionSyntax)(g.AddExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) + (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.SubtractExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) - (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.MultiplyExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) * (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.DivideExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) / (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.ModuloExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) Mod (y)") VerifySyntax(Of UnaryExpressionSyntax)(g.BitwiseNotExpression(g.IdentifierName("x")), "Not(x)") VerifySyntax(Of BinaryExpressionSyntax)(g.BitwiseAndExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) And (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.BitwiseOrExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) Or (y)") VerifySyntax(Of UnaryExpressionSyntax)(g.LogicalNotExpression(g.IdentifierName("x")), "Not(x)") VerifySyntax(Of BinaryExpressionSyntax)(g.LogicalAndExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) AndAlso (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.LogicalOrExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) OrElse (y)") End Sub Public Sub TestEqualityAndInequalityExpressions() VerifySyntax(Of BinaryExpressionSyntax)(g.ReferenceEqualsExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) Is (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.ValueEqualsExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) = (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.ReferenceNotEqualsExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) IsNot (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.ValueNotEqualsExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) <> (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.LessThanExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) < (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.LessThanOrEqualExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) <= (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.GreaterThanExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) > (y)") VerifySyntax(Of BinaryExpressionSyntax)(g.GreaterThanOrEqualExpression(g.IdentifierName("x"), g.IdentifierName("y")), "(x) >= (y)") End Sub Public Sub TestConditionalExpressions() VerifySyntax(Of BinaryConditionalExpressionSyntax)(g.CoalesceExpression(g.IdentifierName("x"), g.IdentifierName("y")), "If(x, y)") VerifySyntax(Of TernaryConditionalExpressionSyntax)(g.ConditionalExpression(g.IdentifierName("x"), g.IdentifierName("y"), g.IdentifierName("z")), "If(x, y, z)") End Sub Public Sub TestMemberAccessExpressions() VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), "x.y") VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.IdentifierName("x"), "y"), "x.y") VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.MemberAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x.y.z") VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.InvocationExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x(y).z") VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.ElementAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x(y).z") VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.AddExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "((x) + (y)).z") VerifySyntax(Of MemberAccessExpressionSyntax)(g.MemberAccessExpression(g.NegateExpression(g.IdentifierName("x")), g.IdentifierName("y")), "(-(x)).y") End Sub Public Sub TestObjectCreationExpressions() VerifySyntax(Of ObjectCreationExpressionSyntax)( g.ObjectCreationExpression(g.IdentifierName("x")), "New x()") VerifySyntax(Of ObjectCreationExpressionSyntax)( g.ObjectCreationExpression(g.IdentifierName("x"), g.IdentifierName("y")), "New x(y)") Dim intType = emptyCompilation.GetSpecialType(SpecialType.System_Int32) Dim listType = emptyCompilation.GetTypeByMetadataName("System.Collections.Generic.List`1") Dim listOfIntType = listType.Construct(intType) VerifySyntax(Of ObjectCreationExpressionSyntax)( g.ObjectCreationExpression(listOfIntType, g.IdentifierName("y")), "New Global.System.Collections.Generic.List(Of System.Int32)(y)") End Sub Public Sub TestElementAccessExpressions() VerifySyntax(Of InvocationExpressionSyntax)( g.ElementAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), "x(y)") VerifySyntax(Of InvocationExpressionSyntax)( g.ElementAccessExpression(g.IdentifierName("x"), g.IdentifierName("y"), g.IdentifierName("z")), "x(y, z)") VerifySyntax(Of InvocationExpressionSyntax)( g.ElementAccessExpression(g.MemberAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x.y(z)") VerifySyntax(Of InvocationExpressionSyntax)( g.ElementAccessExpression(g.ElementAccessExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x(y)(z)") VerifySyntax(Of InvocationExpressionSyntax)( g.ElementAccessExpression(g.InvocationExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "x(y)(z)") VerifySyntax(Of InvocationExpressionSyntax)( g.ElementAccessExpression(g.AddExpression(g.IdentifierName("x"), g.IdentifierName("y")), g.IdentifierName("z")), "((x) + (y))(z)") End Sub Public Sub TestCastAndConvertExpressions() VerifySyntax(Of DirectCastExpressionSyntax)(g.CastExpression(g.IdentifierName("x"), g.IdentifierName("y")), "DirectCast(y, x)") VerifySyntax(Of CTypeExpressionSyntax)(g.ConvertExpression(g.IdentifierName("x"), g.IdentifierName("y")), "CType(y, x)") End Sub Public Sub TestIsAndAsExpressions() VerifySyntax(Of TypeOfExpressionSyntax)(g.IsTypeExpression(g.IdentifierName("x"), g.IdentifierName("y")), "TypeOf(x) Is y") VerifySyntax(Of TryCastExpressionSyntax)(g.TryCastExpression(g.IdentifierName("x"), g.IdentifierName("y")), "TryCast(x, y)") End Sub Public Sub TestInvocationExpressions() ' without explicit arguments VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.IdentifierName("x")), "x()") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.IdentifierName("x"), g.IdentifierName("y")), "x(y)") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.IdentifierName("x"), g.IdentifierName("y"), g.IdentifierName("z")), "x(y, z)") ' using explicit arguments VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.IdentifierName("x"), g.Argument(g.IdentifierName("y"))), "x(y)") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.IdentifierName("x"), g.Argument(RefKind.Ref, g.IdentifierName("y"))), "x(y)") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.IdentifierName("x"), g.Argument(RefKind.Out, g.IdentifierName("y"))), "x(y)") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.MemberAccessExpression(g.IdentifierName("x"), g.IdentifierName("y"))), "x.y()") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.ElementAccessExpression(g.IdentifierName("x"), g.IdentifierName("y"))), "x(y)()") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.InvocationExpression(g.IdentifierName("x"), g.IdentifierName("y"))), "x(y)()") VerifySyntax(Of InvocationExpressionSyntax)(g.InvocationExpression(g.AddExpression(g.IdentifierName("x"), g.IdentifierName("y"))), "((x) + (y))()") End Sub Public Sub TestAssignmentStatement() VerifySyntax(Of AssignmentStatementSyntax)(g.AssignmentStatement(g.IdentifierName("x"), g.IdentifierName("y")), "x = y") End Sub Public Sub TestExpressionStatement() VerifySyntax(Of ExpressionStatementSyntax)(g.ExpressionStatement(g.IdentifierName("x")), "x") VerifySyntax(Of ExpressionStatementSyntax)(g.ExpressionStatement(g.InvocationExpression(g.IdentifierName("x"))), "x()") End Sub Public Sub TestLocalDeclarationStatements() VerifySyntax(Of LocalDeclarationStatementSyntax)(g.LocalDeclarationStatement(g.IdentifierName("x"), "y"), "Dim y As x") VerifySyntax(Of LocalDeclarationStatementSyntax)(g.LocalDeclarationStatement(g.IdentifierName("x"), "y", g.IdentifierName("z")), "Dim y As x = z") VerifySyntax(Of LocalDeclarationStatementSyntax)(g.LocalDeclarationStatement("y", g.IdentifierName("z")), "Dim y = z") VerifySyntax(Of LocalDeclarationStatementSyntax)(g.LocalDeclarationStatement(g.IdentifierName("x"), "y", isConst:=True), "Const y As x") VerifySyntax(Of LocalDeclarationStatementSyntax)(g.LocalDeclarationStatement(g.IdentifierName("x"), "y", g.IdentifierName("z"), isConst:=True), "Const y As x = z") VerifySyntax(Of LocalDeclarationStatementSyntax)(g.LocalDeclarationStatement(DirectCast(Nothing, SyntaxNode), "y", g.IdentifierName("z"), isConst:=True), "Const y = z") End Sub Public Sub TestReturnStatements() VerifySyntax(Of ReturnStatementSyntax)(g.ReturnStatement(), "Return") VerifySyntax(Of ReturnStatementSyntax)(g.ReturnStatement(g.IdentifierName("x")), "Return x") End Sub Public Sub TestThrowStatements() VerifySyntax(Of ThrowStatementSyntax)(g.ThrowStatement(), "Throw") VerifySyntax(Of ThrowStatementSyntax)(g.ThrowStatement(g.IdentifierName("x")), "Throw x") End Sub Public Sub TestIfStatements() VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), New SyntaxNode() {}), If x Then End If.Value) VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), Nothing), If x Then End If.Value) VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), New SyntaxNode() {}, New SyntaxNode() {}), If x Then Else End If.Value) VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), {g.IdentifierName("y")}), If x Then y End If.Value) VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), {g.IdentifierName("y")}, {g.IdentifierName("z")}), If x Then y Else z End If.Value) VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), {g.IdentifierName("y")}, {g.IfStatement(g.IdentifierName("p"), {g.IdentifierName("q")})}), If x Then y ElseIf p Then q End If.Value) VerifySyntax(Of MultiLineIfBlockSyntax)( g.IfStatement(g.IdentifierName("x"), {g.IdentifierName("y")}, g.IfStatement(g.IdentifierName("p"), {g.IdentifierName("q")}, {g.IdentifierName("z")})), If x Then y ElseIf p Then q Else z End If.Value) End Sub Public Sub TestSwitchStatements() Dim x = 10 VerifySyntax(Of SelectBlockSyntax)( g.SwitchStatement(g.IdentifierName("x"), g.SwitchSection(g.IdentifierName("y"), {g.IdentifierName("z")})), Select x Case y z End Select.Value) VerifySyntax(Of SelectBlockSyntax)( g.SwitchStatement(g.IdentifierName("x"), g.SwitchSection( {g.IdentifierName("y"), g.IdentifierName("p"), g.IdentifierName("q")}, {g.IdentifierName("z")})), Select x Case y, p, q z End Select.Value) VerifySyntax(Of SelectBlockSyntax)( g.SwitchStatement(g.IdentifierName("x"), g.SwitchSection(g.IdentifierName("y"), {g.IdentifierName("z")}), g.SwitchSection(g.IdentifierName("a"), {g.IdentifierName("b")})), Select x Case y z Case a b End Select.Value) VerifySyntax(Of SelectBlockSyntax)( g.SwitchStatement(g.IdentifierName("x"), g.SwitchSection(g.IdentifierName("y"), {g.IdentifierName("z")}), g.DefaultSwitchSection( {g.IdentifierName("b")})), Select x Case y z Case Else b End Select.Value) VerifySyntax(Of SelectBlockSyntax)( g.SwitchStatement(g.IdentifierName("x"), g.SwitchSection(g.IdentifierName("y"), {g.ExitSwitchStatement()})), Select x Case y Exit Select End Select.Value) End Sub Public Sub TestUsingStatements() VerifySyntax(Of UsingBlockSyntax)( g.UsingStatement(g.IdentifierName("x"), {g.IdentifierName("y")}), Using x y End Using.Value) VerifySyntax(Of UsingBlockSyntax)( g.UsingStatement("x", g.IdentifierName("y"), {g.IdentifierName("z")}), Using x = y z End Using.Value) VerifySyntax(Of UsingBlockSyntax)( g.UsingStatement(g.IdentifierName("x"), "y", g.IdentifierName("z"), {g.IdentifierName("q")}), Using y As x = z q End Using.Value) End Sub Public Sub TestTryCatchStatements() VerifySyntax(Of TryBlockSyntax)( g.TryCatchStatement( {g.IdentifierName("x")}, g.CatchClause(g.IdentifierName("y"), "z", {g.IdentifierName("a")})), Try x Catch z As y a End Try.Value) VerifySyntax(Of TryBlockSyntax)( g.TryCatchStatement( {g.IdentifierName("s")}, g.CatchClause(g.IdentifierName("x"), "y", {g.IdentifierName("z")}), g.CatchClause(g.IdentifierName("a"), "b", {g.IdentifierName("c")})), Try s Catch y As x z Catch b As a c End Try.Value) VerifySyntax(Of TryBlockSyntax)( g.TryCatchStatement( {g.IdentifierName("s")}, {g.CatchClause(g.IdentifierName("x"), "y", {g.IdentifierName("z")})}, {g.IdentifierName("a")}), Try s Catch y As x z Finally a End Try.Value) VerifySyntax(Of TryBlockSyntax)( g.TryFinallyStatement( {g.IdentifierName("x")}, {g.IdentifierName("a")}), Try x Finally a End Try.Value) End Sub Public Sub TestWhileStatements() VerifySyntax(Of WhileBlockSyntax)( g.WhileStatement(g.IdentifierName("x"), {g.IdentifierName("y")}), While x y End While.Value) VerifySyntax(Of WhileBlockSyntax)( g.WhileStatement(g.IdentifierName("x"), Nothing), While x End While.Value) End Sub Public Sub TestLambdaExpressions() VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression("x", g.IdentifierName("y")), Function(x) y.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression({g.LambdaParameter("x"), g.LambdaParameter("y")}, g.IdentifierName("z")), Function(x, y) z.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression(New SyntaxNode() {}, g.IdentifierName("y")), Function() y.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression("x", g.IdentifierName("y")), Sub(x) y.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression({g.LambdaParameter("x"), g.LambdaParameter("y")}, g.IdentifierName("z")), Sub(x, y) z.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression(New SyntaxNode() {}, g.IdentifierName("y")), Sub() y.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression("x", {g.ReturnStatement(g.IdentifierName("y"))}), Function(x) Return y End Function.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression({g.LambdaParameter("x"), g.LambdaParameter("y")}, {g.ReturnStatement(g.IdentifierName("z"))}), Function(x, y) Return z End Function.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression(New SyntaxNode() {}, {g.ReturnStatement(g.IdentifierName("y"))}), Function() Return y End Function.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression("x", {g.IdentifierName("y")}), Sub(x) y End Sub.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression({g.LambdaParameter("x"), g.LambdaParameter("y")}, {g.IdentifierName("z")}), Sub(x, y) z End Sub.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression(New SyntaxNode() {}, {g.IdentifierName("y")}), Sub() y End Sub.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression({g.LambdaParameter("x", g.IdentifierName("y"))}, g.IdentifierName("z")), Function(x As y) z.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.ValueReturningLambdaExpression({g.LambdaParameter("x", g.IdentifierName("y")), g.LambdaParameter("a", g.IdentifierName("b"))}, g.IdentifierName("z")), Function(x As y, a As b) z.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression({g.LambdaParameter("x", g.IdentifierName("y"))}, g.IdentifierName("z")), Sub(x As y) z.Value) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.VoidReturningLambdaExpression({g.LambdaParameter("x", g.IdentifierName("y")), g.LambdaParameter("a", g.IdentifierName("b"))}, g.IdentifierName("z")), Sub(x As y, a As b) z.Value) End Sub Public Sub TestFieldDeclarations() VerifySyntax(Of FieldDeclarationSyntax)( g.FieldDeclaration("fld", g.TypeExpression(SpecialType.System_Int32)), Dim fld As Integer.Value) VerifySyntax(Of FieldDeclarationSyntax)( g.FieldDeclaration("fld", g.TypeExpression(SpecialType.System_Int32), initializer:=g.LiteralExpression(0)), Dim fld As Integer = 0.Value) VerifySyntax(Of FieldDeclarationSyntax)( g.FieldDeclaration("fld", g.TypeExpression(SpecialType.System_Int32), accessibility:=Accessibility.Public), Public fld As Integer.Value) VerifySyntax(Of FieldDeclarationSyntax)( g.FieldDeclaration("fld", g.TypeExpression(SpecialType.System_Int32), modifiers:=DeclarationModifiers.Static Or DeclarationModifiers.ReadOnly), Shared ReadOnly fld As Integer.Value) End Sub Public Sub TestMethodDeclarations() VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m"), Sub m() End Sub.Value) VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m", typeParameters:={"x", "y"}), Sub m(Of x, y)() End Sub.Value) VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m", returnType:=g.IdentifierName("x")), Function m() As x End Function.Value) VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m", returnType:=g.IdentifierName("x"), statements:={g.ReturnStatement(g.IdentifierName("y"))}), Function m() As x Return y End Function.Value) VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m", parameters:={g.ParameterDeclaration("z", g.IdentifierName("y"))}, returnType:=g.IdentifierName("x")), Function m(z As y) As x End Function.Value) VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m", parameters:={g.ParameterDeclaration("z", g.IdentifierName("y"), g.IdentifierName("a"))}, returnType:=g.IdentifierName("x")), Function m(Optional z As y = a) As x End Function.Value) VerifySyntax(Of MethodBlockSyntax)( g.MethodDeclaration("m", returnType:=g.IdentifierName("x"), accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.None), Public Function m() As x End Function.Value) VerifySyntax(Of MethodStatementSyntax)( g.MethodDeclaration("m", returnType:=g.IdentifierName("x"), accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.Abstract), Public MustInherit Function m() As x.Value) End Sub Public Sub TestPropertyDeclarations() VerifySyntax(Of PropertyStatementSyntax)( g.PropertyDeclaration("p", g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract + DeclarationModifiers.ReadOnly), MustInherit ReadOnly Property p As x.Value) VerifySyntax(Of PropertyBlockSyntax)( g.PropertyDeclaration("p", g.IdentifierName("x"), modifiers:=DeclarationModifiers.ReadOnly), ReadOnly Property p As x Get End Get End Property.Value) VerifySyntax(Of PropertyStatementSyntax)( g.PropertyDeclaration("p", g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract), MustInherit Property p As x.Value) VerifySyntax(Of PropertyBlockSyntax)( g.PropertyDeclaration("p", g.IdentifierName("x"), modifiers:=DeclarationModifiers.ReadOnly, getAccessorStatements:={g.IdentifierName("y")}), ReadOnly Property p As x Get y End Get End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.PropertyDeclaration("p", g.IdentifierName("x"), setAccessorStatements:={g.IdentifierName("y")}), Property p As x Get End Get Set(value As x) y End Set End Property.Value) End Sub Public Sub TestIndexerDeclarations() VerifySyntax(Of PropertyStatementSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract + DeclarationModifiers.ReadOnly), Default MustInherit ReadOnly Property Item(z As y) As x.Value) VerifySyntax(Of PropertyStatementSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract), Default MustInherit Property Item(z As y) As x.Value) VerifySyntax(Of PropertyBlockSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), modifiers:=DeclarationModifiers.ReadOnly), Default ReadOnly Property Item(z As y) As x Get End Get End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), modifiers:=DeclarationModifiers.ReadOnly, getAccessorStatements:={g.IdentifierName("a")}), Default ReadOnly Property Item(z As y) As x Get a End Get End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), modifiers:=DeclarationModifiers.None), Default Property Item(z As y) As x Get End Get Set(value As x) End Set End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), setAccessorStatements:={g.IdentifierName("a")}), Default Property Item(z As y) As x Get End Get Set(value As x) a End Set End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), getAccessorStatements:={g.IdentifierName("a")}, setAccessorStatements:={g.IdentifierName("b")}), Default Property Item(z As y) As x Get a End Get Set(value As x) b End Set End Property.Value) End Sub Public Sub TestEventDeclarations() VerifySyntax(Of EventStatementSyntax)( g.EventDeclaration("ev", g.IdentifierName("t")), Event ev As t.Value) VerifySyntax(Of EventStatementSyntax)( g.EventDeclaration("ev", g.IdentifierName("t"), accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.Static), Public Shared Event ev As t.Value) VerifySyntax(Of EventBlockSyntax)( g.CustomEventDeclaration("ev", g.IdentifierName("t")), Custom Event ev As t AddHandler(value As t) End AddHandler RemoveHandler(value As t) End RemoveHandler RaiseEvent() End RaiseEvent End Event.Value) Dim params = {g.ParameterDeclaration("sender", g.TypeExpression(SpecialType.System_Object)), g.ParameterDeclaration("args", g.IdentifierName("EventArgs"))} VerifySyntax(Of EventBlockSyntax)( g.CustomEventDeclaration("ev", g.IdentifierName("t"), parameters:=params), Custom Event ev As t AddHandler(value As t) End AddHandler RemoveHandler(value As t) End RemoveHandler RaiseEvent(sender As Object, args As EventArgs) End RaiseEvent End Event.Value) End Sub Public Sub TestConstructorDeclaration() VerifySyntax(Of ConstructorBlockSyntax)( g.ConstructorDeclaration("c"), Sub New() End Sub.Value) VerifySyntax(Of ConstructorBlockSyntax)( g.ConstructorDeclaration("c", accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.Static), Public Shared Sub New() End Sub.Value) VerifySyntax(Of ConstructorBlockSyntax)( g.ConstructorDeclaration("c", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))}), Sub New(p As t) End Sub.Value) VerifySyntax(Of ConstructorBlockSyntax)( g.ConstructorDeclaration("c", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))}, baseConstructorArguments:={g.IdentifierName("p")}), Sub New(p As t) MyBase.New(p) End Sub.Value) End Sub Public Sub TestClassDeclarations() VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c"), Class c End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", typeParameters:={"x", "y"}), Class c(Of x, y) End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", accessibility:=Accessibility.Public), Public Class c End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", baseType:=g.IdentifierName("x")), Class c Inherits x End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", interfaceTypes:={g.IdentifierName("x")}), Class c Implements x End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", baseType:=g.IdentifierName("x"), interfaceTypes:={g.IdentifierName("y"), g.IdentifierName("z")}), Class c Inherits x Implements y, z End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", interfaceTypes:={}), Class c End Class.Value) VerifySyntax(Of ClassBlockSyntax)( g.ClassDeclaration("c", members:={g.FieldDeclaration("y", type:=g.IdentifierName("x"))}), Class c Dim y As x End Class.Value) End Sub Public Sub TestStructDeclarations() VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s"), Structure s End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", typeParameters:={"x", "y"}), Structure s(Of x, y) End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.Partial), Public Partial Structure s End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", interfaceTypes:={g.IdentifierName("x")}), Structure s Implements x End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", interfaceTypes:={g.IdentifierName("x"), g.IdentifierName("y")}), Structure s Implements x, y End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", interfaceTypes:={}), Structure s End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", members:={g.FieldDeclaration("y", g.IdentifierName("x"))}), Structure s Dim y As x End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", members:={g.MethodDeclaration("m", returnType:=g.IdentifierName("t"))}), Structure s Function m() As t End Function End Structure.Value) VerifySyntax(Of StructureBlockSyntax)( g.StructDeclaration("s", members:={g.ConstructorDeclaration(accessibility:=Accessibility.NotApplicable, modifiers:=DeclarationModifiers.None)}), Structure s Sub New() End Sub End Structure.Value) End Sub Public Sub TestInterfaceDeclarations() VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i"), Interface i End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", typeParameters:={"x", "y"}), Interface i(Of x, y) End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", interfaceTypes:={g.IdentifierName("a")}), Interface i Inherits a End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", interfaceTypes:={g.IdentifierName("a"), g.IdentifierName("b")}), Interface i Inherits a, b End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", interfaceTypes:={}), Interface i End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", members:={g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.Sealed)}), Interface i Function m() As t End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", members:={g.PropertyDeclaration("p", g.IdentifierName("t"), accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.Sealed)}), Interface i Property p As t End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", members:={g.PropertyDeclaration("p", g.IdentifierName("t"), accessibility:=Accessibility.Public, modifiers:=DeclarationModifiers.ReadOnly)}), Interface i ReadOnly Property p As t End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", members:={g.IndexerDeclaration({g.ParameterDeclaration("y", g.IdentifierName("x"))}, g.IdentifierName("t"), Accessibility.Public, DeclarationModifiers.Sealed)}), Interface i Default Property Item(y As x) As t End Interface.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.InterfaceDeclaration("i", members:={g.IndexerDeclaration({g.ParameterDeclaration("y", g.IdentifierName("x"))}, g.IdentifierName("t"), Accessibility.Public, DeclarationModifiers.ReadOnly)}), Interface i Default ReadOnly Property Item(y As x) As t End Interface.Value) End Sub Public Sub TestEnumDeclarations() VerifySyntax(Of EnumBlockSyntax)( g.EnumDeclaration("e"), Enum e End Enum.Value) VerifySyntax(Of EnumBlockSyntax)( g.EnumDeclaration("e", members:={g.EnumMember("a"), g.EnumMember("b"), g.EnumMember("c")}), Enum e a b c End Enum.Value) VerifySyntax(Of EnumBlockSyntax)( g.EnumDeclaration("e", members:={g.IdentifierName("a"), g.EnumMember("b"), g.IdentifierName("c")}), Enum e a b c End Enum.Value) VerifySyntax(Of EnumBlockSyntax)( g.EnumDeclaration("e", members:={g.EnumMember("a", g.LiteralExpression(0)), g.EnumMember("b"), g.EnumMember("c", g.LiteralExpression(5))}), Enum e a = 0 b c = 5 End Enum.Value) End Sub Public Sub TestDelegateDeclarations() VerifySyntax(Of DelegateStatementSyntax)( g.DelegateDeclaration("d"), Delegate Sub d().Value) VerifySyntax(Of DelegateStatementSyntax)( g.DelegateDeclaration("d", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))}), Delegate Sub d(p As t).Value) VerifySyntax(Of DelegateStatementSyntax)( g.DelegateDeclaration("d", returnType:=g.IdentifierName("t")), Delegate Function d() As t.Value) VerifySyntax(Of DelegateStatementSyntax)( g.DelegateDeclaration("d", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))}, returnType:=g.IdentifierName("t")), Delegate Function d(p As t) As t.Value) VerifySyntax(Of DelegateStatementSyntax)( g.DelegateDeclaration("d", accessibility:=Accessibility.Public), Public Delegate Sub d().Value) ' ignores modifiers VerifySyntax(Of DelegateStatementSyntax)( g.DelegateDeclaration("d", modifiers:=DeclarationModifiers.Static), Delegate Sub d().Value) End Sub Public Sub TestNamespaceImportDeclarations() VerifySyntax(Of ImportsStatementSyntax)( g.NamespaceImportDeclaration(g.IdentifierName("n")), Imports n.Value) VerifySyntax(Of ImportsStatementSyntax)( g.NamespaceImportDeclaration("n"), Imports n.Value) VerifySyntax(Of ImportsStatementSyntax)( g.NamespaceImportDeclaration("n.m"), Imports n.m.Value) End Sub Public Sub TestNamespaceDeclarations() VerifySyntax(Of NamespaceBlockSyntax)( g.NamespaceDeclaration("n"), Namespace n End Namespace.Value) VerifySyntax(Of NamespaceBlockSyntax)( g.NamespaceDeclaration("n.m"), Namespace n.m End Namespace.Value) VerifySyntax(Of NamespaceBlockSyntax)( g.NamespaceDeclaration("n", g.NamespaceImportDeclaration("m")), Namespace n Imports m End Namespace.Value) VerifySyntax(Of NamespaceBlockSyntax)( g.NamespaceDeclaration("n", g.ClassDeclaration("c"), g.NamespaceImportDeclaration("m")), Namespace n Imports m Class c End Class End Namespace.Value) End Sub Public Sub TestCompilationUnits() VerifySyntax(Of CompilationUnitSyntax)( g.CompilationUnit(), "") VerifySyntax(Of CompilationUnitSyntax)( g.CompilationUnit( g.NamespaceDeclaration("n")), Namespace n End Namespace .Value) VerifySyntax(Of CompilationUnitSyntax)( g.CompilationUnit( g.NamespaceImportDeclaration("n")), Imports n .Value) VerifySyntax(Of CompilationUnitSyntax)( g.CompilationUnit( g.ClassDeclaration("c"), g.NamespaceImportDeclaration("m")), Imports m Class c End Class .Value) VerifySyntax(Of CompilationUnitSyntax)( g.CompilationUnit( g.NamespaceImportDeclaration("n"), g.NamespaceDeclaration("n", g.NamespaceImportDeclaration("m"), g.ClassDeclaration("c"))), Imports n Namespace n Imports m Class c End Class End Namespace .Value) End Sub Public Sub TestAsPublicInterfaceImplementation() VerifySyntax(Of MethodBlockBaseSyntax)( g.AsPublicInterfaceImplementation( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract), g.IdentifierName("i")), Public Function m() As t Implements i.m End Function.Value) VerifySyntax(Of PropertyBlockSyntax)( g.AsPublicInterfaceImplementation( g.PropertyDeclaration("p", g.IdentifierName("t"), accessibility:=Accessibility.Private, modifiers:=DeclarationModifiers.Abstract), g.IdentifierName("i")), Public Property p As t Implements i.p Get End Get Set(value As t) End Set End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.AsPublicInterfaceImplementation( g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("a"))}, g.IdentifierName("t"), Accessibility.Internal, DeclarationModifiers.Abstract), g.IdentifierName("i")), Default Public Property Item(p As a) As t Implements i.Item Get End Get Set(value As t) End Set End Property.Value) End Sub Public Sub TestAsPrivateInterfaceImplementation() VerifySyntax(Of MethodBlockBaseSyntax)( g.AsPrivateInterfaceImplementation( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), accessibility:=Accessibility.Private, modifiers:=DeclarationModifiers.Abstract), g.IdentifierName("i")), Private Function i_m() As t Implements i.m End Function.Value) VerifySyntax(Of MethodBlockBaseSyntax)( g.AsPrivateInterfaceImplementation( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), accessibility:=Accessibility.Private, modifiers:=DeclarationModifiers.Abstract), g.TypeExpression(Me.ienumerableInt)), Private Function IEnumerable_Int32_m() As t Implements Global.System.Collections.Generic.IEnumerable(Of System.Int32).m End Function.Value) VerifySyntax(Of PropertyBlockSyntax)( g.AsPrivateInterfaceImplementation( g.PropertyDeclaration("p", g.IdentifierName("t"), accessibility:=Accessibility.Internal, modifiers:=DeclarationModifiers.Abstract), g.IdentifierName("i")), Private Property i_p As t Implements i.p Get End Get Set(value As t) End Set End Property.Value) VerifySyntax(Of PropertyBlockSyntax)( g.AsPrivateInterfaceImplementation( g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("a"))}, g.IdentifierName("t"), Accessibility.Protected, DeclarationModifiers.Abstract), g.IdentifierName("i")), Private Property i_Item(p As a) As t Implements i.Item Get End Get Set(value As t) End Set End Property.Value) End Sub Public Sub TestWithTypeParameters() VerifySyntax(Of MethodStatementSyntax)( g.WithTypeParameters( g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), MustInherit Sub m(Of a)().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeParameters( g.MethodDeclaration("m", modifiers:=DeclarationModifiers.None), "a"), Sub m(Of a)() End Sub.Value) ' assigning no type parameters is legal VerifySyntax(Of MethodStatementSyntax)( g.WithTypeParameters( g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract)), MustInherit Sub m().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeParameters( g.MethodDeclaration("m", modifiers:=DeclarationModifiers.None)), Sub m() End Sub.Value) ' removing type parameters VerifySyntax(Of MethodStatementSyntax)( g.WithTypeParameters(g.WithTypeParameters( g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a")), MustInherit Sub m().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeParameters(g.WithTypeParameters( g.MethodDeclaration("m"), "a")), Sub m() End Sub.Value) ' multiple type parameters VerifySyntax(Of MethodStatementSyntax)( g.WithTypeParameters( g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a", "b"), MustInherit Sub m(Of a, b)().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeParameters( g.MethodDeclaration("m"), "a", "b"), Sub m(Of a, b)() End Sub.Value) VerifySyntax(Of ClassBlockSyntax)( g.WithTypeParameters( g.ClassDeclaration("c"), "a", "b"), Class c(Of a, b) End Class.Value) VerifySyntax(Of StructureBlockSyntax)( g.WithTypeParameters( g.StructDeclaration("s"), "a", "b"), Structure s(Of a, b) End Structure.Value) VerifySyntax(Of InterfaceBlockSyntax)( g.WithTypeParameters( g.InterfaceDeclaration("i"), "a", "b"), Interface i(Of a, b) End Interface.Value) End Sub Public Sub TestWithTypeConstraint() ' single type constraint VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", g.IdentifierName("b")), MustInherit Sub m(Of a As b)().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m"), "a"), "a", g.IdentifierName("b")), Sub m(Of a As b)() End Sub.Value) ' multiple type constraints VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", g.IdentifierName("b"), g.IdentifierName("c")), MustInherit Sub m(Of a As {b, c})().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m"), "a"), "a", g.IdentifierName("b"), g.IdentifierName("c")), Sub m(Of a As {b, c})() End Sub.Value) ' no type constraints VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a"), MustInherit Sub m(Of a)().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m"), "a"), "a"), Sub m(Of a)() End Sub.Value) ' removed type constraints VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint(g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", g.IdentifierName("b"), g.IdentifierName("c")), "a"), MustInherit Sub m(Of a)().Value) VerifySyntax(Of MethodBlockSyntax)( g.WithTypeConstraint(g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m"), "a"), "a", g.IdentifierName("b"), g.IdentifierName("c")), "a"), Sub m(Of a)() End Sub.Value) ' multipe type parameters with constraints VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a", "x"), "a", g.IdentifierName("b"), g.IdentifierName("c")), "x", g.IdentifierName("y")), MustInherit Sub m(Of a As {b, c}, x As y)().Value) ' with constructor constraint VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", SpecialTypeConstraintKind.Constructor), MustInherit Sub m(Of a As New)().Value) ' with reference constraint VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", SpecialTypeConstraintKind.ReferenceType), MustInherit Sub m(Of a As Class)().Value) ' with value type constraint VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", SpecialTypeConstraintKind.ValueType), MustInherit Sub m(Of a As Structure)().Value) ' with reference constraint and constructor constraint VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", SpecialTypeConstraintKind.ReferenceType Or SpecialTypeConstraintKind.Constructor), MustInherit Sub m(Of a As {Class, New})().Value) ' with value type constraint and constructor constraint VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", SpecialTypeConstraintKind.ValueType Or SpecialTypeConstraintKind.Constructor), MustInherit Sub m(Of a As {Structure, New})().Value) ' with reference constraint and type constraints VerifySyntax(Of MethodStatementSyntax)( g.WithTypeConstraint( g.WithTypeParameters(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), "a"), "a", SpecialTypeConstraintKind.ReferenceType, g.IdentifierName("b"), g.IdentifierName("c")), MustInherit Sub m(Of a As {Class, b, c})().Value) ' class declarations VerifySyntax(Of ClassBlockSyntax)( g.WithTypeConstraint( g.WithTypeParameters( g.ClassDeclaration("c"), "a", "b"), "a", g.IdentifierName("x")), Class c(Of a As x, b) End Class.Value) ' structure declarations VerifySyntax(Of StructureBlockSyntax)( g.WithTypeConstraint( g.WithTypeParameters( g.StructDeclaration("s"), "a", "b"), "a", g.IdentifierName("x")), Structure s(Of a As x, b) End Structure.Value) ' interface delcarations VerifySyntax(Of InterfaceBlockSyntax)( g.WithTypeConstraint( g.WithTypeParameters( g.InterfaceDeclaration("i"), "a", "b"), "a", g.IdentifierName("x")), Interface i(Of a As x, b) End Interface.Value) End Sub Public Sub TestAttributeDeclarations() VerifySyntax(Of AttributeListSyntax)( g.Attribute(g.IdentifierName("a")), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a"), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a.b"), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a", {}), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a", {g.IdentifierName("x")}), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a", {g.AttributeArgument(g.IdentifierName("x"))}), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a", {g.AttributeArgument("x", g.IdentifierName("y"))}), "") VerifySyntax(Of AttributeListSyntax)( g.Attribute("a", {g.IdentifierName("x"), g.IdentifierName("y")}), "") End Sub Public Sub TestAddAttributes() VerifySyntax(Of FieldDeclarationSyntax)( g.AddAttributes( g.FieldDeclaration("y", g.IdentifierName("x")), g.Attribute("a")), <a> Dim y As x.Value) VerifySyntax(Of FieldDeclarationSyntax)( g.AddAttributes( g.AddAttributes( g.FieldDeclaration("y", g.IdentifierName("x")), g.Attribute("a")), g.Attribute("b")), <a> <b> Dim y As x.Value) VerifySyntax(Of MethodStatementSyntax)( g.AddAttributes( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract), g.Attribute("a")), <a> MustInherit Function m() As t.Value) VerifySyntax(Of MethodStatementSyntax)( g.AddReturnAttributes( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract), g.Attribute("a")), MustInherit Function m() As <a> t.Value) VerifySyntax(Of MethodBlockSyntax)( g.AddAttributes( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), modifiers:=DeclarationModifiers.None), g.Attribute("a")), <a> Function m() As t End Function.Value) VerifySyntax(Of MethodBlockSyntax)( g.AddReturnAttributes( g.MethodDeclaration("m", returnType:=g.IdentifierName("t"), modifiers:=DeclarationModifiers.None), g.Attribute("a")), Function m() As <a> t End Function.Value) VerifySyntax(Of PropertyStatementSyntax)( g.AddAttributes( g.PropertyDeclaration("p", g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract), g.Attribute("a")), <a> MustInherit Property p As x.Value) VerifySyntax(Of PropertyBlockSyntax)( g.AddAttributes( g.PropertyDeclaration("p", g.IdentifierName("x")), g.Attribute("a")), <a> Property p As x Get End Get Set(value As x) End Set End Property.Value) VerifySyntax(Of PropertyStatementSyntax)( g.AddAttributes( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract), g.Attribute("a")), <a> Default MustInherit Property Item(z As y) As x.Value) VerifySyntax(Of PropertyBlockSyntax)( g.AddAttributes( g.IndexerDeclaration({g.ParameterDeclaration("z", g.IdentifierName("y"))}, g.IdentifierName("x")), g.Attribute("a")), <a> Default Property Item(z As y) As x Get End Get Set(value As x) End Set End Property.Value) VerifySyntax(Of ClassBlockSyntax)( g.AddAttributes( g.ClassDeclaration("c"), g.Attribute("a")), <a> Class c End Class.Value) VerifySyntax(Of ParameterSyntax)( g.AddAttributes( g.ParameterDeclaration("p", g.IdentifierName("t")), g.Attribute("a")), <a> p As t.Value) VerifySyntax(Of CompilationUnitSyntax)( g.AddAttributes( g.CompilationUnit(g.NamespaceDeclaration("n")), g.Attribute("a")), <Assembly:a> Namespace n End Namespace .Value) VerifySyntax(Of DelegateStatementSyntax)( g.AddAttributes( g.DelegateDeclaration("d"), g.Attribute("a")), <a> Delegate Sub d().Value) End Sub Public Sub TestAddRemoveAttributesPreservesTrivia() Dim cls = ParseCompilationUnit( ' comment Class C End Class ' end.Value).Members(0) Dim added = g.AddAttributes(cls, g.Attribute("a")) VerifySyntax(Of ClassBlockSyntax)( added, ' comment <a> Class C End Class ' end.Value) Dim removed = g.RemoveAllAttributes(added) VerifySyntax(Of ClassBlockSyntax)( removed, ' comment Class C End Class ' end.Value) Dim attrWithComment = g.GetAttributes(added).First() VerifySyntax(Of AttributeListSyntax)( attrWithComment, ' comment <a> .Value) ' added attributes are stripped of trivia Dim added2 = g.AddAttributes(cls, attrWithComment) VerifySyntax(Of ClassBlockSyntax)( added2, ' comment <a> Class C End Class ' end.Value) End Sub Public Sub TestDeclarationKind() Assert.Equal(DeclarationKind.CompilationUnit, g.GetDeclarationKind(g.CompilationUnit())) Assert.Equal(DeclarationKind.Class, g.GetDeclarationKind(g.ClassDeclaration("c"))) Assert.Equal(DeclarationKind.Struct, g.GetDeclarationKind(g.StructDeclaration("s"))) Assert.Equal(DeclarationKind.Interface, g.GetDeclarationKind(g.InterfaceDeclaration("i"))) Assert.Equal(DeclarationKind.Enum, g.GetDeclarationKind(g.EnumDeclaration("e"))) Assert.Equal(DeclarationKind.Delegate, g.GetDeclarationKind(g.DelegateDeclaration("d"))) Assert.Equal(DeclarationKind.Method, g.GetDeclarationKind(g.MethodDeclaration("m"))) Assert.Equal(DeclarationKind.Method, g.GetDeclarationKind(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract))) Assert.Equal(DeclarationKind.Constructor, g.GetDeclarationKind(g.ConstructorDeclaration())) Assert.Equal(DeclarationKind.Parameter, g.GetDeclarationKind(g.ParameterDeclaration("p"))) Assert.Equal(DeclarationKind.Property, g.GetDeclarationKind(g.PropertyDeclaration("p", g.IdentifierName("t")))) Assert.Equal(DeclarationKind.Property, g.GetDeclarationKind(g.PropertyDeclaration("p", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract))) Assert.Equal(DeclarationKind.Indexer, g.GetDeclarationKind(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t")))) Assert.Equal(DeclarationKind.Indexer, g.GetDeclarationKind(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract))) Assert.Equal(DeclarationKind.Field, g.GetDeclarationKind(g.FieldDeclaration("f", g.IdentifierName("t")))) Assert.Equal(DeclarationKind.EnumMember, g.GetDeclarationKind(g.EnumMember("v"))) Assert.Equal(DeclarationKind.Event, g.GetDeclarationKind(g.EventDeclaration("e", g.IdentifierName("t")))) Assert.Equal(DeclarationKind.CustomEvent, g.GetDeclarationKind(g.CustomEventDeclaration("ce", g.IdentifierName("t")))) Assert.Equal(DeclarationKind.Namespace, g.GetDeclarationKind(g.NamespaceDeclaration("n"))) Assert.Equal(DeclarationKind.NamespaceImport, g.GetDeclarationKind(g.NamespaceImportDeclaration("u"))) Assert.Equal(DeclarationKind.LocalVariable, g.GetDeclarationKind(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"))) Assert.Equal(DeclarationKind.Attribute, g.GetDeclarationKind(g.Attribute("a"))) End Sub Public Sub TestGetName() Assert.Equal("c", g.GetName(g.ClassDeclaration("c"))) Assert.Equal("s", g.GetName(g.StructDeclaration("s"))) Assert.Equal("i", g.GetName(g.EnumDeclaration("i"))) Assert.Equal("e", g.GetName(g.EnumDeclaration("e"))) Assert.Equal("d", g.GetName(g.DelegateDeclaration("d"))) Assert.Equal("m", g.GetName(g.MethodDeclaration("m"))) Assert.Equal("m", g.GetName(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract))) Assert.Equal("", g.GetName(g.ConstructorDeclaration())) Assert.Equal("p", g.GetName(g.ParameterDeclaration("p"))) Assert.Equal("p", g.GetName(g.PropertyDeclaration("p", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract))) Assert.Equal("p", g.GetName(g.PropertyDeclaration("p", g.IdentifierName("t")))) Assert.Equal("", g.GetName(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t")))) Assert.Equal("", g.GetName(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract))) Assert.Equal("f", g.GetName(g.FieldDeclaration("f", g.IdentifierName("t")))) Assert.Equal("v", g.GetName(g.EnumMember("v"))) Assert.Equal("ef", g.GetName(g.EventDeclaration("ef", g.IdentifierName("t")))) Assert.Equal("ep", g.GetName(g.CustomEventDeclaration("ep", g.IdentifierName("t")))) Assert.Equal("n", g.GetName(g.NamespaceDeclaration("n"))) Assert.Equal("u", g.GetName(g.NamespaceImportDeclaration("u"))) Assert.Equal("loc", g.GetName(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"))) Assert.Equal("a", g.GetName(g.Attribute("a"))) End Sub Public Sub TestWithName() Assert.Equal("c", g.GetName(g.WithName(g.ClassDeclaration("x"), "c"))) Assert.Equal("s", g.GetName(g.WithName(g.StructDeclaration("x"), "s"))) Assert.Equal("i", g.GetName(g.WithName(g.EnumDeclaration("x"), "i"))) Assert.Equal("e", g.GetName(g.WithName(g.EnumDeclaration("x"), "e"))) Assert.Equal("d", g.GetName(g.WithName(g.DelegateDeclaration("x"), "d"))) Assert.Equal("m", g.GetName(g.WithName(g.MethodDeclaration("x"), "m"))) Assert.Equal("m", g.GetName(g.WithName(g.MethodDeclaration("x", modifiers:=DeclarationModifiers.Abstract), "m"))) Assert.Equal("", g.GetName(g.WithName(g.ConstructorDeclaration(), ".ctor"))) Assert.Equal("p", g.GetName(g.WithName(g.ParameterDeclaration("x"), "p"))) Assert.Equal("p", g.GetName(g.WithName(g.PropertyDeclaration("x", g.IdentifierName("t")), "p"))) Assert.Equal("p", g.GetName(g.WithName(g.PropertyDeclaration("x", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract), "p"))) Assert.Equal("", g.GetName(g.WithName(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t")), "this"))) Assert.Equal("", g.GetName(g.WithName(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract), "this"))) Assert.Equal("f", g.GetName(g.WithName(g.FieldDeclaration("x", g.IdentifierName("t")), "f"))) Assert.Equal("v", g.GetName(g.WithName(g.EnumMember("x"), "v"))) Assert.Equal("ef", g.GetName(g.WithName(g.EventDeclaration("x", g.IdentifierName("t")), "ef"))) Assert.Equal("ep", g.GetName(g.WithName(g.CustomEventDeclaration("x", g.IdentifierName("t")), "ep"))) Assert.Equal("n", g.GetName(g.WithName(g.NamespaceDeclaration("x"), "n"))) Assert.Equal("u", g.GetName(g.WithName(g.NamespaceImportDeclaration("x"), "u"))) Assert.Equal("loc", g.GetName(g.WithName(g.LocalDeclarationStatement(g.IdentifierName("t"), "x"), "loc"))) Assert.Equal("a", g.GetName(g.WithName(g.Attribute("x"), "a"))) End Sub Public Sub TestGetAccessibility() Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.ClassDeclaration("c", accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.StructDeclaration("s", accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.EnumDeclaration("i", accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.EnumDeclaration("e", accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.DelegateDeclaration("d", accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.MethodDeclaration("m", accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.ConstructorDeclaration(accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.ParameterDeclaration("p"))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.PropertyDeclaration("p", g.IdentifierName("t"), accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t"), accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.FieldDeclaration("f", g.IdentifierName("t"), accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.EnumMember("v"))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.EventDeclaration("ef", g.IdentifierName("t"), accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.Internal, g.GetAccessibility(g.CustomEventDeclaration("ep", g.IdentifierName("t"), accessibility:=Accessibility.Internal))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.NamespaceDeclaration("n"))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.NamespaceImportDeclaration("u"))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.Attribute("a"))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(SyntaxFactory.TypeParameter("tp"))) End Sub Public Sub TestWithAccessibility() Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.ClassDeclaration("c", accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.StructDeclaration("s", accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.EnumDeclaration("i", accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.EnumDeclaration("e", accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.DelegateDeclaration("d", accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.MethodDeclaration("m", accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.ConstructorDeclaration(accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(g.ParameterDeclaration("p"), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.PropertyDeclaration("p", g.IdentifierName("t"), accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t"), accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.FieldDeclaration("f", g.IdentifierName("t"), accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(g.EnumMember("v"), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.EventDeclaration("ef", g.IdentifierName("t"), accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.Private, g.GetAccessibility(g.WithAccessibility(g.CustomEventDeclaration("ep", g.IdentifierName("t"), accessibility:=Accessibility.Internal), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(g.NamespaceDeclaration("n"), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(g.NamespaceImportDeclaration("u"), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(g.Attribute("a"), Accessibility.Private))) Assert.Equal(Accessibility.NotApplicable, g.GetAccessibility(g.WithAccessibility(SyntaxFactory.TypeParameter("tp"), Accessibility.Private))) End Sub Public Sub TestGetModifiers() Assert.Equal(DeclarationModifiers.Abstract, g.GetModifiers(g.ClassDeclaration("c", modifiers:=DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Partial, g.GetModifiers(g.StructDeclaration("s", modifiers:=DeclarationModifiers.Partial))) Assert.Equal(DeclarationModifiers.[New], g.GetModifiers(g.EnumDeclaration("e", modifiers:=DeclarationModifiers.[New]))) Assert.Equal(DeclarationModifiers.[New], g.GetModifiers(g.DelegateDeclaration("d", modifiers:=DeclarationModifiers.[New]))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.ConstructorDeclaration(modifiers:=DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.ParameterDeclaration("p"))) Assert.Equal(DeclarationModifiers.Abstract, g.GetModifiers(g.PropertyDeclaration("p", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Abstract, g.GetModifiers(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t"), modifiers:=DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Const, g.GetModifiers(g.FieldDeclaration("f", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Const))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.EventDeclaration("ef", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.CustomEventDeclaration("ep", g.IdentifierName("t"), modifiers:=DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.EnumMember("v"))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.NamespaceDeclaration("n"))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.NamespaceImportDeclaration("u"))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.Attribute("a"))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(SyntaxFactory.TypeParameter("tp"))) End Sub Public Sub TestWithModifiers() Assert.Equal(DeclarationModifiers.Abstract, g.GetModifiers(g.WithModifiers(g.ClassDeclaration("c"), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Partial, g.GetModifiers(g.WithModifiers(g.StructDeclaration("s"), DeclarationModifiers.Partial))) Assert.Equal(DeclarationModifiers.[New], g.GetModifiers(g.WithModifiers(g.EnumDeclaration("e"), DeclarationModifiers.[New]))) Assert.Equal(DeclarationModifiers.[New], g.GetModifiers(g.WithModifiers(g.DelegateDeclaration("d"), DeclarationModifiers.[New]))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.WithModifiers(g.MethodDeclaration("m"), DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.WithModifiers(g.ConstructorDeclaration(), DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(g.ParameterDeclaration("p"), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Abstract, g.GetModifiers(g.WithModifiers(g.PropertyDeclaration("p", g.IdentifierName("t")), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Abstract, g.GetModifiers(g.WithModifiers(g.IndexerDeclaration({g.ParameterDeclaration("i")}, g.IdentifierName("t")), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.Const, g.GetModifiers(g.WithModifiers(g.FieldDeclaration("f", g.IdentifierName("t")), DeclarationModifiers.Const))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.WithModifiers(g.EventDeclaration("ef", g.IdentifierName("t")), DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.Static, g.GetModifiers(g.WithModifiers(g.CustomEventDeclaration("ep", g.IdentifierName("t")), DeclarationModifiers.Static))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(g.EnumMember("v"), DeclarationModifiers.Partial))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(g.NamespaceDeclaration("n"), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(g.NamespaceImportDeclaration("u"), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(g.Attribute("a"), DeclarationModifiers.Abstract))) Assert.Equal(DeclarationModifiers.None, g.GetModifiers(g.WithModifiers(SyntaxFactory.TypeParameter("tp"), DeclarationModifiers.Abstract))) End Sub Public Sub TestGetType() Assert.Equal("t", g.GetType(g.MethodDeclaration("m", returnType:=g.IdentifierName("t"))).ToString()) Assert.Null(g.GetType(g.MethodDeclaration("m"))) Assert.Equal("t", g.GetType(g.FieldDeclaration("f", g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.PropertyDeclaration("p", g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("pt"))}, g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.ParameterDeclaration("p", g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.EventDeclaration("ef", g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.CustomEventDeclaration("ep", g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.DelegateDeclaration("t", returnType:=g.IdentifierName("t"))).ToString()) Assert.Null(g.GetType(g.DelegateDeclaration("d"))) Assert.Equal("t", g.GetType(g.LocalDeclarationStatement(g.IdentifierName("t"), "v")).ToString()) Assert.Null(g.GetType(g.ClassDeclaration("c"))) Assert.Null(g.GetType(g.IdentifierName("x"))) End Sub Public Sub TestWithType() Assert.Equal("t", g.GetType(g.WithType(g.MethodDeclaration("m", returnType:=g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.MethodDeclaration("m"), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.FieldDeclaration("f", g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.PropertyDeclaration("p", g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("pt"))}, g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.ParameterDeclaration("p", g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.DelegateDeclaration("t", returnType:=g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.DelegateDeclaration("t"), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.EventDeclaration("ef", g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.CustomEventDeclaration("ep", g.IdentifierName("x")), g.IdentifierName("t"))).ToString()) Assert.Equal("t", g.GetType(g.WithType(g.LocalDeclarationStatement(g.IdentifierName("x"), "v"), g.IdentifierName("t"))).ToString()) Assert.Null(g.GetType(g.WithType(g.ClassDeclaration("c"), g.IdentifierName("t")))) Assert.Null(g.GetType(g.WithType(g.IdentifierName("x"), g.IdentifierName("t")))) End Sub Public Sub TestWithTypeChangesSubFunction() VerifySyntax(Of MethodBlockSyntax)( g.WithType(g.MethodDeclaration("m", returnType:=g.IdentifierName("x")), Nothing), Sub m() End Sub.Value) VerifySyntax(Of MethodBlockSyntax)( g.WithType(g.MethodDeclaration("m"), g.IdentifierName("x")), Function m() As x End Function.Value) VerifySyntax(Of MethodStatementSyntax)( g.WithType(g.MethodDeclaration("m", returnType:=g.IdentifierName("x"), modifiers:=DeclarationModifiers.Abstract), Nothing), MustInherit Sub m().Value) VerifySyntax(Of MethodStatementSyntax)( g.WithType(g.MethodDeclaration("m", modifiers:=DeclarationModifiers.Abstract), g.IdentifierName("x")), MustInherit Function m() As x.Value) VerifySyntax(Of DelegateStatementSyntax)( g.WithType(g.DelegateDeclaration("d", returnType:=g.IdentifierName("x")), Nothing), Delegate Sub d().Value) VerifySyntax(Of DelegateStatementSyntax)( g.WithType(g.DelegateDeclaration("d"), g.IdentifierName("x")), Delegate Function d() As x.Value) End Sub Public Sub TestGetParameters() Assert.Equal(0, g.GetParameters(g.MethodDeclaration("m")).Count) Assert.Equal(1, g.GetParameters(g.MethodDeclaration("m", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(2, g.GetParameters(g.MethodDeclaration("m", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t")), g.ParameterDeclaration("p2", g.IdentifierName("t2"))})).Count) Assert.Equal(0, g.GetParameters(g.ConstructorDeclaration()).Count) Assert.Equal(1, g.GetParameters(g.ConstructorDeclaration(parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(2, g.GetParameters(g.ConstructorDeclaration(parameters:={g.ParameterDeclaration("p", g.IdentifierName("t")), g.ParameterDeclaration("p2", g.IdentifierName("t2"))})).Count) Assert.Equal(0, g.GetParameters(g.PropertyDeclaration("p", g.IdentifierName("t"))).Count) Assert.Equal(1, g.GetParameters(g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("t"))}, g.IdentifierName("t"))).Count) Assert.Equal(2, g.GetParameters(g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("t")), g.ParameterDeclaration("p2", g.IdentifierName("t2"))}, g.IdentifierName("t"))).Count) Assert.Equal(0, g.GetParameters(g.ValueReturningLambdaExpression(g.IdentifierName("expr"))).Count) Assert.Equal(1, g.GetParameters(g.ValueReturningLambdaExpression("p1", g.IdentifierName("expr"))).Count) Assert.Equal(0, g.GetParameters(g.VoidReturningLambdaExpression(g.IdentifierName("expr"))).Count) Assert.Equal(1, g.GetParameters(g.VoidReturningLambdaExpression("p1", g.IdentifierName("expr"))).Count) Assert.Equal(0, g.GetParameters(g.DelegateDeclaration("d")).Count) Assert.Equal(1, g.GetParameters(g.DelegateDeclaration("d", parameters:={g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(0, g.GetParameters(g.ClassDeclaration("c")).Count) Assert.Equal(0, g.GetParameters(g.IdentifierName("x")).Count) End Sub Public Sub TestAddParameters() Assert.Equal(1, g.GetParameters(g.AddParameters(g.MethodDeclaration("m"), {g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(1, g.GetParameters(g.AddParameters(g.ConstructorDeclaration(), {g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(3, g.GetParameters(g.AddParameters(g.IndexerDeclaration({g.ParameterDeclaration("p", g.IdentifierName("t"))}, g.IdentifierName("t")), {g.ParameterDeclaration("p2", g.IdentifierName("t2")), g.ParameterDeclaration("p3", g.IdentifierName("t3"))})).Count) Assert.Equal(1, g.GetParameters(g.AddParameters(g.ValueReturningLambdaExpression(g.IdentifierName("expr")), {g.LambdaParameter("p")})).Count) Assert.Equal(1, g.GetParameters(g.AddParameters(g.VoidReturningLambdaExpression(g.IdentifierName("expr")), {g.LambdaParameter("p")})).Count) Assert.Equal(1, g.GetParameters(g.AddParameters(g.DelegateDeclaration("d"), {g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(0, g.GetParameters(g.AddParameters(g.ClassDeclaration("c"), {g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(0, g.GetParameters(g.AddParameters(g.IdentifierName("x"), {g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) Assert.Equal(0, g.GetParameters(g.AddParameters(g.PropertyDeclaration("p", g.IdentifierName("t")), {g.ParameterDeclaration("p", g.IdentifierName("t"))})).Count) End Sub Public Sub TestGetExpression() ' initializers Assert.Equal("x", g.GetExpression(g.FieldDeclaration("f", g.IdentifierName("t"), initializer:=g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.ParameterDeclaration("p", g.IdentifierName("t"), initializer:=g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.LocalDeclarationStatement("loc", initializer:=g.IdentifierName("x"))).ToString()) ' lambda bodies Assert.Null(g.GetExpression(g.ValueReturningLambdaExpression("p", {g.IdentifierName("x")}))) Assert.Equal(1, g.GetStatements(g.ValueReturningLambdaExpression("p", {g.IdentifierName("x")})).Count) Assert.Equal("x", g.GetExpression(g.ValueReturningLambdaExpression(g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.VoidReturningLambdaExpression(g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.ValueReturningLambdaExpression("p", g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.VoidReturningLambdaExpression("p", g.IdentifierName("x"))).ToString()) Assert.Null(g.GetExpression(g.IdentifierName("e"))) End Sub Public Sub TestWithExpression() ' initializers Assert.Equal("x", g.GetExpression(g.WithExpression(g.FieldDeclaration("f", g.IdentifierName("t")), g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.WithExpression(g.ParameterDeclaration("p", g.IdentifierName("t")), g.IdentifierName("x"))).ToString()) Assert.Equal("x", g.GetExpression(g.WithExpression(g.LocalDeclarationStatement(g.IdentifierName("t"), "loc"), g.IdentifierName("x"))).ToString()) ' lambda bodies Assert.Equal("y", g.GetExpression(g.WithExpression(g.ValueReturningLambdaExpression("p", {g.IdentifierName("x")}), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.VoidReturningLambdaExpression("p", {g.IdentifierName("x")}), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.ValueReturningLambdaExpression({g.IdentifierName("x")}), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.VoidReturningLambdaExpression({g.IdentifierName("x")}), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.ValueReturningLambdaExpression("p", g.IdentifierName("x")), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.VoidReturningLambdaExpression("p", g.IdentifierName("x")), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.ValueReturningLambdaExpression(g.IdentifierName("x")), g.IdentifierName("y"))).ToString()) Assert.Equal("y", g.GetExpression(g.WithExpression(g.VoidReturningLambdaExpression(g.IdentifierName("x")), g.IdentifierName("y"))).ToString()) VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.WithExpression(g.ValueReturningLambdaExpression({g.IdentifierName("s")}), g.IdentifierName("e")), Function() e.Value) Assert.Null(g.GetExpression(g.WithExpression(g.IdentifierName("e"), g.IdentifierName("x")))) End Sub Public Sub TestWithExpression_LambdaChanges() ' multi line function changes to single line function VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.WithExpression(g.ValueReturningLambdaExpression({g.IdentifierName("s")}), g.IdentifierName("e")), Function() e.Value) ' multi line sub changes to single line sub VerifySyntax(Of SingleLineLambdaExpressionSyntax)( g.WithExpression(g.VoidReturningLambdaExpression({g.IdentifierName("s")}), g.IdentifierName("e")), Sub() e.Value) ' single line function changes to multi-line function with null expression VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithExpression(g.ValueReturningLambdaExpression(g.IdentifierName("e")), Nothing), Function() End Function.Value) ' single line sub changes to multi line sub with null expression VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithExpression(g.VoidReturningLambdaExpression(g.IdentifierName("e")), Nothing), Sub() End Sub.Value) ' multi line function no-op when assigned null expression VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithExpression(g.ValueReturningLambdaExpression({g.IdentifierName("s")}), Nothing), Function() s End Function.Value) ' multi line sub no-op when assigned null expression VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithExpression(g.VoidReturningLambdaExpression({g.IdentifierName("s")}), Nothing), Sub() s End Sub.Value) Assert.Null(g.GetExpression(g.WithExpression(g.IdentifierName("e"), g.IdentifierName("x")))) End Sub Public Sub TestGetStatements() Dim stmts = {g.ExpressionStatement(g.AssignmentStatement(g.IdentifierName("x"), g.IdentifierName("y"))), g.ExpressionStatement(g.InvocationExpression(g.IdentifierName("fn"), g.IdentifierName("arg")))} Assert.Equal(0, g.GetStatements(g.MethodDeclaration("m")).Count) Assert.Equal(2, g.GetStatements(g.MethodDeclaration("m", statements:=stmts)).Count) Assert.Equal(0, g.GetStatements(g.ConstructorDeclaration()).Count) Assert.Equal(2, g.GetStatements(g.ConstructorDeclaration(statements:=stmts)).Count) Assert.Equal(0, g.GetStatements(g.VoidReturningLambdaExpression(g.IdentifierName("e"))).Count) Assert.Equal(0, g.GetStatements(g.VoidReturningLambdaExpression({})).Count) Assert.Equal(2, g.GetStatements(g.VoidReturningLambdaExpression(stmts)).Count) Assert.Equal(0, g.GetStatements(g.ValueReturningLambdaExpression(g.IdentifierName("e"))).Count) Assert.Equal(0, g.GetStatements(g.ValueReturningLambdaExpression({})).Count) Assert.Equal(2, g.GetStatements(g.ValueReturningLambdaExpression(stmts)).Count) Assert.Equal(0, g.GetStatements(g.IdentifierName("x")).Count) End Sub Public Sub TestWithStatements() Dim stmts = {g.ExpressionStatement(g.AssignmentStatement(g.IdentifierName("x"), g.IdentifierName("y"))), g.ExpressionStatement(g.InvocationExpression(g.IdentifierName("fn"), g.IdentifierName("arg")))} Assert.Equal(2, g.GetStatements(g.WithStatements(g.MethodDeclaration("m"), stmts)).Count) Assert.Equal(2, g.GetStatements(g.WithStatements(g.ConstructorDeclaration(), stmts)).Count) Assert.Equal(2, g.GetStatements(g.WithStatements(g.VoidReturningLambdaExpression({}), stmts)).Count) Assert.Equal(2, g.GetStatements(g.WithStatements(g.ValueReturningLambdaExpression({}), stmts)).Count) Assert.Equal(2, g.GetStatements(g.WithStatements(g.VoidReturningLambdaExpression(g.IdentifierName("e")), stmts)).Count) Assert.Equal(2, g.GetStatements(g.WithStatements(g.ValueReturningLambdaExpression(g.IdentifierName("e")), stmts)).Count) Assert.Equal(0, g.GetStatements(g.WithStatements(g.IdentifierName("x"), stmts)).Count) End Sub Public Sub TestWithStatements_LambdaChanges() Dim stmts = {g.ExpressionStatement(g.IdentifierName("x")), g.ExpressionStatement(g.IdentifierName("y"))} VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.VoidReturningLambdaExpression({}), stmts), Sub() x y End Sub.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.ValueReturningLambdaExpression({}), stmts), Function() x y End Function.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.VoidReturningLambdaExpression(g.IdentifierName("e")), stmts), Sub() x y End Sub.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.ValueReturningLambdaExpression(g.IdentifierName("e")), stmts), Function() x y End Function.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.VoidReturningLambdaExpression(stmts), {}), Sub() End Sub.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.ValueReturningLambdaExpression(stmts), {}), Function() End Function.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.VoidReturningLambdaExpression(g.IdentifierName("e")), {}), Sub() End Sub.Value) VerifySyntax(Of MultiLineLambdaExpressionSyntax)( g.WithStatements(g.ValueReturningLambdaExpression(g.IdentifierName("e")), {}), Function() End Function.Value) End Sub Public Sub TestGetAccessorStatements() Dim stmts = {g.ExpressionStatement(g.AssignmentStatement(g.IdentifierName("x"), g.IdentifierName("y"))), g.ExpressionStatement(g.InvocationExpression(g.IdentifierName("fn"), g.IdentifierName("arg")))} Dim p = g.ParameterDeclaration("p", g.IdentifierName("t")) ' get-accessor Assert.Equal(0, g.GetGetAccessorStatements(g.PropertyDeclaration("p", g.IdentifierName("t"))).Count) Assert.Equal(2, g.GetGetAccessorStatements(g.PropertyDeclaration("p", g.IdentifierName("t"), getAccessorStatements:=stmts)).Count) Assert.Equal(0, g.GetGetAccessorStatements(g.IndexerDeclaration({p}, g.IdentifierName("t"))).Count) Assert.Equal(2, g.GetGetAccessorStatements(g.IndexerDeclaration({p}, g.IdentifierName("t"), getAccessorStatements:=stmts)).Count) Assert.Equal(0, g.GetGetAccessorStatements(g.IdentifierName("x")).Count) ' set-accessor Assert.Equal(0, g.GetSetAccessorStatements(g.PropertyDeclaration("p", g.IdentifierName("t"))).Count) Assert.Equal(2, g.GetSetAccessorStatements(g.PropertyDeclaration("p", g.IdentifierName("t"), setAccessorStatements:=stmts)).Count) Assert.Equal(0, g.GetSetAccessorStatements(g.IndexerDeclaration({p}, g.IdentifierName("t"))).Count) Assert.Equal(2, g.GetSetAccessorStatements(g.IndexerDeclaration({p}, g.IdentifierName("t"), setAccessorStatements:=stmts)).Count) Assert.Equal(0, g.GetSetAccessorStatements(g.IdentifierName("x")).Count) End Sub Public Sub TestWithAccessorStatements() Dim stmts = {g.ExpressionStatement(g.AssignmentStatement(g.IdentifierName("x"), g.IdentifierName("y"))), g.ExpressionStatement(g.InvocationExpression(g.IdentifierName("fn"), g.IdentifierName("arg")))} Dim p = g.ParameterDeclaration("p", g.IdentifierName("t")) ' get-accessor Assert.Equal(2, g.GetGetAccessorStatements(g.WithGetAccessorStatements(g.PropertyDeclaration("p", g.IdentifierName("t")), stmts)).Count) Assert.Equal(2, g.GetGetAccessorStatements(g.WithGetAccessorStatements(g.IndexerDeclaration({p}, g.IdentifierName("t")), stmts)).Count) Assert.Equal(0, g.GetGetAccessorStatements(g.WithGetAccessorStatements(g.IdentifierName("x"), stmts)).Count) ' set-accessor Assert.Equal(2, g.GetSetAccessorStatements(g.WithSetAccessorStatements(g.PropertyDeclaration("p", g.IdentifierName("t")), stmts)).Count) Assert.Equal(2, g.GetSetAccessorStatements(g.WithSetAccessorStatements(g.IndexerDeclaration({p}, g.IdentifierName("t")), stmts)).Count) Assert.Equal(0, g.GetSetAccessorStatements(g.WithSetAccessorStatements(g.IdentifierName("x"), stmts)).Count) End Sub Private Sub AssertNamesEqual(expectedNames As String(), actualNodes As IReadOnlyList(Of SyntaxNode)) Dim actualNames = actualNodes.Select(Function(n) g.GetName(n)).ToArray() Assert.Equal(expectedNames.Length, actualNames.Length) Dim expected = String.Join(", ", expectedNames) Dim actual = String.Join(", ", actualNames) Assert.Equal(expected, actual) End Sub Private Sub AssertMemberNamesEqual(expectedNames As String(), declaration As SyntaxNode) AssertNamesEqual(expectedNames, g.GetMembers(declaration)) End Sub Private Sub AssertMemberNamesEqual(expectedName As String, declaration As SyntaxNode) AssertMemberNamesEqual({expectedName}, declaration) End Sub Public Sub TestGetMembers() AssertMemberNamesEqual("m", g.ClassDeclaration("c", members:={g.MethodDeclaration("m")})) AssertMemberNamesEqual("m", g.StructDeclaration("s", members:={g.MethodDeclaration("m")})) AssertMemberNamesEqual("m", g.InterfaceDeclaration("i", members:={g.MethodDeclaration("m")})) AssertMemberNamesEqual("v", g.EnumDeclaration("e", members:={g.EnumMember("v")})) AssertMemberNamesEqual("c", g.NamespaceDeclaration("n", declarations:={g.ClassDeclaration("c")})) AssertMemberNamesEqual("c", g.CompilationUnit(declarations:={g.ClassDeclaration("c")})) End Sub Public Sub TestAddMembers() AssertMemberNamesEqual("m", g.AddMembers(g.ClassDeclaration("d"), {g.MethodDeclaration("m")})) AssertMemberNamesEqual("m", g.AddMembers(g.StructDeclaration("s"), {g.MethodDeclaration("m")})) AssertMemberNamesEqual("m", g.AddMembers(g.InterfaceDeclaration("i"), {g.MethodDeclaration("m")})) AssertMemberNamesEqual("v", g.AddMembers(g.EnumDeclaration("e"), {g.EnumMember("v")})) AssertMemberNamesEqual("n2", g.AddMembers(g.NamespaceDeclaration("n"), {g.NamespaceDeclaration("n2")})) AssertMemberNamesEqual("n", g.AddMembers(g.CompilationUnit(), {g.NamespaceDeclaration("n")})) AssertMemberNamesEqual({"m", "m2"}, g.AddMembers(g.ClassDeclaration("d", members:={g.MethodDeclaration("m")}), {g.MethodDeclaration("m2")})) AssertMemberNamesEqual({"m", "m2"}, g.AddMembers(g.StructDeclaration("s", members:={g.MethodDeclaration("m")}), {g.MethodDeclaration("m2")})) AssertMemberNamesEqual({"m", "m2"}, g.AddMembers(g.InterfaceDeclaration("i", members:={g.MethodDeclaration("m")}), {g.MethodDeclaration("m2")})) AssertMemberNamesEqual({"v", "v2"}, g.AddMembers(g.EnumDeclaration("i", members:={g.EnumMember("v")}), {g.EnumMember("v2")})) AssertMemberNamesEqual({"n1", "n2"}, g.AddMembers(g.NamespaceDeclaration("n", {g.NamespaceDeclaration("n1")}), {g.NamespaceDeclaration("n2")})) AssertMemberNamesEqual({"n1", "n2"}, g.AddMembers(g.CompilationUnit(declarations:={g.NamespaceDeclaration("n1")}), {g.NamespaceDeclaration("n2")})) End Sub Public Sub TestRemoveMembers() TestRemoveAllMembers(g.RemoveMembers(g.ClassDeclaration("d", members:={g.MethodDeclaration("m")}))) TestRemoveAllMembers(g.RemoveMembers(g.StructDeclaration("s", members:={g.MethodDeclaration("m")}))) TestRemoveAllMembers(g.RemoveMembers(g.InterfaceDeclaration("i", members:={g.MethodDeclaration("m")}))) TestRemoveAllMembers(g.RemoveMembers(g.EnumDeclaration("i", members:={g.EnumMember("v")}))) TestRemoveAllMembers(g.AddMembers(g.NamespaceDeclaration("n", {g.NamespaceDeclaration("n1")}))) TestRemoveAllMembers(g.AddMembers(g.CompilationUnit(declarations:={g.NamespaceDeclaration("n1")}))) End Sub Private Sub TestRemoveAllMembers(declaration As SyntaxNode) Assert.Equal(0, g.GetMembers(g.RemoveMembers(declaration, g.GetMembers(declaration))).Count) End Sub Private Sub TestRemoveMember(declaration As SyntaxNode, name As String, remainingNames As String()) Dim newDecl = g.RemoveMembers(declaration, g.GetMembers(declaration).First(Function(m) g.GetName(m) = name)) AssertMemberNamesEqual(remainingNames, newDecl) End Sub End Class End Namespace