提交 31e62fbe 编写于 作者: C Charles Stoner

Skip pseudo-variables with use-site errors

上级 d3de5b2b
......@@ -331,6 +331,11 @@ private static string GetNextMethodName(ArrayBuilder<MethodSymbol> 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(
......
......@@ -3856,6 +3856,46 @@ static void DummySequencePoint()
});
}
/// <summary>
/// CompileGetLocals should skip locals with errors.
/// </summary>
[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<LocalAndMethod>.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<LocalAndMethod> locals, int count, out string typeName, out CompilationTestData testData)
{
var context = CreateMethodContext(runtime, methodName);
......
......@@ -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,
......
......@@ -3284,6 +3284,43 @@ End Class"
End Sub)
End Sub
''' <summary>
''' CompileGetLocals should skip locals with errors.
''' </summary>
<WorkItem(535899, "https://devdiv.visualstudio.com/DevDiv/_workitems?id=535899")>
<Fact>
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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册