提交 6be33a96 编写于 作者: A Andrew Casey

Ignore constant expressions in CapturedVariableRewriter

The VB EE runs ```CapturedVariableRewriter```, so it ends up looking
inside constants that will be rewritten into literal expressions in
```LocalRewriter```.  This can result in spurious errors - e.g. when
accessing an instance member in a ```nameof``` expression in a
```shared``` context.

C# is unaffected since it runs ```CapturedVariableRewriter``` after
```LocalRewriter```.

Fixes #3939
上级 baf1380c
......@@ -31,6 +31,15 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator
_diagnostics = diagnostics
End Sub
Public Overrides Function Visit(node As BoundNode) As BoundNode
' Ignore nodes that will be rewritten to literals in the LocalRewriter.
If TryCast(node, BoundExpression)?.ConstantValueOpt IsNot Nothing Then
Return node
End If
Return MyBase.Visit(node)
End Function
Public Overrides Function VisitBlock(node As BoundBlock) As BoundNode
Dim rewrittenLocals = node.Locals.WhereAsArray(AddressOf IncludeLocal)
Dim rewrittenStatements = VisitList(node.Statements)
......
......@@ -4583,6 +4583,61 @@ End Class"
Assert.Same(previous, context)
End Sub
<WorkItem(3939, "https://github.com/dotnet/roslyn/issues/3939")>
<Fact>
Public Sub NameofInstanceInSharedContext()
Const source = "
Class C
Private X As Integer
Shared Function M() As String
Return Nameof(X)
End Function
End Class
"
Dim resultProperties As ResultProperties = Nothing
Dim errorMessage As String = Nothing
Dim testData = Evaluate(
source,
OutputKind.DynamicallyLinkedLibrary,
methodName:="C.M",
expr:="Nameof(X)",
resultProperties:=resultProperties,
errorMessage:=errorMessage)
Assert.Null(errorMessage)
testData.GetMethodData("<>x.<>m0").VerifyIL("
{
// Code size 6 (0x6)
.maxstack 1
.locals init (String V_0) //M
IL_0000: ldstr ""X""
IL_0005: ret
}
")
End Sub
<WorkItem(3939, "https://github.com/dotnet/roslyn/issues/3939")>
<Fact>
Public Sub NameofInstanceInSharedContext_ExplicitMe()
Const source = "
Class C
Private X As Integer
Shared Function M() As String
Return Nameof(X)
End Function
End Class
"
Dim resultProperties As ResultProperties = Nothing
Dim errorMessage As String = Nothing
Dim testData = Evaluate(
source,
OutputKind.DynamicallyLinkedLibrary,
methodName:="C.M",
expr:="Nameof(Me.X)",
resultProperties:=resultProperties,
errorMessage:=errorMessage)
Assert.Equal("(1) : error BC30043: 'Me' is valid only within an instance method.", errorMessage)
End Sub
End Class
End Namespace
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册