From 31e62fbe08f089ad4c67739616ab9256a543348b Mon Sep 17 00:00:00 2001 From: Charles Stoner Date: Sat, 6 Jan 2018 20:44:46 -0800 Subject: [PATCH] Skip pseudo-variables with use-site errors --- .../ExpressionCompiler/CompilationContext.cs | 5 +++ .../Test/ExpressionCompiler/LocalsTests.cs | 40 +++++++++++++++++++ .../ExpressionCompiler/CompilationContext.vb | 4 ++ .../Test/ExpressionCompiler/LocalsTests.vb | 37 +++++++++++++++++ 4 files changed, 86 insertions(+) diff --git a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/CompilationContext.cs b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/CompilationContext.cs index c4028236074..01436bbb7f0 100644 --- a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/CompilationContext.cs +++ b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/CompilationContext.cs @@ -331,6 +331,11 @@ private static string GetNextMethodName(ArrayBuilder builder) _currentFrame, sourceAssembly, alias); + // Skip pseudo-variables with errors. + if (local.GetUseSiteDiagnostic()?.Severity == DiagnosticSeverity.Error) + { + continue; + } var methodName = GetNextMethodName(methodBuilder); var syntax = SyntaxFactory.IdentifierName(SyntaxFactory.MissingToken(SyntaxKind.IdentifierToken)); var aliasMethod = this.CreateMethod( diff --git a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/LocalsTests.cs b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/LocalsTests.cs index 37b6c14804d..a4d21958c73 100644 --- a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/LocalsTests.cs +++ b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/LocalsTests.cs @@ -3856,6 +3856,46 @@ static void DummySequencePoint() }); } + /// + /// CompileGetLocals should skip locals with errors. + /// + [WorkItem(535899, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=535899")] + [Fact] + public void SkipPseudoVariablesWithUseSiteErrors() + { + var source = +@"class C +{ + static void M(object x) + { + object y; + } +}"; + var compilation0 = CreateStandardCompilation(source, options: TestOptions.DebugDll); + WithRuntimeInstance(compilation0, runtime => + { + var context = CreateMethodContext(runtime, "C.M"); + var aliases = ImmutableArray.Create(ReturnValueAlias(1, "UnknownType, UnknownAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")); + var locals = ArrayBuilder.GetInstance(); + string typeName; + var diagnostics = DiagnosticBag.GetInstance(); + var testData = new CompilationTestData(); + context.CompileGetLocals( + locals, + argumentsOnly: false, + aliases: aliases, + diagnostics: diagnostics, + typeName: out typeName, + testData: testData); + diagnostics.Verify(); + diagnostics.Free(); + Assert.Equal(locals.Count, 2); + VerifyLocal(testData, typeName, locals[0], "<>m0", "x"); + VerifyLocal(testData, typeName, locals[1], "<>m1", "y"); + locals.Free(); + }); + } + private static void GetLocals(RuntimeInstance runtime, string methodName, bool argumentsOnly, ArrayBuilder locals, int count, out string typeName, out CompilationTestData testData) { var context = CreateMethodContext(runtime, methodName); diff --git a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/CompilationContext.vb b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/CompilationContext.vb index f6b95bddad4..f157d3a9722 100644 --- a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/CompilationContext.vb +++ b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/CompilationContext.vb @@ -242,6 +242,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator Dim methodName = GetNextMethodName(methodBuilder) Dim syntax = SyntaxFactory.IdentifierName(SyntaxFactory.MissingToken(SyntaxKind.IdentifierToken)) Dim local = PlaceholderLocalSymbol.Create(typeNameDecoder, _currentFrame, [alias]) + ' Skip pseudo-variables with errors. + If local.GetUseSiteErrorInfo()?.Severity = DiagnosticSeverity.Error Then + Continue For + End If Dim aliasMethod = Me.CreateMethod( container, methodName, diff --git a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/LocalsTests.vb b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/LocalsTests.vb index 0b547be46fe..bdbb31b14fa 100644 --- a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/LocalsTests.vb +++ b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/LocalsTests.vb @@ -3284,6 +3284,43 @@ End Class" End Sub) End Sub + ''' + ''' CompileGetLocals should skip locals with errors. + ''' + + + Public Sub SkipPseudoVariablesWithUseSiteErrors() + Const source = +"Class C + Shared Sub M(x As Object) + Dim y As Object + End Sub +End Class" + Dim comp = CreateCompilationWithMscorlib({source}, options:=TestOptions.DebugDll) + WithRuntimeInstance(comp, + Sub(runtime) + Dim context = CreateMethodContext(runtime, "C.M") + Dim aliases = ImmutableArray.Create(ReturnValueAlias(1, "UnknownType, UnknownAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")) + Dim locals = ArrayBuilder(Of LocalAndMethod).GetInstance() + Dim typeName As String = Nothing + Dim diagnostics = DiagnosticBag.GetInstance() + Dim testData = New CompilationTestData() + context.CompileGetLocals( + locals, + argumentsOnly:=False, + aliases:=aliases, + diagnostics:=diagnostics, + typeName:=typeName, + testData:=testData) + diagnostics.Verify() + diagnostics.Free() + Assert.Equal(2, locals.Count) + VerifyLocal(testData, typeName, locals(0), "<>m0", "x") + VerifyLocal(testData, typeName, locals(1), "<>m1", "y") + locals.Free() + End Sub) + End Sub + Private Shared Sub GetLocals(runtime As RuntimeInstance, methodName As String, argumentsOnly As Boolean, locals As ArrayBuilder(Of LocalAndMethod), count As Integer, ByRef typeName As String, ByRef testData As CompilationTestData) Dim context = CreateMethodContext(runtime, methodName) -- GitLab