Browse Source

Fix #2278: Implement support for CSharpBinderFlags.InvokeSimpleName

pull/2289/head
Siegfried Pammer 5 years ago
parent
commit
f52ce79da0
  1. 10
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs
  2. 12
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

10
ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs

@ -172,6 +172,16 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -172,6 +172,16 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
field.Call((dynamic)"Hello World");
}
private void StaticCallWithDynamicArgument(dynamic d)
{
M3(d + 5);
}
private static void StaticCallWithDynamicArgumentInStaticContext(dynamic d)
{
DynamicTests.M3(d + 5);
}
private static void DynamicCallWithString()
{
field.Call("Hello World");

12
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -3811,9 +3811,19 @@ namespace ICSharpCode.Decompiler.CSharp @@ -3811,9 +3811,19 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override TranslatedExpression VisitDynamicInvokeMemberInstruction(DynamicInvokeMemberInstruction inst, TranslationContext context)
{
Expression targetExpr;
var target = TranslateDynamicTarget(inst.Arguments[0], inst.ArgumentInfo[0]);
if (inst.BinderFlags.HasFlag(CSharpBinderFlags.InvokeSimpleName))
{
targetExpr = new IdentifierExpression(inst.Name);
((IdentifierExpression)targetExpr).TypeArguments.AddRange(inst.TypeArguments.Select(ConvertType));
}
else
{
targetExpr = new MemberReferenceExpression(target, inst.Name, inst.TypeArguments.Select(ConvertType));
}
var arguments = TranslateDynamicArguments(inst.Arguments.Skip(1), inst.ArgumentInfo.Skip(1)).ToList();
return new InvocationExpression(new MemberReferenceExpression(target, inst.Name, inst.TypeArguments.Select(ConvertType)), arguments.Select(a => a.Expression))
return new InvocationExpression(targetExpr, arguments.Select(a => a.Expression))
.WithILInstruction(inst)
.WithRR(new DynamicInvocationResolveResult(target.ResolveResult, DynamicInvocationType.Invocation, arguments.Select(a => a.ResolveResult).ToArray()));
}

Loading…
Cancel
Save