Browse Source

Merge branch 'master' of git://github.com/icsharpcode/ILSpy into Debugger

pull/191/merge
Eusebiu Marcu 15 years ago
parent
commit
264bbb1388
  1. 30
      ICSharpCode.Decompiler/Ast/AstBuilder.cs
  2. 24
      ILSpy/CSharpLanguage.cs

30
ICSharpCode.Decompiler/Ast/AstBuilder.cs

@ -33,6 +33,7 @@ namespace ICSharpCode.Decompiler.Ast
DecompilerContext context = new DecompilerContext(); DecompilerContext context = new DecompilerContext();
CompilationUnit astCompileUnit = new CompilationUnit(); CompilationUnit astCompileUnit = new CompilationUnit();
Dictionary<string, NamespaceDeclaration> astNamespaces = new Dictionary<string, NamespaceDeclaration>(); Dictionary<string, NamespaceDeclaration> astNamespaces = new Dictionary<string, NamespaceDeclaration>();
bool transformationsHaveRun;
public AstBuilder(DecompilerContext context) public AstBuilder(DecompilerContext context)
{ {
@ -75,16 +76,37 @@ namespace ICSharpCode.Decompiler.Ast
return false; return false;
} }
public void GenerateCode(ITextOutput output) /// <summary>
/// Runs the C# transformations on the compilation unit.
/// </summary>
public void RunTransformations()
{ {
GenerateCode(output, null); RunTransformations(null);
} }
public void GenerateCode(ITextOutput output, Predicate<IAstTransform> transformAbortCondition) public void RunTransformations(Predicate<IAstTransform> transformAbortCondition)
{ {
TransformationPipeline.RunTransformationsUntil(astCompileUnit, transformAbortCondition, context); TransformationPipeline.RunTransformationsUntil(astCompileUnit, transformAbortCondition, context);
astCompileUnit.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true }, null); transformationsHaveRun = true;
}
/// <summary>
/// Gets the abstract source tree.
/// </summary>
public CompilationUnit CompilationUnit {
get { return astCompileUnit; }
}
/// <summary>
/// Generates C# code from the abstract source tree.
/// </summary>
/// <remarks>This method adds ParenthesizedExpressions into the AST, and will run transformations if <see cref="RunTransformations"/> was not called explicitly</remarks>
public void GenerateCode(ITextOutput output)
{
if (!transformationsHaveRun)
RunTransformations();
astCompileUnit.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true }, null);
var outputFormatter = new TextOutputFormatter(output); var outputFormatter = new TextOutputFormatter(output);
var formattingPolicy = new CSharpFormattingPolicy(); var formattingPolicy = new CSharpFormattingPolicy();
// disable whitespace in front of parentheses: // disable whitespace in front of parentheses:

24
ILSpy/CSharpLanguage.cs

