未验证 提交 cee58445 编写于 作者: J Jason Malinowski 提交者: GitHub

Merge pull request #50019 from jasonmalinowski/fix-cross-language-generate-constructor-bugs

Fix cross language generate constructor bugs
......@@ -1866,6 +1866,83 @@ End Class",
End Class")
End Function
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateConstructor)>
Public Async Function TestDelegateConstructorCrossLanguageCycleAvoidance() As Task
Await TestInRegularAndScriptAsync(
<Workspace>
<Project Language="C#" Name="CSharpProject" CommonReferences="true">
<Document>
public class BaseType
{
public BaseType(int x, int y) { }
}
</Document>
</Project>
<Project Language="Visual Basic" CommonReferences="true">
<ProjectReference>CSharpProject</ProjectReference>
<Document>
Public Class B
Inherits BaseType
Public Sub New(a As Integer)
[|Me.New(a, 1)|]
End Sub
End Class</Document>
</Project>
</Workspace>.ToString(),
"
Public Class B
Inherits BaseType
Public Sub New(a As Integer)
Me.New(a, 1)
End Sub
Public Sub New(x As Integer, y As Integer)
MyBase.New(x, y)
End Sub
End Class")
End Function
<WorkItem(49850, "https://github.com/dotnet/roslyn/issues/49850")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateConstructor)>
Public Async Function TestDelegateConstructorCrossLanguage() As Task
Await TestInRegularAndScriptAsync(
<Workspace>
<Project Language="C#" Name="CSharpProject" CommonReferences="true">
<Document>
public class BaseType
{
public BaseType(string x) { }
}</Document>
</Project>
<Project Language="Visual Basic" CommonReferences="true">
<ProjectReference>CSharpProject</ProjectReference>
<Document>
Option Strict On
Public Class B
Public Sub M()
Dim x = [|New BaseType(42)|]
End Sub
End Class
</Document>
</Project>
</Workspace>.ToString(),
"
public class BaseType
{
private int v;
public BaseType(string x) { }
public BaseType(int v)
{
this.v = v;
}
}")
End Function
<WorkItem(14077, "https://github.com/dotnet/roslyn/issues/14077")>
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateConstructor)>
Public Async Function CreateFieldDefaultNamingStyle() As Task
......
......@@ -57,6 +57,10 @@ protected bool WillCauseConstructorCycle(State state, SemanticDocument document,
if (currentConstructor.Equals(delegatedConstructor))
return true;
// Delegating to a constructor in the base type can't cause a cycle
if (!delegatedConstructor.ContainingType.Equals(currentConstructor.ContainingType))
return false;
// We need ensure that delegating constructor won't cause circular dependency.
// The chain of dependency can not exceed the number for constructors
var constructorsCount = delegatedConstructor.ContainingType.InstanceConstructors.Length;
......
......@@ -9,6 +9,7 @@
using System.Linq;
using Microsoft.CodeAnalysis.LanguageServices;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.GenerateMember.GenerateConstructor
{
......@@ -77,9 +78,17 @@ private static bool IsSymbolAccessible(Compilation compilation, ISymbol symbol)
{
Debug.Assert(constructor.Parameters.Length == expressions.Length);
for (var i = 0; i < constructor.Parameters.Length; i++)
// Resolve the constructor into our semantic model's compilation; if the constructor we're looking at is from
// another project with a different language.
var constructorInCompilation = (IMethodSymbol?)SymbolKey.Create(constructor).Resolve(semanticModel.Compilation).Symbol;
Contract.ThrowIfNull(constructorInCompilation);
for (var i = 0; i < constructorInCompilation.Parameters.Length; i++)
{
var constructorParameter = constructor.Parameters[i];
var constructorParameter = constructorInCompilation.Parameters[i];
if (constructorParameter == null)
return false;
var conversion = semanticFacts.ClassifyConversion(semanticModel, expressions[i], constructorParameter.Type);
if (!conversion.IsIdentity && !conversion.IsImplicit)
return false;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册