Browse Source

Fix #956: Incorrect extension method decompilation

pull/960/head
Siegfried Pammer 8 years ago
parent
commit
1067d86c59
  1. 5
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceExtensionMethods.cs

5
ICSharpCode.Decompiler/CSharp/Transforms/IntroduceExtensionMethods.cs

@ -134,14 +134,15 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -134,14 +134,15 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
var method = invocationExpression.GetSymbol() as IMethod;
if (method == null || !method.IsExtensionMethod || mre == null || !(mre.Target is TypeReferenceExpression) || !invocationExpression.Arguments.Any())
return;
var typeArguments = mre.TypeArguments.Any() ? method.TypeArguments : EmptyList<IType>.Instance;
var firstArgument = invocationExpression.Arguments.First();
var target = firstArgument.GetResolveResult();
var args = invocationExpression.Arguments.Skip(1).Select(a => a.GetResolveResult()).ToArray();
var rr = resolver.ResolveMemberAccess(target, method.Name, method.TypeArguments, NameLookupMode.InvocationTarget) as MethodGroupResolveResult;
var rr = resolver.ResolveMemberAccess(target, method.Name, typeArguments, NameLookupMode.InvocationTarget) as MethodGroupResolveResult;
if (rr == null)
return;
var or = rr.PerformOverloadResolution(resolveContext.Compilation, args, allowExtensionMethods: true);
if (or == null || or.IsAmbiguous)
if (or == null || or.IsAmbiguous || !method.Equals(or.GetBestCandidateWithSubstitutedTypeArguments()))
return;
if (firstArgument is NullReferenceExpression)
firstArgument = firstArgument.ReplaceWith(expr => new CastExpression(context.TypeSystemAstBuilder.ConvertType(method.Parameters[0].Type), expr.Detach()));

Loading…
Cancel
Save