From f52ce79da0ddf41f748cf48d423174290c53791d Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 20 Jan 2021 00:12:25 +0100 Subject: [PATCH] Fix #2278: Implement support for CSharpBinderFlags.InvokeSimpleName --- .../TestCases/Pretty/DynamicTests.cs | 10 ++++++++++ ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs index cb9a36d5f..897bcabd4 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/DynamicTests.cs @@ -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"); diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 1ee5ef58d..8b4fdf4c3 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -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())); }