mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 13:51:31 +00:00
Merge #10896
10896: hir: resolve assoc trait type in path r=jhgg a=jhgg fixes #9802 - [ ] write tests, maybe, if this is even a good fix... Co-authored-by: Jake Heinz <jh@discordapp.com>
This commit is contained in:
commit
c5ad6c8c5f
3 changed files with 30 additions and 1 deletions
|
@ -16,7 +16,7 @@ use hir_def::{
|
||||||
expr::{ExprId, Pat, PatId},
|
expr::{ExprId, Pat, PatId},
|
||||||
path::{ModPath, Path, PathKind},
|
path::{ModPath, Path, PathKind},
|
||||||
resolver::{resolver_for_scope, Resolver, TypeNs, ValueNs},
|
resolver::{resolver_for_scope, Resolver, TypeNs, ValueNs},
|
||||||
AsMacroCall, DefWithBodyId, FieldId, FunctionId, LocalFieldId, VariantId,
|
AsMacroCall, DefWithBodyId, FieldId, FunctionId, LocalFieldId, ModuleDefId, VariantId,
|
||||||
};
|
};
|
||||||
use hir_expand::{hygiene::Hygiene, name::AsName, HirFileId, InFile};
|
use hir_expand::{hygiene::Hygiene, name::AsName, HirFileId, InFile};
|
||||||
use hir_ty::{
|
use hir_ty::{
|
||||||
|
@ -544,6 +544,17 @@ fn resolve_hir_path_(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}?;
|
}?;
|
||||||
|
|
||||||
|
// If we are in a TypeNs for a Trait, and we have an unresolved name, try to resolve it as a type
|
||||||
|
// within the trait's associated types.
|
||||||
|
if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty) {
|
||||||
|
if let Some(type_alias_id) =
|
||||||
|
db.trait_data(trait_id).associated_type_by_name(&unresolved.name)
|
||||||
|
{
|
||||||
|
return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let res = match ty {
|
let res = match ty {
|
||||||
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
|
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
|
||||||
TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }),
|
TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }),
|
||||||
|
|
|
@ -265,4 +265,13 @@ proc_macros::<span class="macro">mirror!</span> <span class="brace">{</span>
|
||||||
<span class="brace">}</span>
|
<span class="brace">}</span>
|
||||||
<span class="keyword">const</span> <span class="constant declaration">USAGE_OF_BOOL</span><span class="colon">:</span><span class="builtin_type">bool</span> <span class="operator">=</span> <span class="enum public">Bool</span><span class="operator">::</span><span class="enum_variant public">True</span><span class="operator">.</span><span class="function associated consuming public">to_primitive</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
|
<span class="keyword">const</span> <span class="constant declaration">USAGE_OF_BOOL</span><span class="colon">:</span><span class="builtin_type">bool</span> <span class="operator">=</span> <span class="enum public">Bool</span><span class="operator">::</span><span class="enum_variant public">True</span><span class="operator">.</span><span class="function associated consuming public">to_primitive</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
|
||||||
|
|
||||||
|
<span class="keyword">trait</span> <span class="trait declaration">Baz</span> <span class="brace">{</span>
|
||||||
|
<span class="keyword">type</span> <span class="type_alias associated declaration trait">Qux</span><span class="semicolon">;</span>
|
||||||
|
<span class="brace">}</span>
|
||||||
|
|
||||||
|
<span class="keyword">fn</span> <span class="function declaration">baz</span><span class="angle"><</span><span class="type_param declaration">T</span><span class="angle">></span><span class="parenthesis">(</span><span class="value_param declaration">t</span><span class="colon">:</span> <span class="type_param">T</span><span class="parenthesis">)</span>
|
||||||
|
<span class="keyword">where</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>
|
||||||
|
|
||||||
</code></pre>
|
</code></pre>
|
|
@ -238,6 +238,15 @@ impl Bool {
|
||||||
}
|
}
|
||||||
const USAGE_OF_BOOL:bool = Bool::True.to_primitive();
|
const USAGE_OF_BOOL:bool = Bool::True.to_primitive();
|
||||||
|
|
||||||
|
trait Baz {
|
||||||
|
type Qux;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn baz<T>(t: T)
|
||||||
|
where
|
||||||
|
T: Baz,
|
||||||
|
<T as Baz>::Qux: 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