Browse Source

Add ILAstWritingOptions parameter to ILInstruction.WriteTo().

pull/870/head
Daniel Grunwald 8 years ago
parent
commit
66d1b744c3
  1. 2
      ICSharpCode.Decompiler/IL/ILReader.cs
  2. 120
      ICSharpCode.Decompiler/IL/Instructions.cs
  3. 12
      ICSharpCode.Decompiler/IL/Instructions.tt
  4. 6
      ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs
  5. 6
      ICSharpCode.Decompiler/IL/Instructions/Block.cs
  6. 4
      ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs
  7. 2
      ICSharpCode.Decompiler/IL/Instructions/Branch.cs
  8. 4
      ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs
  9. 6
      ICSharpCode.Decompiler/IL/Instructions/Comp.cs
  10. 6
      ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs
  11. 4
      ICSharpCode.Decompiler/IL/Instructions/Conv.cs
  12. 4
      ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs
  13. 8
      ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs
  14. 8
      ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs
  15. 4
      ICSharpCode.Decompiler/IL/Instructions/LdLen.cs
  16. 4
      ICSharpCode.Decompiler/IL/Instructions/Leave.cs
  17. 14
      ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs
  18. 6
      ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs
  19. 8
      ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs
  20. 12
      ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs
  21. 26
      ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs
  22. 11
      ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs

2
ICSharpCode.Decompiler/IL/ILReader.cs

@ -300,7 +300,7 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' '); output.Write(' ');
output.WriteDefinition("IL_" + inst.ILRange.Start.ToString("x4"), inst.ILRange.Start); output.WriteDefinition("IL_" + inst.ILRange.Start.ToString("x4"), inst.ILRange.Start);
output.Write(": "); output.Write(": ");
inst.WriteTo(output); inst.WriteTo(output, new ILAstWritingOptions());
output.WriteLine(); output.WriteLine();
} }
new Disassembler.MethodBodyDisassembler(output, false, cancellationToken).WriteExceptionHandlers(body); new Disassembler.MethodBodyDisassembler(output, false, cancellationToken).WriteExceptionHandlers(body);

120
ICSharpCode.Decompiler/IL/Instructions.cs

