Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir_def/src/path.rs')
| -rw-r--r-- | crates/hir_def/src/path.rs | 167 |
1 files changed, 5 insertions, 162 deletions
diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs index 5bb8afa5cc..fc81b88db3 100644 --- a/crates/hir_def/src/path.rs +++ b/crates/hir_def/src/path.rs @@ -6,33 +6,13 @@ use std::{ iter, }; -use crate::{body::LowerCtx, db::DefDatabase, intern::Interned, type_ref::LifetimeRef}; -use base_db::CrateId; -use hir_expand::{ - hygiene::Hygiene, - name::{name, Name}, -}; +use crate::{body::LowerCtx, intern::Interned, type_ref::LifetimeRef}; +use hir_expand::name::{name, Name}; use syntax::ast; use crate::type_ref::{TypeBound, TypeRef}; -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub struct ModPath { - pub kind: PathKind, - segments: Vec<Name>, -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] -pub enum PathKind { - Plain, - /// `self::` is `Super(0)` - Super(u8), - Crate, - /// Absolute path (::foo) - Abs, - /// `$crate` from macro expansion - DollarCrate(CrateId), -} +pub use hir_expand::mod_path::{path, ModPath, PathKind}; #[derive(Debug, Clone, PartialEq, Eq)] pub enum ImportAlias { @@ -51,67 +31,6 @@ impl Display for ImportAlias { } } -impl ModPath { - pub fn from_src(db: &dyn DefDatabase, path: ast::Path, hygiene: &Hygiene) -> Option<ModPath> { - lower::convert_path(db, None, path, hygiene) - } - - pub fn from_segments(kind: PathKind, segments: impl IntoIterator<Item = Name>) -> ModPath { - let segments = segments.into_iter().collect::<Vec<_>>(); - ModPath { kind, segments } - } - - /// Creates a `ModPath` from a `PathKind`, with no extra path segments. - pub const fn from_kind(kind: PathKind) -> ModPath { - ModPath { kind, segments: Vec::new() } - } - - pub fn segments(&self) -> &[Name] { - &self.segments - } - - pub fn push_segment(&mut self, segment: Name) { - self.segments.push(segment); - } - - pub fn pop_segment(&mut self) -> Option<Name> { - self.segments.pop() - } - - /// Returns the number of segments in the path (counting special segments like `$crate` and - /// `super`). - pub fn len(&self) -> usize { - self.segments.len() - + match self.kind { - PathKind::Plain => 0, - PathKind::Super(i) => i as usize, - PathKind::Crate => 1, - PathKind::Abs => 0, - PathKind::DollarCrate(_) => 1, - } - } - - pub fn is_ident(&self) -> bool { - self.as_ident().is_some() - } - - pub fn is_self(&self) -> bool { - self.kind == PathKind::Super(0) && self.segments.is_empty() - } - - /// If this path is a single identifier, like `foo`, return its name. - pub fn as_ident(&self) -> Option<&Name> { - if self.kind != PathKind::Plain { - return None; - } - - match &*self.segments { - [name] => Some(name), - _ => None, - } - } -} - #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct Path { /// Type based path like `<T>::foo`. @@ -185,10 +104,7 @@ impl Path { } pub fn segments(&self) -> PathSegments<'_> { - PathSegments { - segments: self.mod_path.segments.as_slice(), - generic_args: &self.generic_args, - } + PathSegments { segments: self.mod_path.segments(), generic_args: &self.generic_args } } pub fn mod_path(&self) -> &ModPath { @@ -203,7 +119,7 @@ impl Path { type_anchor: self.type_anchor.clone(), mod_path: Interned::new(ModPath::from_segments( self.mod_path.kind.clone(), - self.mod_path.segments[..self.mod_path.segments.len() - 1].iter().cloned(), + self.mod_path.segments()[..self.mod_path.segments().len() - 1].iter().cloned(), )), generic_args: self.generic_args[..self.generic_args.len() - 1].to_vec().into(), }; @@ -296,76 +212,3 @@ impl From<Name> for Box<Path> { Box::new(Path::from(name)) } } - -impl From<Name> for ModPath { - fn from(name: Name) -> ModPath { - ModPath::from_segments(PathKind::Plain, iter::once(name)) - } -} - -impl Display for ModPath { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut first_segment = true; - let mut add_segment = |s| -> fmt::Result { - if !first_segment { - f.write_str("::")?; - } - first_segment = false; - f.write_str(s)?; - Ok(()) - }; - match self.kind { - PathKind::Plain => {} - PathKind::Super(0) => add_segment("self")?, - PathKind::Super(n) => { - for _ in 0..n { - add_segment("super")?; - } - } - PathKind::Crate => add_segment("crate")?, - PathKind::Abs => add_segment("")?, - PathKind::DollarCrate(_) => add_segment("$crate")?, - } - for segment in &self.segments { - if !first_segment { - f.write_str("::")?; - } - first_segment = false; - write!(f, "{}", segment)?; - } - Ok(()) - } -} - -pub use hir_expand::name as __name; - -#[macro_export] -macro_rules! __known_path { - (core::iter::IntoIterator) => {}; - (core::iter::Iterator) => {}; - (core::result::Result) => {}; - (core::option::Option) => {}; - (core::ops::Range) => {}; - (core::ops::RangeFrom) => {}; - (core::ops::RangeFull) => {}; - (core::ops::RangeTo) => {}; - (core::ops::RangeToInclusive) => {}; - (core::ops::RangeInclusive) => {}; - (core::future::Future) => {}; - (core::ops::Try) => {}; - ($path:path) => { - compile_error!("Please register your known path in the path module") - }; -} - -#[macro_export] -macro_rules! __path { - ($start:ident $(:: $seg:ident)*) => ({ - $crate::__known_path!($start $(:: $seg)*); - $crate::path::ModPath::from_segments($crate::path::PathKind::Abs, vec![ - $crate::path::__name![$start], $($crate::path::__name![$seg],)* - ]) - }); -} - -pub use crate::__path as path; |