Browse Source

add support for Getter/Setter call translation

pull/728/head
Siegfried Pammer 11 years ago
parent
commit
466cb0c702
  1. 32
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

32
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -391,18 +391,42 @@ namespace ICSharpCode.Decompiler.CSharp @@ -391,18 +391,42 @@ namespace ICSharpCode.Decompiler.CSharp
var parameter = inst.Method.Parameters[i - firstParamIndex];
arguments[i] = arguments[i].ConvertTo(parameter.Type, this);
}
var argumentResolveResults = arguments.Skip(firstParamIndex).Select(arg => arg.ResolveResult).ToList();
var rr = new CSharpInvocationResolveResult(target.ResolveResult, inst.Method, argumentResolveResults);
ResolveResult rr;
if (inst.Method.IsAccessor)
rr = new MemberResolveResult(target.ResolveResult, inst.Method.AccessorOwner);
else
rr = new CSharpInvocationResolveResult(target.ResolveResult, inst.Method, argumentResolveResults);
var argumentExpressions = arguments.Skip(firstParamIndex).Select(arg => arg.Expression);
var argumentExpressions = arguments.Skip(firstParamIndex).Select(arg => arg.Expression).ToList();
if (inst.OpCode == OpCode.NewObj) {
return new ObjectCreateExpression(ConvertType(inst.Method.DeclaringType), argumentExpressions)
.WithILInstruction(inst).WithRR(rr);
} else {
Expression expr;
IMethod method = inst.Method;
if (method.IsAccessor) {
if (method.ReturnType.IsKnownType(KnownTypeCode.Void)) {
var value = argumentExpressions.Last();
argumentExpressions.Remove(value);
if (argumentExpressions.Count == 0)
expr = new MemberReferenceExpression(target.Expression, method.AccessorOwner.Name);
else
expr = new IndexerExpression(target.Expression, argumentExpressions);
expr = new AssignmentExpression(expr, value);
} else {
if (argumentExpressions.Count == 0)
expr = new MemberReferenceExpression(target.Expression, method.AccessorOwner.Name);
else
expr = new IndexerExpression(target.Expression, argumentExpressions);
}
} else {
var mre = new MemberReferenceExpression(target.Expression, inst.Method.Name);
return new InvocationExpression(mre, argumentExpressions)
.WithILInstruction(inst).WithRR(rr);
expr = new InvocationExpression(mre, argumentExpressions);
}
return expr.WithILInstruction(inst).WithRR(rr);
}
}

Loading…
Cancel
Save