提交 bb0ff321 编写于 作者: V VSadov

Merge pull request #7718 from VSadov/fix6416

Make captured "this" a constant in expression trees.
......@@ -202,7 +202,12 @@ private BoundExpression VisitExpressionWithoutStackGuard(BoundExpression node)
case BoundKind.DelegateCreationExpression:
return VisitDelegateCreationExpression((BoundDelegateCreationExpression)node);
case BoundKind.FieldAccess:
return VisitFieldAccess((BoundFieldAccess)node);
var fieldAccess = (BoundFieldAccess)node;
if (fieldAccess.FieldSymbol.IsCapturedFrame)
{
return Constant(fieldAccess);
}
return VisitFieldAccess(fieldAccess);
case BoundKind.IsOperator:
return VisitIsOperator((BoundIsOperator)node);
case BoundKind.Lambda:
......
......@@ -5899,6 +5899,117 @@ static int foo(int x)
expectedOutput: expectedOutput);
}
[WorkItem(6416, "https://github.com/dotnet/roslyn/issues/6416")]
[Fact]
public void CapturedThis001()
{
const string source = @"
using System;
using System.Linq.Expressions;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
var v = new Program();
v.test();
}
public int P1
{
get
{
return 42;
}
}
public void test()
{
var local = 0;
Func<Expression<Func<int>>> f =
() =>
{
System.Console.WriteLine(P1 + local);
return () => P1;
};
System.Console.WriteLine((f().Body as MemberExpression).Expression);
}
}
}
";
const string expectedOutput = @"42
value(ConsoleApplication6.Program)";
CompileAndVerify(
new[] {
source,
},
new[] { ExpressionAssemblyRef },
expectedOutput: expectedOutput);
}
[WorkItem(6416, "https://github.com/dotnet/roslyn/issues/6416")]
[Fact]
public void CapturedThis002()
{
const string source = @"
using System;
using System.Linq.Expressions;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
var v = new Program();
v.test();
}
public int P1
{
get
{
return 42;
}
}
public void test()
{
var local = 0;
Func<Expression<Func<Expression<Func<int>>>>> ff = () =>
{
Func<Expression<Func<int>>> f =
() =>
{
System.Console.WriteLine(P1 + local);
return () => P1;
};
return () => f();
};
System.Console.WriteLine((ff().Compile()().Body as MemberExpression).Expression);
}
}
}
";
const string expectedOutput = @"42
value(ConsoleApplication6.Program)";
CompileAndVerify(
new[] {
source,
},
new[] { ExpressionAssemblyRef },
expectedOutput: expectedOutput);
}
#endregion Regression Tests
......
......@@ -217,7 +217,11 @@ lSelect:
Case BoundKind.DirectCast
Return VisitDirectCast(DirectCast(node, BoundDirectCast))
Case BoundKind.FieldAccess
Return VisitFieldAccess(DirectCast(node, BoundFieldAccess))
Dim fieldAccess = DirectCast(node, BoundFieldAccess)
If fieldAccess.FieldSymbol.IsCapturedFrame Then
Return CreateLiteralExpression(node)
End If
Return VisitFieldAccess(fieldAccess)
Case BoundKind.Lambda
Return VisitLambda(DirectCast(node, BoundLambda))
Case BoundKind.NewT
......
......@@ -8198,5 +8198,55 @@ End Module
End Sub
<Fact, WorkItem(6416, "https://github.com/dotnet/roslyn/issues/6416")>
Public Sub CapturedMe001()
Dim source = <compilation>
<file name="a.vb"><![CDATA[
Imports System
Imports System.Linq.Expressions
Class Module1
Public Shared Sub Main()
Dim v = New Module1()
v.test()
End Sub
Public ReadOnly Property P1 As Integer
Get
Return 42
End Get
End Property
Public Sub test()
Dim local = 0
Dim f As Func(Of Expression(Of Func(Of Integer))) =
Function()
System.Console.WriteLine(P1 + local)
Return Function() P1
End Function
System.Console.WriteLine(DirectCast(f().Body, MemberExpression).Expression)
End Sub
End Class
]]></file>
</compilation>
CompileAndVerify(source,
additionalRefs:={SystemCoreRef},
options:=TestOptions.ReleaseExe,
expectedOutput:=<![CDATA[
42
value(Module1)
]]>).VerifyDiagnostics()
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册