@ -281,11 +281,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None; return InstructionFlags.None;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');
this.argument.WriteTo(output); this.argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
} }
@ -373,13 +373,13 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None; return InstructionFlags.None;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');
this.left.WriteTo(output); this.left.WriteTo(output, options);
output.Write(", "); output.Write(", ");
this.right.WriteTo(output); this.right.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
} }
@ -800,15 +800,15 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayWriteLocals; return InstructionFlags.MayWriteLocals;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
variable.WriteTo(output); variable.WriteTo(output);
output.Write('('); output.Write('(');
this.init.WriteTo(output); this.init.WriteTo(output, options);
output.Write(", "); output.Write(", ");
this.body.WriteTo(output); this.body.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -1910,7 +1910,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayReadLocals; return InstructionFlags.MayReadLocals;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -1984,7 +1984,7 @@ namespace ICSharpCode.Decompiler.IL
Debug.Assert(phase <= ILPhase.InILReader || this.IsDescendantOf(variable.Function)); Debug.Assert(phase <= ILPhase.InILReader || this.IsDescendantOf(variable.Function));
Debug.Assert(phase <= ILPhase.InILReader || variable.Function.Variables[variable.IndexInFunction] == variable); Debug.Assert(phase <= ILPhase.InILReader || variable.Function.Variables[variable.IndexInFunction] == variable);
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2115,13 +2115,13 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayWriteLocals; return InstructionFlags.MayWriteLocals;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
variable.WriteTo(output); variable.WriteTo(output);
output.Write('('); output.Write('(');
this.value.WriteTo(output); this.value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -2209,11 +2209,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None; return InstructionFlags.None;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');
this.value.WriteTo(output); this.value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -2246,7 +2246,7 @@ namespace ICSharpCode.Decompiler.IL
} }
public readonly string Value; public readonly string Value;
public override StackType ResultType { get { return StackType.O; } } public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2282,7 +2282,7 @@ namespace ICSharpCode.Decompiler.IL
} }
public readonly int Value; public readonly int Value;
public override StackType ResultType { get { return StackType.I4; } } public override StackType ResultType { get { return StackType.I4; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2318,7 +2318,7 @@ namespace ICSharpCode.Decompiler.IL
} }
public readonly long Value; public readonly long Value;
public override StackType ResultType { get { return StackType.I8; } } public override StackType ResultType { get { return StackType.I8; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2354,7 +2354,7 @@ namespace ICSharpCode.Decompiler.IL
} }
public readonly double Value; public readonly double Value;
public override StackType ResultType { get { return StackType.F; } } public override StackType ResultType { get { return StackType.F; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2390,7 +2390,7 @@ namespace ICSharpCode.Decompiler.IL
} }
public readonly decimal Value; public readonly decimal Value;
public override StackType ResultType { get { return StackType.O; } } public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2456,7 +2456,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the method operand.</summary> /// <summary>Returns the method operand.</summary>
public IMethod Method { get { return method; } } public IMethod Method { get { return method; } }
public override StackType ResultType { get { return StackType.I; } } public override StackType ResultType { get { return StackType.I; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2503,13 +2503,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow; return base.DirectFlags | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, method); Disassembler.DisassemblerHelpers.WriteOperand(output, method);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -2544,7 +2544,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary> /// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } } public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.O; } } public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2582,7 +2582,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the token operand.</summary> /// <summary>Returns the token operand.</summary>
public IMember Member { get { return member; } } public IMember Member { get { return member; } }
public override StackType ResultType { get { return StackType.O; } } public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2715,13 +2715,13 @@ namespace ICSharpCode.Decompiler.IL
return (DelayExceptions ? InstructionFlags.None : InstructionFlags.MayThrow); return (DelayExceptions ? InstructionFlags.None : InstructionFlags.MayThrow);
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, field); Disassembler.DisassemblerHelpers.WriteOperand(output, field);
output.Write('('); output.Write('(');
this.target.WriteTo(output); this.target.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -2756,7 +2756,7 @@ namespace ICSharpCode.Decompiler.IL
readonly IField field; readonly IField field;
/// <summary>Returns the field operand.</summary> /// <summary>Returns the field operand.</summary>
public IField Field { get { return field; } } public IField Field { get { return field; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -2803,13 +2803,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow; return base.DirectFlags | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -2844,13 +2844,13 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary> /// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } } public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.O; } } public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -2946,7 +2946,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.SideEffect | InstructionFlags.MayThrow; return InstructionFlags.SideEffect | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
if (IsVolatile) if (IsVolatile)
output.Write("volatile."); output.Write("volatile.");
@ -2956,7 +2956,7 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
this.target.WriteTo(output); this.target.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3070,7 +3070,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.SideEffect | InstructionFlags.MayThrow; return InstructionFlags.SideEffect | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
if (IsVolatile) if (IsVolatile)
output.Write("volatile."); output.Write("volatile.");
@ -3080,9 +3080,9 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
this.target.WriteTo(output); this.target.WriteTo(output, options);
output.Write(", "); output.Write(", ");
this.value.WriteTo(output); this.value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3126,13 +3126,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.SideEffect | InstructionFlags.MayThrow; return base.DirectFlags | InstructionFlags.SideEffect | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3176,13 +3176,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow; return base.DirectFlags | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3226,13 +3226,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.SideEffect | InstructionFlags.MayThrow; return base.DirectFlags | InstructionFlags.SideEffect | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3336,7 +3336,7 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayThrow; return InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -3345,7 +3345,7 @@ namespace ICSharpCode.Decompiler.IL
bool first = true; bool first = true;
foreach (var indices in Indices) { foreach (var indices in Indices) {
if (!first) output.Write(", "); else first = false; if (!first) output.Write(", "); else first = false;
indices.WriteTo(output); indices.WriteTo(output, options);
} }
output.Write(')'); output.Write(')');
} }
@ -3381,7 +3381,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary> /// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } } public IType Type { get { return type; } }
public override StackType ResultType { get { return type.GetStackType(); } } public override StackType ResultType { get { return type.GetStackType(); } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -3493,7 +3493,7 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary> /// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } } public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.I4; } } public override StackType ResultType { get { return StackType.I4; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
@ -3678,7 +3678,7 @@ namespace ICSharpCode.Decompiler.IL
return (DelayExceptions ? InstructionFlags.None : InstructionFlags.MayThrow); return (DelayExceptions ? InstructionFlags.None : InstructionFlags.MayThrow);
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
if (IsReadOnly) if (IsReadOnly)
output.Write("readonly."); output.Write("readonly.");
@ -3686,10 +3686,10 @@ namespace ICSharpCode.Decompiler.IL
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
this.array.WriteTo(output); this.array.WriteTo(output, options);
foreach (var indices in Indices) { foreach (var indices in Indices) {
output.Write(", "); output.Write(", ");
indices.WriteTo(output); indices.WriteTo(output, options);
} }
output.Write(')'); output.Write(')');
} }
@ -3779,11 +3779,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.None; return InstructionFlags.None;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');
this.array.WriteTo(output); this.array.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3818,13 +3818,13 @@ namespace ICSharpCode.Decompiler.IL
/// <summary>Returns the type operand.</summary> /// <summary>Returns the type operand.</summary>
public IType Type { get { return type; } } public IType Type { get { return type; } }
public override StackType ResultType { get { return StackType.O; } } public override StackType ResultType { get { return StackType.O; } }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3896,13 +3896,13 @@ namespace ICSharpCode.Decompiler.IL
return base.DirectFlags | InstructionFlags.MayThrow; return base.DirectFlags | InstructionFlags.MayThrow;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');
Disassembler.DisassemblerHelpers.WriteOperand(output, type); Disassembler.DisassemblerHelpers.WriteOperand(output, type);
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -3990,11 +3990,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.MayBranch | InstructionFlags.SideEffect; return InstructionFlags.MayBranch | InstructionFlags.SideEffect;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');
this.value.WriteTo(output); this.value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -4082,11 +4082,11 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.SideEffect; return InstructionFlags.SideEffect;
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');
this.value.WriteTo(output); this.value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
public override void AcceptVisitor(ILVisitor visitor) public override void AcceptVisitor(ILVisitor visitor)
@ -4143,7 +4143,7 @@ namespace ICSharpCode.Decompiler.IL.Patterns
var clone = (AnyNode)ShallowClone(); var clone = (AnyNode)ShallowClone();
return clone; return clone;
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('('); output.Write('(');

