diff --git a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompiler.cs b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompiler.cs index ab2657bea47a710e503bfbb611f1e619dd6338af..8ef028988ac15c1653c0a08b417e6c99b2461a43 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 60eee98926ba29369a66587c2c01fe90c8dc13a5..93f27b31b4490d51cb7e7866b52d95c1fbab42e2 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 c7044d42aa0c66484715ff95d8060c72bf7e8d53..0cd7c0fa5271219202841f21719f082c4bb0cb20 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