提交 363f338d 编写于 作者: A Aaron Bockover

Ensure script compilations properly inherit return type from first compilation

Use ScriptCompilationInfo.ReturnTypeOpt instead of ReturnType when
chaining off a previous compilation to ensure that the derived
ScriptCompilationInfo has the same ReturnType.
上级 f6927354
......@@ -510,7 +510,7 @@ public CSharpCompilation WithScriptCompilationInfo(CSharpScriptCompilationInfo i
_options,
this.ExternalReferences,
info?.PreviousScriptCompilation,
info?.ReturnType,
info?.ReturnTypeOpt,
info?.GlobalsType,
info != null,
_referenceManager,
......
......@@ -20,7 +20,7 @@ internal CSharpScriptCompilationInfo(CSharpCompilation previousCompilationOpt, T
internal override Compilation CommonPreviousScriptCompilation => PreviousScriptCompilation;
public CSharpScriptCompilationInfo WithPreviousScriptCompilation(CSharpCompilation compilation) =>
(compilation == PreviousScriptCompilation) ? this : new CSharpScriptCompilationInfo(compilation, ReturnType, GlobalsType);
(compilation == PreviousScriptCompilation) ? this : new CSharpScriptCompilationInfo(compilation, ReturnTypeOpt, GlobalsType);
internal override ScriptCompilationInfo CommonWithPreviousScriptCompilation(Compilation compilation) =>
WithPreviousScriptCompilation((CSharpCompilation)compilation);
......
......@@ -1583,6 +1583,7 @@ class A
}
[WorkItem(8506, "https://github.com/dotnet/roslyn/issues/8506")]
[WorkItem(17403, "https://github.com/dotnet/roslyn/issues/17403")]
[Fact]
public void CrossCorlibSystemObjectReturnType_Script()
{
......@@ -1592,21 +1593,42 @@ public void CrossCorlibSystemObjectReturnType_Script()
//
// In the original bug, Xamarin iOS, Android, and Mac Mobile profile corlibs were
// realistic cross-compilation targets.
var compilation = CSharpCompilation.CreateScriptCompilation(
"submission-assembly",
references: new [] { MinAsyncCorlibRef },
void AssertCompilationCorlib(CSharpCompilation compilation)
{
Assert.True(compilation.IsSubmission);
var taskOfT = compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_Task_T);
var taskOfObject = taskOfT.Construct(compilation.ObjectType);
var entryPoint = compilation.GetEntryPoint(default(CancellationToken));
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfT.ContainingAssembly);
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfObject.ContainingAssembly);
Assert.Equal(taskOfObject, entryPoint.ReturnType);
}
var firstCompilation = CSharpCompilation.CreateScriptCompilation(
"submission-assembly-1",
references: new[] { MinAsyncCorlibRef },
syntaxTree: Parse("true", options: TestOptions.Script)
).VerifyDiagnostics();
Assert.True(compilation.IsSubmission);
AssertCompilationCorlib(firstCompilation);
var secondCompilation = CSharpCompilation.CreateScriptCompilation(
"submission-assembly-2",
previousScriptCompilation: firstCompilation,
syntaxTree: Parse("false", options: TestOptions.Script))
.WithScriptCompilationInfo(new CSharpScriptCompilationInfo(firstCompilation, null, null))
.VerifyDiagnostics();
AssertCompilationCorlib(secondCompilation);
var taskOfT = compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_Task_T);
var taskOfObject = taskOfT.Construct(compilation.ObjectType);
var entryPoint = compilation.GetEntryPoint(default(CancellationToken));
Assert.Same(firstCompilation.ObjectType, secondCompilation.ObjectType);
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfT.ContainingAssembly);
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfObject.ContainingAssembly);
Assert.Equal(taskOfObject, entryPoint.ReturnType);
Assert.Null(new CSharpScriptCompilationInfo(null, null, null)
.WithPreviousScriptCompilation(firstCompilation)
.ReturnTypeOpt);
}
[WorkItem(3719, "https://github.com/dotnet/roslyn/issues/3719")]
......
......@@ -669,7 +669,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
_embeddedTrees,
_declarationTable,
info?.PreviousScriptCompilation,
info?.ReturnType,
info?.ReturnTypeOpt,
info?.GlobalsType,
info IsNot Nothing,
_referenceManager,
......
......@@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Property
Public Shadows Function WithPreviousScriptCompilation(compilation As VisualBasicCompilation) As VisualBasicScriptCompilationInfo
Return If(compilation Is PreviousScriptCompilation, Me, New VisualBasicScriptCompilationInfo(compilation, ReturnType, GlobalsType))
Return If(compilation Is PreviousScriptCompilation, Me, New VisualBasicScriptCompilationInfo(compilation, ReturnTypeOpt, GlobalsType))
End Function
Friend Overrides Function CommonWithPreviousScriptCompilation(compilation As Compilation) As ScriptCompilationInfo
......
......@@ -1544,6 +1544,7 @@ End Class
End Sub
<WorkItem(8506, "https://github.com/dotnet/roslyn/issues/8506")>
<WorkItem(17403, "https://github.com/dotnet/roslyn/issues/17403")>
<Fact()>
Public Sub CrossCorlibSystemObjectReturnType_Script()
' MinAsyncCorlibRef corlib Is used since it provides just enough corlib type definitions
......@@ -1552,21 +1553,40 @@ End Class
'
' In the original bug, Xamarin iOS, Android, And Mac Mobile profile corlibs were
' realistic cross-compilation targets.
Dim compilation = VisualBasicCompilation.CreateScriptCompilation(
"submission-assembly",
Dim AssertCompilationCorlib As Action(Of VisualBasicCompilation) =
Sub(compilation As VisualBasicCompilation)
Assert.True(compilation.IsSubmission)
Dim taskOfT = compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_Task_T)
Dim taskOfObject = taskOfT.Construct(compilation.ObjectType)
Dim entryPoint = compilation.GetEntryPoint(Nothing)
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfT.ContainingAssembly)
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfObject.ContainingAssembly)
Assert.Equal(taskOfObject, entryPoint.ReturnType)
End Sub
Dim firstCompilation = VisualBasicCompilation.CreateScriptCompilation(
"submission-assembly-1",
references:={MinAsyncCorlibRef},
syntaxTree:=Parse("? True", options:=TestOptions.Script)
).VerifyDiagnostics()
Assert.True(compilation.IsSubmission)
AssertCompilationCorlib(firstCompilation)
Dim secondCompilation = VisualBasicCompilation.CreateScriptCompilation(
"submission-assembly-2",
previousScriptCompilation:=firstCompilation,
syntaxTree:=Parse("? False", options:=TestOptions.Script)
).WithScriptCompilationInfo(New VisualBasicScriptCompilationInfo(firstCompilation, Nothing, Nothing)
).VerifyDiagnostics()
AssertCompilationCorlib(secondCompilation)
Dim taskOfT = compilation.GetWellKnownType(WellKnownType.System_Threading_Tasks_Task_T)
Dim taskOfObject = taskOfT.Construct(compilation.ObjectType)
Dim entryPoint = compilation.GetEntryPoint(Nothing)
Assert.Same(firstCompilation.ObjectType, secondCompilation.ObjectType)
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfT.ContainingAssembly)
Assert.Same(compilation.ObjectType.ContainingAssembly, taskOfObject.ContainingAssembly)
Assert.Equal(taskOfObject, entryPoint.ReturnType)
Assert.Null(New VisualBasicScriptCompilationInfo(Nothing, Nothing, Nothing).WithPreviousScriptCompilation(firstCompilation).ReturnTypeOpt)
End Sub
<WorkItem(3719, "https://github.com/dotnet/roslyn/issues/3719")>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册