mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 22:54:58 +00:00
fix: Fix path qualifiers not resolving generic type params when shadowed by trait
This commit is contained in:
parent
4e6390bb12
commit
7959c24876
3 changed files with 28 additions and 18 deletions
|
@ -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()))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"><</span><span class="type_param">T</span> <span class="keyword">as</span> <span class="trait">Baz</span><span class="angle">></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"><</span><span class="type_param">T</span> <span class="keyword">as</span> <span class="trait">Baz</span><span class="angle">></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"><</span><span class="type_param declaration">Baz</span><span class="colon">:</span> <span class="trait">Bar</span><span class="angle">></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>
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue