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 @@ -33,6 +33,7 @@ namespace ICSharpCode.Decompiler.Ast
DecompilerContext context = new DecompilerContext();
CompilationUnit astCompileUnit = new CompilationUnit();
Dictionary<string, NamespaceDeclaration> astNamespaces = new Dictionary<string, NamespaceDeclaration>();
bool transformationsHaveRun;
public AstBuilder(DecompilerContext context)
{
@ -75,16 +76,37 @@ namespace ICSharpCode.Decompiler.Ast @@ -75,16 +76,37 @@ namespace ICSharpCode.Decompiler.Ast
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);
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 formattingPolicy = new CSharpFormattingPolicy();
// disable whitespace in front of parentheses:

24
ILSpy/CSharpLanguage.cs

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

Loading…
Cancel
Save