12
ICSharpCode.Decompiler/IL/Instructions.tt

@ -277,7 +277,7 @@ namespace <#=opCode.Namespace#>
} }
<# } #> <# } #>
<# if (opCode.GenerateWriteTo) { #> <# if (opCode.GenerateWriteTo) { #>
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{<#=Body(opCode.WriteToBody)#>} {<#=Body(opCode.WriteToBody)#>}
<# } #> <# } #>
<# if (opCode.GenerateAcceptVisitor) { #> <# if (opCode.GenerateAcceptVisitor) { #>
@ -594,7 +594,7 @@ namespace ICSharpCode.Decompiler.IL
opCode.PerformMatchConditions.Add("this.Argument.PerformMatch(o.Argument, ref match)"); opCode.PerformMatchConditions.Add("this.Argument.PerformMatch(o.Argument, ref match)");
opCode.BaseConstructorArguments.Add("argument"); opCode.BaseConstructorArguments.Add("argument");
opCode.WriteArguments.Add("output.Write('(');"); opCode.WriteArguments.Add("output.Write('(');");
opCode.WriteArguments.Add("Argument.WriteTo(output);"); opCode.WriteArguments.Add("Argument.WriteTo(output, options);");
opCode.WriteArguments.Add("output.Write(')');"); opCode.WriteArguments.Add("output.Write(')');");
}; };
@ -610,9 +610,9 @@ namespace ICSharpCode.Decompiler.IL
opCode.PerformMatchConditions.Add("this.Left.PerformMatch(o.Left, ref match)"); opCode.PerformMatchConditions.Add("this.Left.PerformMatch(o.Left, ref match)");
opCode.PerformMatchConditions.Add("this.Right.PerformMatch(o.Right, ref match)"); opCode.PerformMatchConditions.Add("this.Right.PerformMatch(o.Right, ref match)");
opCode.WriteArguments.Add("output.Write('(');"); opCode.WriteArguments.Add("output.Write('(');");
opCode.WriteArguments.Add("Left.WriteTo(output);"); opCode.WriteArguments.Add("Left.WriteTo(output, options);");
opCode.WriteArguments.Add("output.Write(\", \");"); opCode.WriteArguments.Add("output.Write(\", \");");
opCode.WriteArguments.Add("Right.WriteTo(output);"); opCode.WriteArguments.Add("Right.WriteTo(output, options);");
opCode.WriteArguments.Add("output.Write(')');"); opCode.WriteArguments.Add("output.Write(')');");
}; };
@ -682,7 +682,7 @@ namespace ICSharpCode.Decompiler.IL
opCode.WriteArguments.Add("\toutput.Write(\", \");"); opCode.WriteArguments.Add("\toutput.Write(\", \");");
else else
opCode.WriteArguments.Add("\tif (!first) output.Write(\", \"); else first = false;"); opCode.WriteArguments.Add("\tif (!first) output.Write(\", \"); else first = false;");
opCode.WriteArguments.Add("\t" + arg + ".WriteTo(output);"); opCode.WriteArguments.Add("\t" + arg + ".WriteTo(output, options);");
opCode.WriteArguments.Add("}"); opCode.WriteArguments.Add("}");
opCode.Members.Add("public static readonly SlotInfo " + children[i].SlotName + " = " + children[i].GetSlotInit() + ";"); opCode.Members.Add("public static readonly SlotInfo " + children[i].SlotName + " = " + children[i].GetSlotInit() + ";");
opCode.Members.Add("public InstructionCollection<ILInstruction> " + argProp + " { get; private set; }"); opCode.Members.Add("public InstructionCollection<ILInstruction> " + argProp + " { get; private set; }");
@ -694,7 +694,7 @@ namespace ICSharpCode.Decompiler.IL
opCode.PerformMatchConditions.Add("this." + arg + ".PerformMatch(o." + arg + ", ref match)"); opCode.PerformMatchConditions.Add("this." + arg + ".PerformMatch(o." + arg + ", ref match)");
if (i > 0) if (i > 0)
opCode.WriteArguments.Add("output.Write(\", \");"); opCode.WriteArguments.Add("output.Write(\", \");");
opCode.WriteArguments.Add("this." + arg + ".WriteTo(output);"); opCode.WriteArguments.Add("this." + arg + ".WriteTo(output, options);");
opCode.Members.Add("public static readonly SlotInfo " + children[i].SlotName + " = " + children[i].GetSlotInit() + ";"); opCode.Members.Add("public static readonly SlotInfo " + children[i].SlotName + " = " + children[i].GetSlotInit() + ";");
opCode.Members.Add("ILInstruction " + arg + ";"); opCode.Members.Add("ILInstruction " + arg + ";");
opCode.Members.Add("public ILInstruction " + argProp + " {" + Environment.NewLine opCode.Members.Add("public ILInstruction " + argProp + " {" + Environment.NewLine

6
ICSharpCode.Decompiler/IL/Instructions/BinaryNumericInstruction.cs

@ -176,7 +176,7 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write("." + GetOperatorName(Operator)); output.Write("." + GetOperatorName(Operator));
@ -192,9 +192,9 @@ namespace ICSharpCode.Decompiler.IL
output.Write(".lifted"); output.Write(".lifted");
} }
output.Write('('); output.Write('(');
Left.WriteTo(output); Left.WriteTo(output, options);
output.Write(", "); output.Write(", ");
Right.WriteTo(output); Right.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
} }

