提交 381a37ec 编写于 作者: A AlekseyTs

Give non-empty names to copy parameters of anonymous methods.

It is unexpected to have parameters originated from source having empty names in correct programs.
Fixes #4527.
上级 e763d73c
...@@ -346,7 +346,7 @@ private static ParameterSymbol CopyParameter(ParameterSymbol parameter, MethodSy ...@@ -346,7 +346,7 @@ private static ParameterSymbol CopyParameter(ParameterSymbol parameter, MethodSy
parameter.Type, parameter.Type,
parameter.Ordinal, parameter.Ordinal,
parameter.RefKind, parameter.RefKind,
string.Empty); // Make sure nothing binds to this. GeneratedNames.LambdaCopyParameterName(parameter)); // Make sure nothing binds to this.
} }
public sealed override bool Equals(object symbol) public sealed override bool Equals(object symbol)
......
...@@ -460,5 +460,10 @@ internal static string ReusableHoistedLocalFieldName(int number) ...@@ -460,5 +460,10 @@ internal static string ReusableHoistedLocalFieldName(int number)
Debug.Assert((char)GeneratedNameKind.ReusableHoistedLocalField == '7'); Debug.Assert((char)GeneratedNameKind.ReusableHoistedLocalField == '7');
return "<>7__wrap" + StringExtensions.GetNumeral(number); return "<>7__wrap" + StringExtensions.GetNumeral(number);
} }
internal static string LambdaCopyParameterName(ParameterSymbol sourceParameter)
{
return "<" + sourceParameter.Name + ">";
}
} }
} }
...@@ -1593,7 +1593,7 @@ public static void Main() ...@@ -1593,7 +1593,7 @@ public static void Main()
Assert.Null(GetSymbolNamesJoined(analysis.AlwaysAssigned)); Assert.Null(GetSymbolNamesJoined(analysis.AlwaysAssigned));
Assert.Equal("p", GetSymbolNamesJoined(analysis.Captured)); Assert.Equal("p", GetSymbolNamesJoined(analysis.Captured));
Assert.Equal("i", GetSymbolNamesJoined(analysis.UnsafeAddressTaken)); Assert.Equal("i", GetSymbolNamesJoined(analysis.UnsafeAddressTaken));
Assert.Equal("", GetSymbolNamesJoined(analysis.VariablesDeclared)); Assert.Equal("<p>", GetSymbolNamesJoined(analysis.VariablesDeclared));
Assert.Equal("p", GetSymbolNamesJoined(analysis.DataFlowsIn)); Assert.Equal("p", GetSymbolNamesJoined(analysis.DataFlowsIn));
Assert.Null(GetSymbolNamesJoined(analysis.DataFlowsOut)); Assert.Null(GetSymbolNamesJoined(analysis.DataFlowsOut));
...@@ -1601,7 +1601,7 @@ public static void Main() ...@@ -1601,7 +1601,7 @@ public static void Main()
Assert.Equal("p", GetSymbolNamesJoined(analysis.ReadInside)); Assert.Equal("p", GetSymbolNamesJoined(analysis.ReadInside));
Assert.Equal("i", GetSymbolNamesJoined(analysis.ReadOutside)); Assert.Equal("i", GetSymbolNamesJoined(analysis.ReadOutside));
Assert.Equal("", GetSymbolNamesJoined(analysis.WrittenInside)); Assert.Equal("<p>", GetSymbolNamesJoined(analysis.WrittenInside));
Assert.Equal("i, p, d", GetSymbolNamesJoined(analysis.WrittenOutside)); Assert.Equal("i, p, d", GetSymbolNamesJoined(analysis.WrittenOutside));
} }
......
...@@ -1396,5 +1396,46 @@ public interface IColumn { } ...@@ -1396,5 +1396,46 @@ public interface IColumn { }
var compilation = CreateCompilationWithMscorlib(source, new[] { SystemCoreRef, CSharpRef }, options: TestOptions.ReleaseExe); var compilation = CreateCompilationWithMscorlib(source, new[] { SystemCoreRef, CSharpRef }, options: TestOptions.ReleaseExe);
CompileAndVerify(compilation, expectedOutput: "Select<T, S>"); CompileAndVerify(compilation, expectedOutput: "Select<T, S>");
} }
[Fact, WorkItem(4527, "https://github.com/dotnet/roslyn/issues/4527")]
public void AnonymousMethodExpressionWithoutParameterList()
{
var source =
@"
using System;
using System.Threading.Tasks;
namespace RoslynAsyncDelegate
{
class Program
{
static EventHandler MyEvent;
static void Main(string[] args)
{
MyEvent += async delegate { await Task.Delay(0); };
}
}
}
";
var compilation = CreateCompilationWithMscorlib45(source, options: TestOptions.DebugExe);
var tree = compilation.SyntaxTrees[0];
var model = compilation.GetSemanticModel(tree);
var node1 = tree.GetRoot().DescendantNodes().Where(n => n.IsKind(SyntaxKind.AnonymousMethodExpression)).Single();
Assert.Equal("async delegate { await Task.Delay(0); }", node1.ToString());
Assert.Equal("void System.EventHandler.Invoke(System.Object sender, System.EventArgs e)", model.GetTypeInfo(node1).ConvertedType.GetMembers("Invoke").Single().ToTestDisplayString());
var lambdaParameters = ((MethodSymbol)(model.GetSymbolInfo(node1)).Symbol).Parameters;
Assert.Equal("System.Object <sender>", lambdaParameters[0].ToTestDisplayString());
Assert.Equal("System.EventArgs <e>", lambdaParameters[1].ToTestDisplayString());
CompileAndVerify(compilation);
}
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册