示例#1
0
        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();

        }
示例#2
0
        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();
            }
        }