fix: Fix path qualifiers not resolving generic type params when shadowed by trait

This commit is contained in:
Lukas Wirth 2022-04-06 19:38:45 +02:00
parent 4e6390bb12
commit 7959c24876
3 changed files with 28 additions and 18 deletions

View file

@ -749,22 +749,23 @@ fn resolve_hir_path_qualifier(
resolver: &Resolver, resolver: &Resolver,
path: &Path, path: &Path,
) -> Option<PathResolution> { ) -> Option<PathResolution> {
let items = resolver resolver
.resolve_module_path_in_items(db.upcast(), path.mod_path()) .resolve_path_in_type_ns_fully(db.upcast(), path.mod_path())
.take_types() .map(|ty| match ty {
.map(|it| PathResolution::Def(it.into())); TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()),
if items.is_some() { TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
return items; PathResolution::Def(Adt::from(it).into())
} }
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
resolver.resolve_path_in_type_ns_fully(db.upcast(), path.mod_path()).map(|ty| match ty { TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()), TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => PathResolution::Def(Adt::from(it).into()), })
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()), .or_else(|| {
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()), resolver
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()), .resolve_module_path_in_items(db.upcast(), path.mod_path())
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()), .take_types()
}) .map(|it| PathResolution::Def(it.into()))
})
} }

View file

@ -225,4 +225,8 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
<span class="type_param">T</span><span class="colon">:</span> <span class="trait">Baz</span><span class="comma">,</span> <span class="type_param">T</span><span class="colon">:</span> <span class="trait">Baz</span><span class="comma">,</span>
<span class="angle">&lt;</span><span class="type_param">T</span> <span class="keyword">as</span> <span class="trait">Baz</span><span class="angle">&gt;</span><span class="operator">::</span><span class="type_alias associated trait">Qux</span><span class="colon">:</span> <span class="trait">Bar</span> <span class="brace">{</span><span class="brace">}</span> <span class="angle">&lt;</span><span class="type_param">T</span> <span class="keyword">as</span> <span class="trait">Baz</span><span class="angle">&gt;</span><span class="operator">::</span><span class="type_alias associated trait">Qux</span><span class="colon">:</span> <span class="trait">Bar</span> <span class="brace">{</span><span class="brace">}</span>
<span class="keyword">fn</span> <span class="function declaration">gp_shadows_trait</span><span class="angle">&lt;</span><span class="type_param declaration">Baz</span><span class="colon">:</span> <span class="trait">Bar</span><span class="angle">&gt;</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
<span class="type_param">Baz</span><span class="operator">::</span><span class="function associated reference trait">bar</span><span class="semicolon">;</span>
<span class="brace">}</span>
</code></pre> </code></pre>

View file

@ -31,6 +31,7 @@ struct Foo;
false, false,
); );
} }
#[test] #[test]
fn macros() { fn macros() {
check_highlighting( check_highlighting(
@ -278,6 +279,10 @@ where
T: Baz, T: Baz,
<T as Baz>::Qux: Bar {} <T as Baz>::Qux: Bar {}
fn gp_shadows_trait<Baz: Bar>() {
Baz::bar;
}
//- /foo.rs crate:foo //- /foo.rs crate:foo
pub struct Person { pub struct Person {
pub name: &'static str, pub name: &'static str,