diff --git a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpOperators.cs b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpOperators.cs
index 7155f0b0b..b9ae10a9b 100644
--- a/ICSharpCode.Decompiler/CSharp/Resolver/CSharpOperators.cs
+++ b/ICSharpCode.Decompiler/CSharp/Resolver/CSharpOperators.cs
@@ -115,7 +115,9 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
{
return null;
}
-
+
+ public Mono.Cecil.MetadataToken MetadataToken => default(Mono.Cecil.MetadataToken);
+
ITypeDefinition IEntity.DeclaringTypeDefinition {
get { return null; }
}
diff --git a/ICSharpCode.Decompiler/CSharp/Resolver/ReducedExtensionMethod.cs b/ICSharpCode.Decompiler/CSharp/Resolver/ReducedExtensionMethod.cs
index 19b4c9e20..c5630a782 100644
--- a/ICSharpCode.Decompiler/CSharp/Resolver/ReducedExtensionMethod.cs
+++ b/ICSharpCode.Decompiler/CSharp/Resolver/ReducedExtensionMethod.cs
@@ -271,6 +271,8 @@ namespace ICSharpCode.Decompiler.CSharp.Resolver
#region IEntity implementation
+ public Mono.Cecil.MetadataToken MetadataToken => baseMethod.MetadataToken;
+
public SymbolKind SymbolKind {
get {
return baseMethod.SymbolKind;
diff --git a/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs b/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs
index 982900ef8..7c511d64d 100644
--- a/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/CecilLoader.cs
@@ -841,6 +841,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
string name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(typeDefinition.Name);
var td = new DefaultUnresolvedTypeDefinition(typeDefinition.Namespace, name);
+ td.MetadataToken = typeDefinition.MetadataToken;
if (typeDefinition.HasGenericParameters)
InitTypeParameters(typeDefinition, td.TypeParameters);
return td;
@@ -1109,6 +1110,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
this.loader = loader;
this.cecilTypeDef = typeDefinition;
+ this.MetadataToken = typeDefinition.MetadataToken;
this.SymbolKind = SymbolKind.TypeDefinition;
this.namespaceName = typeDefinition.Namespace;
this.Name = ReflectionHelper.SplitTypeParameterCountFromReflectionName(typeDefinition.Name);
@@ -1695,6 +1697,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
#region FinishReadMember / Interning
void FinishReadMember(AbstractUnresolvedMember member, MemberReference cecilDefinition)
{
+ member.MetadataToken = cecilDefinition.MetadataToken;
member.ApplyInterningProvider(interningProvider);
member.Freeze();
RegisterCecilObject(member, cecilDefinition);
diff --git a/ICSharpCode.Decompiler/TypeSystem/IEntity.cs b/ICSharpCode.Decompiler/TypeSystem/IEntity.cs
index f55a5393b..da58e8121 100644
--- a/ICSharpCode.Decompiler/TypeSystem/IEntity.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/IEntity.cs
@@ -26,6 +26,15 @@ namespace ICSharpCode.Decompiler.TypeSystem
///
public interface IUnresolvedEntity : INamedElement, IHasAccessibility
{
+ ///
+ /// Gets the metadata token for this entity.
+ ///
+ ///
+ /// The token is only valid within the context of the assembly defining this entity.
+ /// Token may be 0 if this is a generated member.
+ ///
+ Mono.Cecil.MetadataToken MetadataToken { get; }
+
///
/// Gets the entity type.
///
@@ -77,6 +86,16 @@ namespace ICSharpCode.Decompiler.TypeSystem
///
public interface IEntity : ISymbol, ICompilationProvider, INamedElement, IHasAccessibility
{
+ ///
+ /// Gets the metadata token for this entity.
+ ///
+ ///
+ /// The token is only valid within the context of the assembly defining this entity.
+ /// Token may be 0 if this is a generated member.
+ /// Note: specialized members will return the token of the member definition.
+ ///
+ Mono.Cecil.MetadataToken MetadataToken { get; }
+
///
/// Gets the short name of the entity.
///
diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractResolvedEntity.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractResolvedEntity.cs
index 9431ef85c..4a89b2cd6 100644
--- a/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractResolvedEntity.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractResolvedEntity.cs
@@ -39,7 +39,9 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
this.parentContext = parentContext;
this.Attributes = unresolved.Attributes.CreateResolvedAttributes(parentContext);
}
-
+
+ public Mono.Cecil.MetadataToken MetadataToken => unresolved.MetadataToken;
+
public SymbolKind SymbolKind {
get { return unresolved.SymbolKind; }
}
diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractUnresolvedEntity.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractUnresolvedEntity.cs
index a142f27a5..b5d6c8fdd 100644
--- a/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractUnresolvedEntity.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/Implementation/AbstractUnresolvedEntity.cs
@@ -36,7 +36,8 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
string name = string.Empty;
IList attributes;
-
+ Mono.Cecil.MetadataToken metadataToken;
+
// 1 byte per enum + 2 bytes for flags
SymbolKind symbolKind;
Accessibility accessibility;
@@ -119,7 +120,15 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
{
FreezableHelper.ThrowIfFrozen(this);
}
-
+
+ public Mono.Cecil.MetadataToken MetadataToken {
+ get { return metadataToken; }
+ set {
+ ThrowIfFrozen();
+ metadataToken = value;
+ }
+ }
+
public SymbolKind SymbolKind {
get { return symbolKind; }
set {
diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
index 884219d21..393ad32e5 100644
--- a/ICSharpCode.Decompiler/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/Implementation/DefaultResolvedTypeDefinition.cs
@@ -111,7 +111,9 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
public IReadOnlyList Parts {
get { return parts; }
}
-
+
+ public Mono.Cecil.MetadataToken MetadataToken => parts[0].MetadataToken;
+
public SymbolKind SymbolKind {
get { return parts[0].SymbolKind; }
}
diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/SpecializedMember.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/SpecializedMember.cs
index 76d410fb1..b232e225d 100644
--- a/ICSharpCode.Decompiler/TypeSystem/Implementation/SpecializedMember.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/Implementation/SpecializedMember.cs
@@ -153,7 +153,9 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
this.returnType = value;
}
}
-
+
+ public Mono.Cecil.MetadataToken MetadataToken => baseMember.MetadataToken;
+
public bool IsVirtual {
get { return baseMember.IsVirtual; }
}
diff --git a/ICSharpCode.Decompiler/TypeSystem/VarArgInstanceMethod.cs b/ICSharpCode.Decompiler/TypeSystem/VarArgInstanceMethod.cs
index 384f077cc..75bd2981f 100644
--- a/ICSharpCode.Decompiler/TypeSystem/VarArgInstanceMethod.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/VarArgInstanceMethod.cs
@@ -118,6 +118,8 @@ namespace ICSharpCode.Decompiler.TypeSystem
get { return baseMethod.TypeArguments; }
}
+ public Mono.Cecil.MetadataToken MetadataToken => baseMethod.MetadataToken;
+
public bool IsExtensionMethod {
get { return baseMethod.IsExtensionMethod; }
}