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; } }