@@ -28,10 +28,16 @@ impl CrateNum {
2828 CrateNum :: from_usize ( x)
2929 }
3030
31+ // FIXME(Nilstrieb): Replace this with `as_mod_def_id`.
3132 #[ inline]
3233 pub fn as_def_id ( self ) -> DefId {
3334 DefId { krate : self , index : CRATE_DEF_INDEX }
3435 }
36+
37+ #[ inline]
38+ pub fn as_mod_def_id ( self ) -> ModDefId {
39+ ModDefId :: new_unchecked ( DefId { krate : self , index : CRATE_DEF_INDEX } )
40+ }
3541}
3642
3743impl fmt:: Display for CrateNum {
@@ -485,3 +491,92 @@ impl<CTX: HashStableContext> ToStableHashKey<CTX> for CrateNum {
485491 self . as_def_id ( ) . to_stable_hash_key ( hcx)
486492 }
487493}
494+
495+ macro_rules! typed_def_id {
496+ ( $Name: ident, $LocalName: ident) => {
497+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Encodable , Decodable , HashStable_Generic ) ]
498+ pub struct $Name( DefId ) ;
499+
500+ impl $Name {
501+ pub const fn new_unchecked( def_id: DefId ) -> Self {
502+ Self ( def_id)
503+ }
504+
505+ pub fn to_def_id( self ) -> DefId {
506+ self . into( )
507+ }
508+
509+ pub fn is_local( self ) -> bool {
510+ self . 0 . is_local( )
511+ }
512+
513+ pub fn as_local( self ) -> Option <$LocalName> {
514+ self . 0 . as_local( ) . map( $LocalName:: new_unchecked)
515+ }
516+ }
517+
518+ impl From <$LocalName> for $Name {
519+ fn from( local: $LocalName) -> Self {
520+ Self ( local. 0 . to_def_id( ) )
521+ }
522+ }
523+
524+ impl From <$Name> for DefId {
525+ fn from( typed: $Name) -> Self {
526+ typed. 0
527+ }
528+ }
529+
530+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Encodable , Decodable , HashStable_Generic ) ]
531+ pub struct $LocalName( LocalDefId ) ;
532+
533+ impl !Ord for $LocalName { }
534+ impl !PartialOrd for $LocalName { }
535+
536+ impl $LocalName {
537+ pub const fn new_unchecked( def_id: LocalDefId ) -> Self {
538+ Self ( def_id)
539+ }
540+
541+ pub fn to_def_id( self ) -> DefId {
542+ self . 0 . into( )
543+ }
544+
545+ pub fn to_local_def_id( self ) -> LocalDefId {
546+ self . 0
547+ }
548+ }
549+
550+ impl From <$LocalName> for LocalDefId {
551+ fn from( typed: $LocalName) -> Self {
552+ typed. 0
553+ }
554+ }
555+
556+ impl From <$LocalName> for DefId {
557+ fn from( typed: $LocalName) -> Self {
558+ typed. 0 . into( )
559+ }
560+ }
561+ } ;
562+ }
563+
564+ // N.B.: when adding new typed `DefId`s update the corresponding trait impls in
565+ // `rustc_middle::dep_graph::def_node` for `DepNodeParams`.
566+ typed_def_id ! { ModDefId , LocalModDefId }
567+
568+ impl LocalModDefId {
569+ pub const CRATE_DEF_ID : Self = Self :: new_unchecked ( CRATE_DEF_ID ) ;
570+ }
571+
572+ impl ModDefId {
573+ pub fn is_top_level_module ( self ) -> bool {
574+ self . 0 . is_top_level_module ( )
575+ }
576+ }
577+
578+ impl LocalModDefId {
579+ pub fn is_top_level_module ( self ) -> bool {
580+ self . 0 . is_top_level_module ( )
581+ }
582+ }
0 commit comments