' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Test.Utilities Namespace Microsoft.CodeAnalysis.VisualBasic.UnitTests Public Class ScriptSemanticsTests Inherits BasicTestBase Public Sub DiagnosticsPass() Dim source0 = " Function F(e As System.Linq.Expressions.Expression(Of System.Func(Of Object))) As Object Return e.Compile()() End Function" Dim c0 = CreateSubmission(source0, {SystemCoreRef}) Dim source1 = " F(Function() Return Nothing End Function) " Dim c1 = CreateSubmission(source1, {SystemCoreRef}, previous:=c0) AssertTheseDiagnostics(c1, BC36675: Statement lambdas cannot be converted to expression trees. F(Function() ~~~~~~~~~~~ ) End Sub Public Sub Errors_01() Dim code = "System.Console.WriteLine(1)" Dim compilationUnit = VisualBasic.SyntaxFactory.ParseCompilationUnit(code, options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) Dim syntaxTree = compilationUnit.SyntaxTree Dim compilation = CreateCompilationWithMscorlib45({syntaxTree}, assemblyName:="Errors_01", options:=TestOptions.ReleaseExe) Dim semanticModel = compilation.GetSemanticModel(syntaxTree, True) Dim node5 As MemberAccessExpressionSyntax = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Null(semanticModel.GetSymbolInfo(node5.Name).Symbol) compilation.AssertTheseDiagnostics( BC30420: 'Sub Main' was not found in 'Errors_01'. BC30001: Statement is not valid in a namespace. System.Console.WriteLine(1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) compilation = CreateCompilationWithMscorlib45({syntaxTree}, options:=TestOptions.ReleaseExe.WithScriptClassName("Script"), assemblyName:="Errors_01") semanticModel = compilation.GetSemanticModel(syntaxTree, True) node5 = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Null(semanticModel.GetSymbolInfo(node5.Name).Symbol) compilation.AssertTheseDiagnostics( BC30420: 'Sub Main' was not found in 'Errors_01'. BC30001: Statement is not valid in a namespace. System.Console.WriteLine(1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) syntaxTree = SyntaxFactory.ParseSyntaxTree(code, options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, options:=TestOptions.ReleaseExe) semanticModel = compilation.GetSemanticModel(syntaxTree, True) node5 = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel.GetSymbolInfo(node5.Name).Symbol.ToTestDisplayString()) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() syntaxTree = SyntaxFactory.ParseSyntaxTree(code, options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, options:=TestOptions.ReleaseExe.WithScriptClassName("Script")) semanticModel = compilation.GetSemanticModel(syntaxTree, True) node5 = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel.GetSymbolInfo(node5.Name).Symbol.ToTestDisplayString()) CompileAndVerify(compilation, expectedOutput:="1").VerifyDiagnostics() syntaxTree = SyntaxFactory.ParseSyntaxTree(code, options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, options:=TestOptions.ReleaseExe.WithScriptClassName("")) semanticModel = compilation.GetSemanticModel(syntaxTree, True) node5 = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel.GetSymbolInfo(node5.Name).Symbol.ToTestDisplayString()) compilation.AssertTheseDiagnostics( BC2014: the value '' is invalid for option 'ScriptClassName' ) syntaxTree = SyntaxFactory.ParseSyntaxTree(code, options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, options:=TestOptions.ReleaseExe.WithScriptClassName(Nothing)) semanticModel = compilation.GetSemanticModel(syntaxTree, True) node5 = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel.GetSymbolInfo(node5.Name).Symbol.ToTestDisplayString()) compilation.AssertTheseDiagnostics( BC2014: the value 'Nothing' is invalid for option 'ScriptClassName' ) syntaxTree = SyntaxFactory.ParseSyntaxTree(code, options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) compilation = CreateCompilationWithMscorlib45AndVBRuntime({syntaxTree}, options:=TestOptions.ReleaseExe.WithScriptClassName("a" + ChrW(0) + "b")) semanticModel = compilation.GetSemanticModel(syntaxTree, True) node5 = ErrorTestsGetNode(syntaxTree) Assert.Equal("WriteLine", node5.Name.ToString()) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel.GetSymbolInfo(node5.Name).Symbol.ToTestDisplayString()) compilation.VerifyDiagnostics( Diagnostic(ERRID.ERR_InvalidSwitchValue).WithArguments("ScriptClassName", "a" + ChrW(0) + "b").WithLocation(1, 1) ) End Sub Public Sub Errors_02() Dim compilationUnit = VisualBasic.SyntaxFactory.ParseCompilationUnit("System.Console.WriteLine(1)", options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) Dim syntaxTree1 = compilationUnit.SyntaxTree Dim syntaxTree2 = SyntaxFactory.ParseSyntaxTree("System.Console.WriteLine(2)", options:=New VisualBasicParseOptions(kind:=SourceCodeKind.Script)) Dim node1 As MemberAccessExpressionSyntax = ErrorTestsGetNode(syntaxTree1) Assert.Equal("WriteLine", node1.Name.ToString()) Dim node2 As MemberAccessExpressionSyntax = ErrorTestsGetNode(syntaxTree2) Assert.Equal("WriteLine", node2.Name.ToString()) Dim compilation = CreateCompilationWithMscorlib45({syntaxTree1, syntaxTree2}) Dim semanticModel1 = compilation.GetSemanticModel(syntaxTree1, True) Dim semanticModel2 = compilation.GetSemanticModel(syntaxTree2, True) Assert.Null(semanticModel1.GetSymbolInfo(node1.Name).Symbol) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel2.GetSymbolInfo(node2.Name).Symbol.ToTestDisplayString()) compilation.AssertTheseDiagnostics( BC30001: Statement is not valid in a namespace. System.Console.WriteLine(1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) compilation = CreateCompilationWithMscorlib45({syntaxTree2, syntaxTree1}) semanticModel1 = compilation.GetSemanticModel(syntaxTree1, True) semanticModel2 = compilation.GetSemanticModel(syntaxTree2, True) Assert.Null(semanticModel1.GetSymbolInfo(node1.Name).Symbol) Assert.Equal("Sub System.Console.WriteLine(value As System.Int32)", semanticModel2.GetSymbolInfo(node2.Name).Symbol.ToTestDisplayString()) compilation.AssertTheseDiagnostics( BC30001: Statement is not valid in a namespace. System.Console.WriteLine(1) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ) End Sub Private Shared Function ErrorTestsGetNode(syntaxTree As SyntaxTree) As MemberAccessExpressionSyntax Dim node1 = DirectCast(syntaxTree.GetRoot(), CompilationUnitSyntax) Dim node3 = DirectCast(node1.Members.First(), ExpressionStatementSyntax) Dim node4 = DirectCast(node3.Expression, InvocationExpressionSyntax) Dim node5 = DirectCast(node4.Expression, MemberAccessExpressionSyntax) Return node5 End Function End Class End Namespace