private void DecompileMethod(XMethodDefinition xMethod, ITextOutput output, int indentation=0) { var indent = new string(Enumerable.Repeat('\t', indentation).ToArray()); var ilMethod = xMethod as XBuilder.ILMethodDefinition; if (ilMethod == null || !ilMethod.OriginalMethod.HasBody) { output.Write(indent); output.WriteLine("// not an il method or method without body."); return; } var methodSource = new MethodSource(xMethod, ilMethod.OriginalMethod); var node = MethodBodyCompiler.CreateOptimizedAst(AssemblyCompiler, methodSource, GenerateSetNextInstructionCode, StopConversion); if (StopConversion != StopAstConversion.None) { output.Write(indent); output.Write("// Stop " + StopConversion); output.WriteLine(); output.WriteLine(); } var bridge = new TextOutputBridge(output); for(int i = 0; i < indentation; ++i) bridge.Indent(); FormattingOptions formattingOptions; if (StopConversion == StopAstConversion.AfterILConversion || !BreakExpressionLines) formattingOptions = FormattingOptions.Default; else formattingOptions = FormattingOptions.BreakExpressions; if(!ShowFullNames) formattingOptions |= FormattingOptions.SimpleNames; if(ShowHasSeqPoint) formattingOptions |= FormattingOptions.ShowHasSeqPoint; node.WriteTo(bridge, formattingOptions); for (int i = 0; i < indentation; ++i) bridge.Unindent(); }
private void DecompileMethod(XMethodDefinition xMethod, ITextOutput output, int indentation = 0) { var indent = new string(Enumerable.Repeat('\t', indentation).ToArray()); var ilMethod = xMethod as XBuilder.ILMethodDefinition; if (ilMethod == null || !ilMethod.OriginalMethod.HasBody) { output.Write(indent); output.WriteLine("// not an il method or method without body."); return; } var methodSource = new MethodSource(xMethod, ilMethod.OriginalMethod); var node = MethodBodyCompiler.CreateOptimizedAst(AssemblyCompiler, methodSource, GenerateSetNextInstructionCode, StopConversion, StopOptimizing); bool writeExtraLine = false; if (StopConversion != StopAstConversion.None) { output.Write(indent); output.Write("// Stop Ast Conversion after " + StopConversion); output.WriteLine(); writeExtraLine = true; } if (StopOptimizing != AstOptimizationStep.None) { output.Write(indent); output.Write("// Stop Ast Optimizing before " + StopOptimizing); output.WriteLine(); writeExtraLine = true; } if (writeExtraLine) { output.WriteLine(); } var bridge = new TextOutputBridge(output); for (int i = 0; i < indentation; ++i) { bridge.Indent(); } FormattingOptions formattingOptions; if (StopConversion == StopAstConversion.AfterILConversion || !BreakExpressionLines) { formattingOptions = FormattingOptions.Default; } else { formattingOptions = FormattingOptions.BreakExpressions; } if (!ShowFullNames) { formattingOptions |= FormattingOptions.SimpleNames; } if (ShowHasSeqPoint) { formattingOptions |= FormattingOptions.ShowHasSeqPoint; } node.WriteTo(bridge, formattingOptions); for (int i = 0; i < indentation; ++i) { bridge.Unindent(); } }