diff --git a/crates/ra_hir/src/name.rs b/crates/ra_hir/src/name.rs index ba17958eb9f..06a2dbc7608 100644 --- a/crates/ra_hir/src/name.rs +++ b/crates/ra_hir/src/name.rs @@ -98,13 +98,15 @@ pub(crate) trait AsName { impl AsName for ast::NameRef { fn as_name(&self) -> Name { - Name::new(self.text().clone()) + let name = resolve_name(self.text()); + Name::new(name) } } impl AsName for ast::Name { fn as_name(&self) -> Name { - Name::new(self.text().clone()) + let name = resolve_name(self.text()); + Name::new(name) } } @@ -184,3 +186,12 @@ impl AsName for KnownName { 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.clone() + } +} diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs index adac814d913..07b533e2907 100644 --- a/crates/ra_hir/src/nameres/tests.rs +++ b/crates/ra_hir/src/nameres/tests.rs @@ -338,6 +338,32 @@ fn module_resolution_works_for_non_standard_filenames() { "###); } +#[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);