mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-24 05:33:41 +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
@ -16,7 +16,7 @@ use hir_def::{
|
||||
expr::{ExprId, Pat, PatId},
|
||||
path::{ModPath, Path, PathKind},
|
||||
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_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 {
|
||||
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
|
||||
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="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>
|
@ -238,6 +238,15 @@ impl Bool {
|
||||
}
|
||||
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
|
||||
pub struct Person {
|
||||
pub name: &'static str,
|
||||
|
Loading…
Reference in New Issue
Block a user