6
ICSharpCode.Decompiler/IL/Instructions/Block.cs

@ -124,7 +124,7 @@ namespace ICSharpCode.Decompiler.IL
get { return Disassembler.DisassemblerHelpers.OffsetToString(this.ILRange.Start); } get { return Disassembler.DisassemblerHelpers.OffsetToString(this.ILRange.Start); }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write("Block "); output.Write("Block ");
output.WriteDefinition(Label, this); output.WriteDefinition(Label, this);
@ -135,12 +135,12 @@ namespace ICSharpCode.Decompiler.IL
output.WriteLine(" {"); output.WriteLine(" {");
output.Indent(); output.Indent();
foreach (var inst in Instructions) { foreach (var inst in Instructions) {
inst.WriteTo(output); inst.WriteTo(output, options);
output.WriteLine(); output.WriteLine();
} }
if (finalInstruction.OpCode != OpCode.Nop) { if (finalInstruction.OpCode != OpCode.Nop) {
output.Write("final: "); output.Write("final: ");
finalInstruction.WriteTo(output); finalInstruction.WriteTo(output, options);
output.WriteLine(); output.WriteLine();
} }
output.Unindent(); output.Unindent();

4
ICSharpCode.Decompiler/IL/Instructions/BlockContainer.cs

@ -105,7 +105,7 @@ namespace ICSharpCode.Decompiler.IL
entryPoint.IncomingEdgeCount--; entryPoint.IncomingEdgeCount--;
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.WriteDefinition("BlockContainer", this); output.WriteDefinition("BlockContainer", this);
output.Write(' '); output.Write(' ');
@ -114,7 +114,7 @@ namespace ICSharpCode.Decompiler.IL
output.Indent(); output.Indent();
foreach (var inst in Blocks) { foreach (var inst in Blocks) {
if (inst.Parent == this) { if (inst.Parent == this) {
inst.WriteTo(output); inst.WriteTo(output, options);
} else { } else {
output.Write("stale reference to "); output.Write("stale reference to ");
output.WriteReference(inst.Label, inst, isLocal: true); output.WriteReference(inst.Label, inst, isLocal: true);

2
ICSharpCode.Decompiler/IL/Instructions/Branch.cs

@ -106,7 +106,7 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(' '); output.Write(' ');

4
ICSharpCode.Decompiler/IL/Instructions/CallInstruction.cs

@ -74,7 +74,7 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
if (ConstrainedTo != null) { if (ConstrainedTo != null) {
output.Write("constrained."); output.Write("constrained.");
@ -89,7 +89,7 @@ namespace ICSharpCode.Decompiler.IL
for (int i = 0; i < Arguments.Count; i++) { for (int i = 0; i < Arguments.Count; i++) {
if (i > 0) if (i > 0)
output.Write(", "); output.Write(", ");
Arguments[i].WriteTo(output); Arguments[i].WriteTo(output, options);
} }
output.Write(')'); output.Write(')');
} }

6
ICSharpCode.Decompiler/IL/Instructions/Comp.cs

@ -173,7 +173,7 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
switch (Sign) { switch (Sign) {
@ -193,11 +193,11 @@ namespace ICSharpCode.Decompiler.IL
break; break;
} }
output.Write('('); output.Write('(');
Left.WriteTo(output); Left.WriteTo(output, options);
output.Write(' '); output.Write(' ');
output.Write(Kind.GetToken()); output.Write(Kind.GetToken());
output.Write(' '); output.Write(' ');
Right.WriteTo(output); Right.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }

6
ICSharpCode.Decompiler/IL/Instructions/CompoundAssignmentInstruction.cs

@ -123,7 +123,7 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write("." + GetOperatorName(Operator)); output.Write("." + GetOperatorName(Operator));
@ -138,9 +138,9 @@ namespace ICSharpCode.Decompiler.IL
else if (Sign == Sign.Signed) else if (Sign == Sign.Signed)
output.Write(".signed"); output.Write(".signed");
output.Write('('); output.Write('(');
Target.WriteTo(output); Target.WriteTo(output, options);
output.Write(", "); output.Write(", ");
Value.WriteTo(output); Value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
} }

4
ICSharpCode.Decompiler/IL/Instructions/Conv.cs

@ -258,7 +258,7 @@ namespace ICSharpCode.Decompiler.IL
get => TargetType.GetStackType(); get => TargetType.GetStackType();
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
if (CheckForOverflow) { if (CheckForOverflow) {
@ -289,7 +289,7 @@ namespace ICSharpCode.Decompiler.IL
break; break;
} }
output.Write('('); output.Write('(');
Argument.WriteTo(output); Argument.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }

