Browse Source

add support for Getter/Setter call translation

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

36
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -391,18 +391,42 @@ namespace ICSharpCode.Decompiler.CSharp
var parameter = inst.Method.Parameters[i - firstParamIndex]; var parameter = inst.Method.Parameters[i - firstParamIndex];
arguments[i] = arguments[i].ConvertTo(parameter.Type, this); arguments[i] = arguments[i].ConvertTo(parameter.Type, this);
} }
var argumentResolveResults = arguments.Skip(firstParamIndex).Select(arg => arg.ResolveResult).ToList(); var argumentResolveResults = arguments.Skip(firstParamIndex).Select(arg => arg.ResolveResult).ToList();
ResolveResult rr;
if (inst.Method.IsAccessor)
rr = new MemberResolveResult(target.ResolveResult, inst.Method.AccessorOwner);
else
rr = new CSharpInvocationResolveResult(target.ResolveResult, inst.Method, argumentResolveResults);
var rr = new CSharpInvocationResolveResult(target.ResolveResult, inst.Method, argumentResolveResults); var argumentExpressions = arguments.Skip(firstParamIndex).Select(arg => arg.Expression).ToList();
var argumentExpressions = arguments.Skip(firstParamIndex).Select(arg => arg.Expression);
if (inst.OpCode == OpCode.NewObj) { if (inst.OpCode == OpCode.NewObj) {
return new ObjectCreateExpression(ConvertType(inst.Method.DeclaringType), argumentExpressions) return new ObjectCreateExpression(ConvertType(inst.Method.DeclaringType), argumentExpressions)
.WithILInstruction(inst).WithRR(rr); .WithILInstruction(inst).WithRR(rr);
} else { } else {
var mre = new MemberReferenceExpression(target.Expression, inst.Method.Name); Expression expr;
return new InvocationExpression(mre, argumentExpressions) IMethod method = inst.Method;
.WithILInstruction(inst).WithRR(rr); 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);
expr = new InvocationExpression(mre, argumentExpressions);
}
return expr.WithILInstruction(inst).WithRR(rr);
} }
} }

Loading…
Cancel
Save