impl AsName for ast::NameRef {
fn as_name(&self) -> Name {
- Name::new(self.text().clone())
+ let name = resolve_name(self.text().clone());
+ Name::new(name)
}
}
impl AsName for ast::Name {
fn as_name(&self) -> Name {
- Name::new(self.text().clone())
+ let name = resolve_name(self.text().clone());
+ Name::new(name)
}
}
Name::new(s.into())
}
}
+
+fn resolve_name(text: SmolStr) -> SmolStr {
+ let raw_start = "r#";
+ if text.as_str().starts_with(raw_start) {
+ SmolStr::new(&text[raw_start.len()..])
+ } else {
+ text
+ }
+}
let mod_name = path.file_stem().unwrap_or("unknown");
let is_dir_owner = is_root || mod_name == "mod";
- let name = resolve_mod_name(name.to_string());
let file_mod = dir_path.join(format!("{}.rs", name));
let dir_mod = dir_path.join(format!("{}/mod.rs", name));
let file_dir_mod = dir_path.join(format!("{}/{}.rs", mod_name, name));
}
}
-fn resolve_mod_name(name: String) -> String {
- if name.starts_with("r#") {
- name.replace("r#", "")
- } else {
- name
- }
-}
-
#[cfg(test)]
mod tests {
use ra_db::SourceDatabase;
"###);
}
+#[test]
+fn module_resolution_works_for_raw_modules() {
+ let map = def_map_with_crate_graph(
+ "
+ //- /library.rs
+ mod r#async;
+ use self::r#async::Bar;
+
+ //- /async.rs
+ pub struct Bar;
+ ",
+ crate_graph! {
+ "library": ("/library.rs", []),
+ },
+ );
+
+ assert_snapshot_matches!(map, @r###"
+ ⋮crate
+ ⋮Bar: t v
+ ⋮async: t
+ ⋮
+ ⋮crate::async
+ ⋮Bar: t v
+ "###);
+
+}
+
#[test]
fn name_res_works_for_broken_modules() {
covers!(name_res_works_for_broken_modules);