4
ICSharpCode.Decompiler/IL/Instructions/ILFunction.cs

@ -78,7 +78,7 @@ namespace ICSharpCode.Decompiler.IL
throw new NotImplementedException(); throw new NotImplementedException();
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
if (Method != null) { if (Method != null) {
@ -102,7 +102,7 @@ namespace ICSharpCode.Decompiler.IL
} }
output.MarkFoldEnd(); output.MarkFoldEnd();
output.WriteLine(); output.WriteLine();
body.WriteTo(output); body.WriteTo(output, options);
output.WriteLine(); output.WriteLine();
output.Unindent(); output.Unindent();

8
ICSharpCode.Decompiler/IL/Instructions/ILInstruction.cs

@ -212,12 +212,12 @@ namespace ICSharpCode.Decompiler.IL
/// <summary> /// <summary>
/// Writes the ILAst to the text output. /// Writes the ILAst to the text output.
/// </summary> /// </summary>
public abstract void WriteTo(ITextOutput output); public abstract void WriteTo(ITextOutput output, ILAstWritingOptions options);
public override string ToString() public override string ToString()
{ {
var output = new PlainTextOutput(); var output = new PlainTextOutput();
WriteTo(output); WriteTo(output, new ILAstWritingOptions());
if (!ILRange.IsEmpty) { if (!ILRange.IsEmpty) {
output.Write(" at IL_" + ILRange.Start.ToString("x4")); output.Write(" at IL_" + ILRange.Start.ToString("x4"));
} }
@ -740,4 +740,8 @@ namespace ICSharpCode.Decompiler.IL
/// </summary> /// </summary>
StackType UnderlyingResultType { get; } StackType UnderlyingResultType { get; }
} }
public class ILAstWritingOptions
{
}
} }

