From 0a5eae527ac3087870bae17ff66d9f58c8e21f6b Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 20 Sep 2017 08:31:45 +0200 Subject: [PATCH] Fix links on property setter usages. --- .../CSharp/ExpressionBuilder.cs | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index e8505faef..caef241c1 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -1149,11 +1149,7 @@ namespace ICSharpCode.Decompiler.CSharp var argumentResolveResults = arguments.Select(arg => arg.ResolveResult).ToList(); - ResolveResult rr; - if (inst.Method.IsAccessor) - rr = new MemberResolveResult(target.ResolveResult, method.AccessorOwner); - else - rr = new CSharpInvocationResolveResult(target.ResolveResult, method, argumentResolveResults); + ResolveResult rr = new CSharpInvocationResolveResult(target.ResolveResult, method, argumentResolveResults); if (inst.OpCode == OpCode.NewObj) { var argumentExpressions = arguments.SelectArray(arg => arg.Expression); @@ -1179,10 +1175,9 @@ namespace ICSharpCode.Decompiler.CSharp .WithILInstruction(inst).WithRR(rr); } } else { - Expression expr; int allowedParamCount = (method.ReturnType.IsKnownType(KnownTypeCode.Void) ? 1 : 0); if (method.IsAccessor && (method.AccessorOwner.SymbolKind == SymbolKind.Indexer || method.Parameters.Count == allowedParamCount)) { - expr = HandleAccessorCall(inst, target, method, arguments.ToList()); + return HandleAccessorCall(inst, target, method, arguments.ToList()); } else { bool requireTypeArguments = false; bool targetCasted = false; @@ -1245,9 +1240,8 @@ namespace ICSharpCode.Decompiler.CSharp if (requireTypeArguments && (!settings.AnonymousTypes || !method.TypeArguments.Any(a => a.ContainsAnonymousType()))) mre.TypeArguments.AddRange(method.TypeArguments.Select(ConvertType)); var argumentExpressions = arguments.Select(arg => arg.Expression); - expr = new InvocationExpression(mre, argumentExpressions); + return new InvocationExpression(mre, argumentExpressions).WithILInstruction(inst).WithRR(rr); } - return expr.WithILInstruction(inst).WithRR(rr); } } @@ -1269,22 +1263,25 @@ namespace ICSharpCode.Decompiler.CSharp return true; } - Expression HandleAccessorCall(ILInstruction inst, TranslatedExpression target, IMethod method, IList arguments) + TranslatedExpression HandleAccessorCall(ILInstruction inst, TranslatedExpression target, IMethod method, IList arguments) { var lookup = new MemberLookup(resolver.CurrentTypeDefinition, resolver.CurrentTypeDefinition.ParentAssembly); var result = lookup.Lookup(target.ResolveResult, method.AccessorOwner.Name, EmptyList.Instance, isInvocation:false); if (result.IsError || (result is MemberResolveResult && !IsAppropriateCallTarget(method.AccessorOwner, ((MemberResolveResult)result).Member, inst.OpCode == OpCode.CallVirt))) target = target.ConvertTo(method.AccessorOwner.DeclaringType, this); + var rr = new MemberResolveResult(target.ResolveResult, method.AccessorOwner); if (method.ReturnType.IsKnownType(KnownTypeCode.Void)) { var value = arguments.Last(); arguments.Remove(value); - Expression expr; + TranslatedExpression expr; if (arguments.Count == 0) - expr = new MemberReferenceExpression(target.Expression, method.AccessorOwner.Name); + expr = new MemberReferenceExpression(target.Expression, method.AccessorOwner.Name) + .WithoutILInstruction().WithRR(rr); else - expr = new IndexerExpression(target.Expression, arguments.Select(a => a.Expression)); + expr = new IndexerExpression(target.Expression, arguments.Select(a => a.Expression)) + .WithoutILInstruction().WithRR(rr); var op = AssignmentOperatorType.Assign; var parentEvent = method.AccessorOwner as IEvent; if (parentEvent != null) { @@ -1295,12 +1292,12 @@ namespace ICSharpCode.Decompiler.CSharp op = AssignmentOperatorType.Subtract; } } - return new AssignmentExpression(expr, op, value.Expression); + return new AssignmentExpression(expr, op, value.Expression).WithILInstruction(inst).WithRR(new TypeResolveResult(method.AccessorOwner.ReturnType)); } else { if (arguments.Count == 0) - return new MemberReferenceExpression(target.Expression, method.AccessorOwner.Name); + return new MemberReferenceExpression(target.Expression, method.AccessorOwner.Name).WithILInstruction(inst).WithRR(rr); else - return new IndexerExpression(target.Expression, arguments.Select(a => a.Expression)); + return new IndexerExpression(target.Expression, arguments.Select(a => a.Expression)).WithILInstruction(inst).WithRR(rr); } }