From 93819e3d61e077f3498143456a2818589c7bcca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Matou=C5=A1ek?= Date: Mon, 20 Nov 2017 17:52:02 -0800 Subject: [PATCH] VB EE: Properly handle syntax errors in synthesized assignments (#22647) * VB EE: Properly handle syntax errors in synthesized assignments * Fix test --- .../ExpressionCompiler/ExpressionCompiler.cs | 5 ++++- .../ExpressionCompiler/SyntaxHelpers.vb | 4 ++++ .../ExpressionCompilerTests.vb | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompiler.cs b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompiler.cs index ab2657bea47..8ef028988ac 100644 --- a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompiler.cs +++ b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompiler.cs @@ -173,7 +173,10 @@ private static ImmutableArray GetAliases(DkmClrRuntimeInstance runtimeIns }, out error); - Debug.Assert((r.ResultProperties.Flags & DkmClrCompilationResultFlags.PotentialSideEffect) == DkmClrCompilationResultFlags.PotentialSideEffect); + Debug.Assert( + r.CompileResult == null && r.ResultProperties.Flags == default || + (r.ResultProperties.Flags & DkmClrCompilationResultFlags.PotentialSideEffect) == DkmClrCompilationResultFlags.PotentialSideEffect); + result = r.CompileResult.ToQueryResult(this.CompilerId, r.ResultProperties, runtimeInstance); } catch (Exception e) when (ExpressionEvaluatorFatalError.CrashIfFailFastEnabled(e)) diff --git a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/SyntaxHelpers.vb b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/SyntaxHelpers.vb index 60eee98926b..93f27b31b44 100644 --- a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/SyntaxHelpers.vb +++ b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/SyntaxHelpers.vb @@ -38,6 +38,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator Dim syntaxTree = expression.CreateSyntaxTree() diagnostics.AddRange(syntaxTree.GetDiagnostics()) + If diagnostics.HasAnyErrors Then + Return Nothing + End If + ' Any Diagnostic spans produced in binding will be offset by the length of the "target" expression text. ' If we want to support live squiggles in debugger windows, SemanticModel, etc, we'll want to address this. Dim targetSyntax = SyntaxHelpers.ParseDebuggerExpressionInternal(SourceText.From(target), consumeFullText:=True) diff --git a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ExpressionCompilerTests.vb b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ExpressionCompilerTests.vb index c7044d42aa0..0cd7c0fa527 100644 --- a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ExpressionCompilerTests.vb +++ b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ExpressionCompilerTests.vb @@ -471,6 +471,27 @@ End Class End If End Sub + + Public Sub SyntaxErrors() + Const source = " +Class C + Shared Function F(x As String) As Object + Return x + End Function +End Class +" + Dim comp = CreateCompilationWithMscorlib({source}, options:=TestOptions.DebugDll) + WithRuntimeInstance(comp, + Sub(runtime) + Dim context = CreateMethodContext(runtime, methodName:="C.F") + Dim errorMessage As String = Nothing + + Dim result = context.CompileAssignment("x", "", errorMessage, formatter:=DebuggerDiagnosticFormatter.Instance) + Assert.Null(result) + Assert.Equal("error BC30201: Expression expected.", errorMessage) + End Sub) + End Sub + ''' ''' Locals in the generated method should account for temporary slots ''' in the original method. Also, some temporaries may not be included -- GitLab