8
ICSharpCode.Decompiler/IL/Instructions/IfInstruction.cs

@ -76,16 +76,16 @@ namespace ICSharpCode.Decompiler.IL
return InstructionFlags.ControlFlow | condition.Flags | SemanticHelper.CombineBranches(trueInst.Flags, falseInst.Flags); return InstructionFlags.ControlFlow | condition.Flags | SemanticHelper.CombineBranches(trueInst.Flags, falseInst.Flags);
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write(" ("); output.Write(" (");
condition.WriteTo(output); condition.WriteTo(output, options);
output.Write(") "); output.Write(") ");
trueInst.WriteTo(output); trueInst.WriteTo(output, options);
if (falseInst.OpCode != OpCode.Nop) { if (falseInst.OpCode != OpCode.Nop) {
output.Write(" else "); output.Write(" else ");
falseInst.WriteTo(output); falseInst.WriteTo(output, options);
} }
} }
} }

4
ICSharpCode.Decompiler/IL/Instructions/LdLen.cs

@ -38,13 +38,13 @@ namespace ICSharpCode.Decompiler.IL
get { return resultType; } get { return resultType; }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write('.'); output.Write('.');
output.Write(resultType); output.Write(resultType);
output.Write('('); output.Write('(');
this.array.WriteTo(output); this.array.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
} }

