1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
7 using System.Reflection.Metadata;
8 using System.Reflection.Metadata.Ecma335;
10 using Internal.JitInterface;
11 using Internal.TypeSystem;
12 using Internal.TypeSystem.Ecma;
14 namespace ILCompiler.DependencyAnalysis.ReadyToRun
17 /// This helper structure encapsulates a module-qualified token.
19 public struct ModuleToken : IEquatable<ModuleToken>
21 public readonly EcmaModule Module;
22 public readonly mdToken Token;
24 public ModuleToken(EcmaModule module, mdToken token)
29 public ModuleToken(EcmaModule module, EntityHandle entityHandle)
32 Token = (mdToken)MetadataTokens.GetToken(entityHandle);
35 public ModuleToken(EcmaModule module, Handle handle)
38 Token = (mdToken)MetadataTokens.GetToken(handle);
41 public bool IsNull => Module == null;
43 public override int GetHashCode()
45 return IsNull ? 0 : Module.GetHashCode() ^ unchecked((int)(31 * (uint)Token));
48 public override string ToString()
52 return "default(ModuleToken)";
54 return Module.ToString() + ":" + ((uint)Token).ToString("X8");
57 public override bool Equals(object obj)
59 return obj is ModuleToken moduleToken &&
63 public bool Equals(ModuleToken moduleToken)
65 return Module == moduleToken.Module && Token == moduleToken.Token;
68 public int CompareTo(ModuleToken other)
70 int result = Token.CompareTo(other.Token);
74 return Module.CompareTo(other.Module);
77 public SignatureContext SignatureContext(ModuleTokenResolver resolver)
79 return new SignatureContext(Module, resolver);
82 public MetadataReader MetadataReader => Module.PEReader.GetMetadataReader();
84 public CorTokenType TokenType => SignatureBuilder.TypeFromToken(Token);
86 public uint TokenRid => SignatureBuilder.RidFromToken(Token);
88 public Handle Handle => MetadataTokens.Handle((int)Token);