49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
//! A set of utils methods to reuse on other abstraction levels
|
|
|
|
use itertools::Itertools;
|
|
|
|
use crate::{ast, match_ast, AstNode, SyntaxKind};
|
|
|
|
pub fn path_to_string_stripping_turbo_fish(path: &ast::Path) -> String {
|
|
path.syntax()
|
|
.children()
|
|
.filter_map(|node| {
|
|
match_ast! {
|
|
match node {
|
|
ast::PathSegment(it) => {
|
|
Some(it.name_ref()?.to_string())
|
|
},
|
|
ast::Path(it) => {
|
|
Some(path_to_string_stripping_turbo_fish(&it))
|
|
},
|
|
_ => None,
|
|
}
|
|
}
|
|
})
|
|
.join("::")
|
|
}
|
|
|
|
pub fn is_raw_identifier(name: &str) -> bool {
|
|
let is_keyword = SyntaxKind::from_keyword(name).is_some();
|
|
is_keyword && !matches!(name, "self" | "crate" | "super" | "Self")
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::path_to_string_stripping_turbo_fish;
|
|
use crate::ast::make;
|
|
|
|
#[test]
|
|
fn turbofishes_are_stripped() {
|
|
assert_eq!("Vec", path_to_string_stripping_turbo_fish(&make::path_from_text("Vec::<i32>")),);
|
|
assert_eq!(
|
|
"Vec::new",
|
|
path_to_string_stripping_turbo_fish(&make::path_from_text("Vec::<i32>::new")),
|
|
);
|
|
assert_eq!(
|
|
"Vec::new",
|
|
path_to_string_stripping_turbo_fish(&make::path_from_text("Vec::new()")),
|
|
);
|
|
}
|
|
}
|