4
ICSharpCode.Decompiler/IL/Instructions/Leave.cs

@ -100,14 +100,14 @@ namespace ICSharpCode.Decompiler.IL
Debug.Assert(phase <= ILPhase.InILReader || value.ResultType == targetContainer.ResultType); Debug.Assert(phase <= ILPhase.InILReader || value.ResultType == targetContainer.ResultType);
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
if (targetContainer != null) { if (targetContainer != null) {
output.Write(' '); output.Write(' ');
output.WriteReference(TargetLabel, targetContainer, isLocal: true); output.WriteReference(TargetLabel, targetContainer, isLocal: true);
output.Write(" ("); output.Write(" (");
value.WriteTo(output); value.WriteTo(output, options);
output.Write(')'); output.Write(')');
} }
} }

14
ICSharpCode.Decompiler/IL/Instructions/LockInstruction.cs

@ -17,16 +17,12 @@ namespace ICSharpCode.Decompiler.IL
public override StackType ResultType => StackType.Void; public override StackType ResultType => StackType.Void;
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(".lock ("); output.Write("lock (");
OnExpression.WriteTo(output); OnExpression.WriteTo(output, options);
output.WriteLine(") {"); output.WriteLine(") ");
output.Indent(); Body.WriteTo(output, options);
Body.WriteTo(output);
output.Unindent();
output.WriteLine();
output.Write("}");
} }
} }
} }

6
ICSharpCode.Decompiler/IL/Instructions/NullCoalescingInstruction.cs

@ -89,13 +89,13 @@ namespace ICSharpCode.Decompiler.IL
| SemanticHelper.CombineBranches(InstructionFlags.None, fallbackInst.Flags); | SemanticHelper.CombineBranches(InstructionFlags.None, fallbackInst.Flags);
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
output.Write("("); output.Write("(");
valueInst.WriteTo(output); valueInst.WriteTo(output, options);
output.Write(", "); output.Write(", ");
fallbackInst.WriteTo(output); fallbackInst.WriteTo(output, options);
output.Write(")"); output.Write(")");
} }
} }

