mirror of https://github.com/icsharpcode/ILSpy.git
9 changed files with 280 additions and 74 deletions
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Threading; |
||||
using Mono.Cecil; |
||||
|
||||
namespace Decompiler |
||||
{ |
||||
public class DecompilerContext |
||||
{ |
||||
public CancellationToken CancellationToken; |
||||
public TypeDefinition CurrentType; |
||||
public MethodDefinition CurrentMethod; |
||||
|
||||
public DecompilerContext Clone() |
||||
{ |
||||
return (DecompilerContext)MemberwiseClone(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,69 @@
@@ -0,0 +1,69 @@
|
||||
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
||||
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
|
||||
|
||||
using System; |
||||
using System.Diagnostics; |
||||
using ICSharpCode.NRefactory.CSharp; |
||||
using Mono.Cecil; |
||||
|
||||
namespace Decompiler.Transforms |
||||
{ |
||||
/// <summary>
|
||||
/// Base class for AST visitors that need the current type/method context info.
|
||||
/// </summary>
|
||||
public abstract class ContextTrackingVisitor : DepthFirstAstVisitor<object, object> |
||||
{ |
||||
protected readonly DecompilerContext context; |
||||
|
||||
protected ContextTrackingVisitor(DecompilerContext context) |
||||
{ |
||||
if (context == null) |
||||
throw new ArgumentNullException("context"); |
||||
this.context = context; |
||||
} |
||||
|
||||
public override object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data) |
||||
{ |
||||
TypeDefinition oldType = context.CurrentType; |
||||
try { |
||||
context.CurrentType = typeDeclaration.Annotation<TypeDefinition>(); |
||||
return base.VisitTypeDeclaration(typeDeclaration, data); |
||||
} finally { |
||||
context.CurrentType = oldType; |
||||
} |
||||
} |
||||
|
||||
public override object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data) |
||||
{ |
||||
Debug.Assert(context.CurrentMethod == null); |
||||
try { |
||||
context.CurrentMethod = methodDeclaration.Annotation<MethodDefinition>(); |
||||
return base.VisitMethodDeclaration(methodDeclaration, data); |
||||
} finally { |
||||
context.CurrentMethod = null; |
||||
} |
||||
} |
||||
|
||||
public override object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data) |
||||
{ |
||||
Debug.Assert(context.CurrentMethod == null); |
||||
try { |
||||
context.CurrentMethod = constructorDeclaration.Annotation<MethodDefinition>(); |
||||
return base.VisitConstructorDeclaration(constructorDeclaration, data); |
||||
} finally { |
||||
context.CurrentMethod = null; |
||||
} |
||||
} |
||||
|
||||
public override object VisitAccessor(Accessor accessor, object data) |
||||
{ |
||||
Debug.Assert(context.CurrentMethod == null); |
||||
try { |
||||
context.CurrentMethod = accessor.Annotation<MethodDefinition>(); |
||||
return base.VisitAccessor(accessor, data); |
||||
} finally { |
||||
context.CurrentMethod = null; |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue