diff options
| author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-04-06 17:39:20 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-06 17:39:20 +0000 |
| commit | f4e4a3a8960ecc896348fc16e4e772d6e71c8205 (patch) | |
| tree | a691abdc38870ffb6e1646cfea05e412231d27a3 | |
| parent | a852758bd6ad76c97bca33ab83f9f8e8bf7810dc (diff) | |
| parent | 7959c248761081fc9d38c84d0d8b0ad60d20771d (diff) | |
| download | rust-f4e4a3a8960ecc896348fc16e4e772d6e71c8205.tar.gz rust-f4e4a3a8960ecc896348fc16e4e772d6e71c8205.zip | |
Merge #11914
11914: fix: Fix path qualifiers not resolving generic type params when shadowed by trait r=Veykril a=Veykril Fixes https://github.com/rust-analyzer/rust-analyzer/issues/10707 bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
| -rw-r--r-- | crates/hir/src/source_analyzer.rs | 37 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/test_data/highlight_general.html | 4 | ||||
| -rw-r--r-- | crates/ide/src/syntax_highlighting/tests.rs | 5 |
3 files changed, 28 insertions, 18 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 91d02ab5c93..e96c4007407 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -749,22 +749,23 @@ fn resolve_hir_path_qualifier( resolver: &Resolver, path: &Path, ) -> Option<PathResolution> { - let items = resolver - .resolve_module_path_in_items(db.upcast(), path.mod_path()) - .take_types() - .map(|it| PathResolution::Def(it.into())); - - if items.is_some() { - return items; - } - - resolver.resolve_path_in_type_ns_fully(db.upcast(), path.mod_path()).map(|ty| match ty { - TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), - TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()), - TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => PathResolution::Def(Adt::from(it).into()), - TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()), - TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()), - TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()), - TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()), - }) + resolver + .resolve_path_in_type_ns_fully(db.upcast(), path.mod_path()) + .map(|ty| match ty { + TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), + TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()), + TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => { + PathResolution::Def(Adt::from(it).into()) + } + TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()), + TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()), + TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()), + TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()), + }) + .or_else(|| { + resolver + .resolve_module_path_in_items(db.upcast(), path.mod_path()) + .take_types() + .map(|it| PathResolution::Def(it.into())) + }) } diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_general.html b/crates/ide/src/syntax_highlighting/test_data/highlight_general.html index d5c930e0494..1abb6eb8f39 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_general.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_general.html @@ -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="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> \ No newline at end of file diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index fdfe347a328..d7686695942 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -31,6 +31,7 @@ struct Foo; false, ); } + #[test] fn macros() { check_highlighting( @@ -278,6 +279,10 @@ where T: Baz, <T as Baz>::Qux: Bar {} +fn gp_shadows_trait<Baz: Bar>() { + Baz::bar; +} + //- /foo.rs crate:foo pub struct Person { pub name: &'static str, |
