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.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/crates/hir-def/src/path.rs b/crates/hir-def/src/path.rs
index aa2c4a6f1b..44e132061a 100644
--- a/crates/hir-def/src/path.rs
+++ b/crates/hir-def/src/path.rs
@@ -1,5 +1,7 @@
//! A desugared representation of paths like `crate::foo` or `<Type as Trait>::bar`.
mod lower;
+#[cfg(test)]
+mod tests;
use std::{
fmt::{self, Display},
@@ -19,6 +21,8 @@ use syntax::ast;
pub use hir_expand::mod_path::{path, ModPath, PathKind};
+pub use lower::hir_segment_to_ast_segment;
+
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ImportAlias {
/// Unnamed alias, as in `use Foo as _;`
@@ -230,7 +234,7 @@ impl Path {
}
}
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct PathSegment<'a> {
pub name: &'a Name,
pub args_and_bindings: Option<&'a GenericArgs>,
@@ -274,6 +278,12 @@ impl<'a> PathSegments<'a> {
generic_args: self.generic_args.map(|it| it.get(..len).unwrap_or(it)),
}
}
+ pub fn strip_last(&self) -> PathSegments<'a> {
+ PathSegments {
+ segments: self.segments.split_last().map_or(&[], |it| it.1),
+ generic_args: self.generic_args.map(|it| it.split_last().map_or(&[][..], |it| it.1)),
+ }
+ }
pub fn iter(&self) -> impl Iterator<Item = PathSegment<'a>> {
self.segments
.iter()