From c53b898b55e04cb4b7198f136b1e2dbf8db035be Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 12 May 2018 12:40:17 +0200 Subject: [PATCH] Fix #1122: Error decompiling dictionary initializer referencing parameter variable --- ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs index 9e8bcb83b..2d6d2c096 100644 --- a/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs @@ -1987,7 +1987,7 @@ namespace ICSharpCode.Decompiler.CSharp break; case IL.Transforms.AccessPathKind.Setter: if (lastElement.Indices?.Length > 0) { - var indexer = new IndexerExpression(null, lastElement.Indices.SelectArray(i => Translate(i is LdLoc ld ? indexVariables[ld.Variable] : i).Expression)) + var indexer = new IndexerExpression(null, lastElement.Indices.SelectArray(i => TranslateInitializerIndexerValue(i, indexVariables))) .WithILInstruction(inst).WithRR(memberRR); elementsStack.Peek().Add(Assignment(indexer, Translate(info.Values.Single(), typeHint: indexer.Type))); } else { @@ -2009,6 +2009,14 @@ namespace ICSharpCode.Decompiler.CSharp return expr.WithILInstruction(block); } + Expression TranslateInitializerIndexerValue(ILInstruction inst, Dictionary indexVariables) + { + if (inst is LdLoc ld && indexVariables.TryGetValue(ld.Variable, out var newInst)) { + inst = newInst; + } + return Translate(inst).Expression; + } + Expression MakeInitializerAssignment(IMember method, IL.Transforms.AccessPathElement member, List values, Dictionary indexVariables) { Expression value;