@ -85,7 +85,8 @@ namespace ICSharpCode.ILSpy
WriteCommentLine(output, TypeToString(method.DeclaringType, includeNamespace: true)); WriteCommentLine(output, TypeToString(method.DeclaringType, includeNamespace: true));
AstBuilder codeDomBuilder = CreateAstBuilder(options, method.DeclaringType); AstBuilder codeDomBuilder = CreateAstBuilder(options, method.DeclaringType);
codeDomBuilder.AddMethod(method); codeDomBuilder.AddMethod(method);
codeDomBuilder.GenerateCode(output, transformAbortCondition); codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(output);
} }
public override void DecompileProperty(PropertyDefinition property, ITextOutput output, DecompilationOptions options) public override void DecompileProperty(PropertyDefinition property, ITextOutput output, DecompilationOptions options)
@ -93,7 +94,8 @@ namespace ICSharpCode.ILSpy
WriteCommentLine(output, TypeToString(property.DeclaringType, includeNamespace: true)); WriteCommentLine(output, TypeToString(property.DeclaringType, includeNamespace: true));
AstBuilder codeDomBuilder = CreateAstBuilder(options, property.DeclaringType); AstBuilder codeDomBuilder = CreateAstBuilder(options, property.DeclaringType);
codeDomBuilder.AddProperty(property); codeDomBuilder.AddProperty(property);
codeDomBuilder.GenerateCode(output, transformAbortCondition); codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(output);
} }
public override void DecompileField(FieldDefinition field, ITextOutput output, DecompilationOptions options) public override void DecompileField(FieldDefinition field, ITextOutput output, DecompilationOptions options)
@ -101,7 +103,8 @@ namespace ICSharpCode.ILSpy
WriteCommentLine(output, TypeToString(field.DeclaringType, includeNamespace: true)); WriteCommentLine(output, TypeToString(field.DeclaringType, includeNamespace: true));
AstBuilder codeDomBuilder = CreateAstBuilder(options, field.DeclaringType); AstBuilder codeDomBuilder = CreateAstBuilder(options, field.DeclaringType);
codeDomBuilder.AddField(field); codeDomBuilder.AddField(field);
codeDomBuilder.GenerateCode(output, transformAbortCondition); codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(output);
} }
public override void DecompileEvent(EventDefinition ev, ITextOutput output, DecompilationOptions options) public override void DecompileEvent(EventDefinition ev, ITextOutput output, DecompilationOptions options)
@ -109,14 +112,16 @@ namespace ICSharpCode.ILSpy
WriteCommentLine(output, TypeToString(ev.DeclaringType, includeNamespace: true)); WriteCommentLine(output, TypeToString(ev.DeclaringType, includeNamespace: true));
AstBuilder codeDomBuilder = CreateAstBuilder(options, ev.DeclaringType); AstBuilder codeDomBuilder = CreateAstBuilder(options, ev.DeclaringType);
codeDomBuilder.AddEvent(ev); codeDomBuilder.AddEvent(ev);
codeDomBuilder.GenerateCode(output, transformAbortCondition); codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(output);
} }
public override void DecompileType(TypeDefinition type, ITextOutput output, DecompilationOptions options) public override void DecompileType(TypeDefinition type, ITextOutput output, DecompilationOptions options)
{ {
AstBuilder codeDomBuilder = CreateAstBuilder(options, type); AstBuilder codeDomBuilder = CreateAstBuilder(options, type);
codeDomBuilder.AddType(type); codeDomBuilder.AddType(type);
codeDomBuilder.GenerateCode(output, transformAbortCondition); codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(output);
} }
public override void DecompileAssembly(AssemblyDefinition assembly, string fileName, ITextOutput output, DecompilationOptions options) public override void DecompileAssembly(AssemblyDefinition assembly, string fileName, ITextOutput output, DecompilationOptions options)
@ -130,7 +135,8 @@ namespace ICSharpCode.ILSpy
base.DecompileAssembly(assembly, fileName, output, options); base.DecompileAssembly(assembly, fileName, output, options);
AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: null); AstBuilder codeDomBuilder = CreateAstBuilder(options, currentType: null);
codeDomBuilder.AddAssembly(assembly, onlyAssemblyLevel: !options.FullDecompilation); codeDomBuilder.AddAssembly(assembly, onlyAssemblyLevel: !options.FullDecompilation);
codeDomBuilder.GenerateCode(output, transformAbortCondition); codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(output);
} }
} }
@ -291,9 +297,11 @@ namespace ICSharpCode.ILSpy
delegate (IGrouping<string, TypeDefinition> file) { delegate (IGrouping<string, TypeDefinition> file) {
using (StreamWriter w = new StreamWriter(Path.Combine(options.SaveAsProjectDirectory, file.Key))) { using (StreamWriter w = new StreamWriter(Path.Combine(options.SaveAsProjectDirectory, file.Key))) {
AstBuilder codeDomBuilder = CreateAstBuilder(options, null); AstBuilder codeDomBuilder = CreateAstBuilder(options, null);
foreach (TypeDefinition type in file) foreach (TypeDefinition type in file) {
codeDomBuilder.AddType(type); codeDomBuilder.AddType(type);
codeDomBuilder.GenerateCode(new PlainTextOutput(w), transformAbortCondition); }
codeDomBuilder.RunTransformations(transformAbortCondition);
codeDomBuilder.GenerateCode(new PlainTextOutput(w));
} }
}); });
AstMethodBodyBuilder.PrintNumberOfUnhandledOpcodes(); AstMethodBodyBuilder.PrintNumberOfUnhandledOpcodes();

Loading…
Cancel
Save