assert!(resolution.def_id.is_some());
}
+#[test]
+fn test_self() {
+ let (item_map, module_id) = item_map(
+ "
+ //- /lib.rs
+ mod foo;
+ use crate::foo::bar::Baz::{self};
+ <|>
+ //- /foo/mod.rs
+ pub mod bar;
+ //- /foo/bar.rs
+ pub struct Baz;
+ ",
+ );
+ let name = SmolStr::from("Baz");
+ let resolution = &item_map.per_module[&module_id].items[&name];
+ assert!(resolution.def_id.is_some());
+}
+
#[test]
fn item_map_across_crates() {
let (mut db, sr) = MockDatabase::with_files(
) {
if let Some(use_tree_list) = tree.use_tree_list() {
let prefix = match tree.path() {
+ // E.g. use something::{{{inner}}};
None => prefix,
+ // E.g. `use something::{inner}` (prefix is `None`, path is `something`)
+ // or `use something::{path::{inner::{innerer}}}` (prefix is `something::path`, path is `inner`)
Some(path) => match convert_path(prefix, path) {
Some(it) => Some(it),
None => return, // TODO: report errors somewhere
},
};
- for tree in use_tree_list.use_trees() {
- expand_use_tree(prefix.clone(), tree, cb);
+ for child_tree in use_tree_list.use_trees() {
+ // Handle self in a path.
+ // E.g. `use something::{self, <...>}`
+ if let Some(path) = child_tree.path() {
+ if path.qualifier().is_none() {
+ if let Some(segment) = path.segment() {
+ if segment.kind() == Some(ast::PathSegmentKind::SelfKw) {
+ /* TODO: Work out what on earth range means in this callback */
+ if let Some(prefix) = prefix.clone() {
+ cb(prefix, Some(segment.syntax().range()));
+ continue;
+ }
+ }
+ }
+ }
+ }
+ expand_use_tree(prefix.clone(), child_tree, cb);
}
} else {
if let Some(ast_path) = tree.path() {
}
}
-#[derive(Debug, Clone, Copy)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PathSegmentKind<'a> {
Name(NameRef<'a>),
SelfKw,