提交 6590dd95 编写于 作者: J Julien Couvreur

Fix semantic model on type parameters of local functions

上级 919b606f
......@@ -1987,29 +1987,29 @@ public override ITypeParameterSymbol GetDeclaredSymbol(TypeParameterSyntax typeP
throw new ArgumentException("typeParameter not within tree");
}
var typeParamList = typeParameter.Parent as TypeParameterListSyntax;
if (typeParamList != null)
if (typeParameter.Parent is TypeParameterListSyntax typeParamList)
{
var memberDecl = typeParamList.Parent as MemberDeclarationSyntax;
if (memberDecl != null)
{
var symbol = GetDeclaredSymbol(memberDecl, cancellationToken);
if ((object)symbol != null)
{
var typeSymbol = symbol as NamedTypeSymbol;
if ((object)typeSymbol != null)
ISymbol parameterizedSymbol = null;
switch (typeParamList.Parent)
{
return this.GetTypeParameterSymbol(typeSymbol.TypeParameters, typeParameter);
case MemberDeclarationSyntax memberDecl:
parameterizedSymbol = GetDeclaredSymbol(memberDecl, cancellationToken);
break;
case LocalFunctionStatementSyntax localDecl:
parameterizedSymbol = GetDeclaredSymbol(localDecl, cancellationToken);
break;
}
var methodSymbol = symbol as MethodSymbol;
if ((object)methodSymbol != null)
switch (parameterizedSymbol)
{
return
this.GetTypeParameterSymbol(methodSymbol.TypeParameters, typeParameter) ??
((object)methodSymbol.PartialDefinitionPart == null ? null : this.GetTypeParameterSymbol(methodSymbol.PartialDefinitionPart.TypeParameters, typeParameter));
}
}
case NamedTypeSymbol typeSymbol:
return this.GetTypeParameterSymbol(typeSymbol.TypeParameters, typeParameter);
case MethodSymbol methodSymbol:
return this.GetTypeParameterSymbol(methodSymbol.TypeParameters, typeParameter) ??
((object)methodSymbol.PartialDefinitionPart == null
? null
: this.GetTypeParameterSymbol(methodSymbol.PartialDefinitionPart.TypeParameters, typeParameter));
}
}
......
......@@ -3331,5 +3331,43 @@ static void M()
Diagnostic(ErrorCode.ERR_DynamicLocalFunctionTypeParameter, "L5(1, 3, val)").WithArguments("L5").WithLocation(26, 9)
);
}
[Fact]
[WorkItem(23699, "https://github.com/dotnet/roslyn/issues/23699")]
public void GetDeclaredSymbolOnTypeParameter()
{
var src = @"
class C<T>
{
void M<U>()
{
void LocalFunction<T, U, V>(T p1, U p2, V p3)
{
}
}
}
";
var comp = CreateStandardCompilation(src);
var tree = comp.SyntaxTrees.Single();
var model = comp.GetSemanticModel(tree);
var localDecl = (LocalFunctionStatementSyntax)tree.FindNodeOrTokenByKind(SyntaxKind.LocalFunctionStatement).AsNode();
var typeParameters = localDecl.TypeParameterList.Parameters;
var parameters = localDecl.ParameterList.Parameters;
verifyTypeParameterAndParameter(typeParameters[0], parameters[0], "T");
verifyTypeParameterAndParameter(typeParameters[1], parameters[1], "U");
verifyTypeParameterAndParameter(typeParameters[2], parameters[2], "V");
void verifyTypeParameterAndParameter(TypeParameterSyntax typeParameter, ParameterSyntax parameter, string expected)
{
var symbol = model.GetDeclaredSymbol(typeParameter);
Assert.Equal(expected, symbol.ToTestDisplayString());
var parameterSymbol = model.GetDeclaredSymbol(parameter);
Assert.Equal(expected, parameterSymbol.Type.ToTestDisplayString());
Assert.True(symbol == parameterSymbol.Type);
}
}
}
}
......@@ -25,6 +25,94 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences
Await TestAPIAndFeature(input)
End Function
<WorkItem(23699, "https://github.com/dotnet/roslyn/issues/23699")>
<WpfFact, Trait(Traits.Feature, Traits.Features.FindReferences)>
Public Async Function TestCSharp_LocalFunctionTypeParameter() As Task
Dim input =
<Workspace>
<Project Language="C#" CommonReferences="true">
<Document><![CDATA[
class C
{
void M()
{
void local<{|Definition:TPar$$am|}>([|TParam|] parameter)
{
}
}
}
]]></Document>
</Project>
</Workspace>
Await TestAPIAndFeature(input)
End Function
<WorkItem(23699, "https://github.com/dotnet/roslyn/issues/23699")>
<WpfFact, Trait(Traits.Feature, Traits.Features.FindReferences)>
Public Async Function TestCSharp_LocalFunctionTypeParameter2() As Task
Dim input =
<Workspace>
<Project Language="C#" CommonReferences="true">
<Document><![CDATA[
class C
{
void M()
{
void local<{|Definition:TParam|}>([|TPa$$ram|] parameter)
{
}
}
}
]]></Document>
</Project>
</Workspace>
Await TestAPIAndFeature(input)
End Function
<WorkItem(23699, "https://github.com/dotnet/roslyn/issues/23699")>
<WpfFact, Trait(Traits.Feature, Traits.Features.FindReferences)>
Public Async Function TestCSharp_LocalFunctionTypeParameter3() As Task
Dim input =
<Workspace>
<Project Language="C#" CommonReferences="true">
<Document><![CDATA[
class C
{
void M<{|Definition:TParam|}>()
{
void local([|TPa$$ram|] parameter)
{
}
}
}
]]></Document>
</Project>
</Workspace>
Await TestAPIAndFeature(input)
End Function
<WorkItem(23699, "https://github.com/dotnet/roslyn/issues/23699")>
<WpfFact, Trait(Traits.Feature, Traits.Features.FindReferences)>
Public Async Function TestCSharp_LocalFunctionTypeParameter4() As Task
Dim input =
<Workspace>
<Project Language="C#" CommonReferences="true">
<Document><![CDATA[
class C
{
void M<{|Definition:TPa$$ram|}>()
{
void local([|TParam|] parameter)
{
}
}
}
]]></Document>
</Project>
</Workspace>
Await TestAPIAndFeature(input)
End Function
<WpfFact, Trait(Traits.Feature, Traits.Features.FindReferences)>
Public Async Function TestTypeParameter2() As Task
Dim input =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册