| use std::fmt; |
| |
| use rustc_span::LocalExpnId; |
| |
| rustc_index::newtype_index! { |
| /// Identifies an AST node. |
| /// |
| /// This identifies top-level definitions, expressions, and everything in between. |
| /// This is later turned into [`DefId`] and `HirId` for the HIR. |
| /// |
| /// [`DefId`]: rustc_span::def_id::DefId |
| #[encodable] |
| #[orderable] |
| #[debug_format = "NodeId({})"] |
| pub struct NodeId { |
| /// The [`NodeId`] used to represent the root of the crate. |
| const CRATE_NODE_ID = 0; |
| } |
| } |
| |
| rustc_data_structures::define_id_collections!(NodeMap, NodeSet, NodeMapEntry, NodeId); |
| |
| /// When parsing and at the beginning of doing expansions, we initially give all AST nodes |
| /// this dummy AST [`NodeId`]. Then, during a later phase of expansion, we renumber them |
| /// to have small, positive IDs. |
| pub const DUMMY_NODE_ID: NodeId = NodeId::MAX; |
| |
| impl NodeId { |
| pub fn placeholder_from_expn_id(expn_id: LocalExpnId) -> Self { |
| NodeId::from_u32(expn_id.as_u32()) |
| } |
| |
| pub fn placeholder_to_expn_id(self) -> LocalExpnId { |
| LocalExpnId::from_u32(self.as_u32()) |
| } |
| } |
| |
| impl fmt::Display for NodeId { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| fmt::Display::fmt(&self.as_u32(), f) |
| } |
| } |