8
ICSharpCode.Decompiler/IL/Instructions/SimpleInstruction.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.Decompiler.IL
/// </summary> /// </summary>
public abstract partial class SimpleInstruction : ILInstruction public abstract partial class SimpleInstruction : ILInstruction
{ {
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
// the non-custom WriteTo would add useless parentheses // the non-custom WriteTo would add useless parentheses
@ -35,7 +35,7 @@ namespace ICSharpCode.Decompiler.IL
{ {
public string Comment; public string Comment;
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
if (!string.IsNullOrEmpty(Comment)) { if (!string.IsNullOrEmpty(Comment)) {
@ -58,7 +58,7 @@ namespace ICSharpCode.Decompiler.IL
get { return ExpectedResultType; } get { return ExpectedResultType; }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
if (!string.IsNullOrEmpty(Message)) { if (!string.IsNullOrEmpty(Message)) {
@ -84,7 +84,7 @@ namespace ICSharpCode.Decompiler.IL
get { return ExpectedResultType; } get { return ExpectedResultType; }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(OpCode); output.Write(OpCode);
if (!string.IsNullOrEmpty(Message)) { if (!string.IsNullOrEmpty(Message)) {

12
ICSharpCode.Decompiler/IL/Instructions/SwitchInstruction.cs

@ -79,19 +79,19 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write("switch ("); output.Write("switch (");
value.WriteTo(output); value.WriteTo(output, options);
output.Write(") "); output.Write(") ");
output.MarkFoldStart("{...}"); output.MarkFoldStart("{...}");
output.WriteLine("{"); output.WriteLine("{");
output.Indent(); output.Indent();
output.Write("default: "); output.Write("default: ");
defaultBody.WriteTo(output); defaultBody.WriteTo(output, options);
output.WriteLine(); output.WriteLine();
foreach (var section in this.Sections) { foreach (var section in this.Sections) {
section.WriteTo(output); section.WriteTo(output, options);
output.WriteLine(); output.WriteLine();
} }
output.Unindent(); output.Unindent();
@ -175,13 +175,13 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write("case "); output.Write("case ");
output.Write(Labels.ToString()); output.Write(Labels.ToString());
output.Write(": "); output.Write(": ");
body.WriteTo(output); body.WriteTo(output, options);
} }
} }
} }

26
ICSharpCode.Decompiler/IL/Instructions/TryInstruction.cs

@ -65,13 +65,13 @@ namespace ICSharpCode.Decompiler.IL
return clone; return clone;
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(".try "); output.Write(".try ");
TryBlock.WriteTo(output); TryBlock.WriteTo(output, options);
foreach (var handler in Handlers) { foreach (var handler in Handlers) {
output.Write(' '); output.Write(' ');
handler.WriteTo(output); handler.WriteTo(output, options);
} }
} }
@ -159,7 +159,7 @@ namespace ICSharpCode.Decompiler.IL
} }
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write("catch "); output.Write("catch ");
if (variable != null) { if (variable != null) {
@ -167,11 +167,11 @@ namespace ICSharpCode.Decompiler.IL
output.Write(" : "); output.Write(" : ");
Disassembler.DisassemblerHelpers.WriteOperand(output, variable.Type); Disassembler.DisassemblerHelpers.WriteOperand(output, variable.Type);
} }
output.Write(" if ("); output.Write(" when (");
filter.WriteTo(output); filter.WriteTo(output, options);
output.Write(')'); output.Write(')');
output.Write(' '); output.Write(' ');
body.WriteTo(output); body.WriteTo(output, options);
} }
} }
@ -200,12 +200,12 @@ namespace ICSharpCode.Decompiler.IL
}; };
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(".try "); output.Write(".try ");
TryBlock.WriteTo(output); TryBlock.WriteTo(output, options);
output.Write(" finally "); output.Write(" finally ");
finallyBlock.WriteTo(output); finallyBlock.WriteTo(output, options);
} }
public override StackType ResultType { public override StackType ResultType {
@ -295,12 +295,12 @@ namespace ICSharpCode.Decompiler.IL
}; };
} }
public override void WriteTo(ITextOutput output) public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{ {
output.Write(".try "); output.Write(".try ");
TryBlock.WriteTo(output); TryBlock.WriteTo(output, options);
output.Write(" fault "); output.Write(" fault ");
faultBlock.WriteTo(output); faultBlock.WriteTo(output, options);
} }
public override StackType ResultType { public override StackType ResultType {

11
ICSharpCode.Decompiler/IL/Instructions/UnaryInstruction.cs

@ -48,5 +48,16 @@ namespace ICSharpCode.Decompiler.IL
Debug.Assert(IsLifted == (ResultType == StackType.O)); Debug.Assert(IsLifted == (ResultType == StackType.O));
Debug.Assert(IsLifted || ResultType == UnderlyingResultType); Debug.Assert(IsLifted || ResultType == UnderlyingResultType);
} }
public override void WriteTo(ITextOutput output, ILAstWritingOptions options)
{
output.Write(OpCode);
if (IsLifted) {
output.Write(".lifted");
}
output.Write('(');
this.Argument.WriteTo(output, options);
output.Write(')');
}
} }
} }

Loading…
Cancel
Save