提交 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
parameter.Type,
parameter.Ordinal,
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)
......
......@@ -460,5 +460,10 @@ internal static string ReusableHoistedLocalFieldName(int number)
Debug.Assert((char)GeneratedNameKind.ReusableHoistedLocalField == '7');
return "<>7__wrap" + StringExtensions.GetNumeral(number);
}
internal static string LambdaCopyParameterName(ParameterSymbol sourceParameter)
{
return "<" + sourceParameter.Name + ">";
}
}
}
......@@ -1593,7 +1593,7 @@ public static void Main()
Assert.Null(GetSymbolNamesJoined(analysis.AlwaysAssigned));
Assert.Equal("p", GetSymbolNamesJoined(analysis.Captured));
Assert.Equal("i", GetSymbolNamesJoined(analysis.UnsafeAddressTaken));
Assert.Equal("", GetSymbolNamesJoined(analysis.VariablesDeclared));
Assert.Equal("<p>", GetSymbolNamesJoined(analysis.VariablesDeclared));
Assert.Equal("p", GetSymbolNamesJoined(analysis.DataFlowsIn));
Assert.Null(GetSymbolNamesJoined(analysis.DataFlowsOut));
......@@ -1601,7 +1601,7 @@ public static void Main()
Assert.Equal("p", GetSymbolNamesJoined(analysis.ReadInside));
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));
}
......
......@@ -1396,5 +1396,46 @@ public interface IColumn { }
var compilation = CreateCompilationWithMscorlib(source, new[] { SystemCoreRef, CSharpRef }, options: TestOptions.ReleaseExe);
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.
先完成此消息的编辑!
想要评论请 注册