diff --git a/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs b/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs index 0e0e8dbd3..69e1721aa 100644 --- a/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs +++ b/ICSharpCode.Decompiler/Ast/AstMethodBodyBuilder.cs @@ -747,6 +747,8 @@ namespace ICSharpCode.Decompiler.Ast } case ILCode.InitializedObject: return new InitializedObjectExpression(); + case ILCode.Wrap: + return new ParenthesizedExpression(arg1); case ILCode.AddressOf: return MakeRef(arg1); default: diff --git a/ICSharpCode.Decompiler/ILAst/ILCodes.cs b/ICSharpCode.Decompiler/ILAst/ILCodes.cs index ddddf2b70..46a269259 100644 --- a/ICSharpCode.Decompiler/ILAst/ILCodes.cs +++ b/ICSharpCode.Decompiler/ILAst/ILCodes.cs @@ -258,6 +258,11 @@ namespace ICSharpCode.Decompiler.ILAst LogicOr, NullCoalescing, InitArray, // Array Initializer + + /// + /// Defines a barrier between the parent opcode and argument opcode that prevents combining them + /// + Wrap, // new Class { Prop = 1, Collection = { { 2, 3 }, {4, 5} }} // is represented as: diff --git a/ICSharpCode.Decompiler/ILAst/NullableOperators.cs b/ICSharpCode.Decompiler/ILAst/NullableOperators.cs index 5a638fc34..e830484bf 100644 --- a/ICSharpCode.Decompiler/ILAst/NullableOperators.cs +++ b/ICSharpCode.Decompiler/ILAst/NullableOperators.cs @@ -325,10 +325,11 @@ namespace ICSharpCode.Decompiler.ILAst var pm = new PatternMatcher(); if (!pm.Match(ps[i], expr)) continue; var n = pm.BuildNew(OperatorVariableAB, expr); - expr.Code = n.Code; - expr.Operand = n.Operand; - expr.Arguments = n.Arguments; - expr.ILRanges = n.ILRanges; + expr.Code = ILCode.Wrap; + expr.Operand = null; + expr.Arguments.Clear(); + expr.Arguments.Add(n); + expr.ILRanges.Clear(); expr.InferredType = n.InferredType; return true; } diff --git a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs index d9261fcc3..819b5f7ae 100644 --- a/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs +++ b/ICSharpCode.Decompiler/ILAst/TypeAnalysis.cs @@ -749,6 +749,7 @@ namespace ICSharpCode.Decompiler.ILAst #endregion case ILCode.Pop: return null; + case ILCode.Wrap: case ILCode.Dup: return InferTypeForExpression(expr.Arguments.Single(), expectedType); default: