@@ -21,8 +21,8 @@ use hir_def::{
2121 path:: { ModPath , Path , PathKind } ,
2222 resolver:: { resolver_for_scope, Resolver , TypeNs , ValueNs } ,
2323 type_ref:: Mutability ,
24- AsMacroCall , AssocItemId , DefWithBodyId , FieldId , FunctionId , ItemContainerId , LocalFieldId ,
25- Lookup , ModuleDefId , TraitId , VariantId ,
24+ AsMacroCall , AssocItemId , ConstId , DefWithBodyId , FieldId , FunctionId , ItemContainerId ,
25+ LocalFieldId , Lookup , ModuleDefId , TraitId , VariantId ,
2626} ;
2727use hir_expand:: {
2828 builtin_fn_macro:: BuiltinFnLikeExpander ,
@@ -482,7 +482,7 @@ impl SourceAnalyzer {
482482 let infer = self . infer . as_deref ( ) ?;
483483 if let Some ( path_expr) = parent ( ) . and_then ( ast:: PathExpr :: cast) {
484484 let expr_id = self . expr_id ( db, & path_expr. into ( ) ) ?;
485- if let Some ( assoc) = infer. assoc_resolutions_for_expr ( expr_id) {
485+ if let Some ( ( assoc, subs ) ) = infer. assoc_resolutions_for_expr ( expr_id) {
486486 let assoc = match assoc {
487487 AssocItemId :: FunctionId ( f_in_trait) => {
488488 match infer. type_of_expr . get ( expr_id) {
@@ -501,7 +501,13 @@ impl SourceAnalyzer {
501501 }
502502 }
503503 }
504-
504+ AssocItemId :: ConstId ( const_id) => {
505+ if let Some ( subs) = subs {
506+ self . resolve_impl_const_or_trait_def ( db, const_id, subs) . into ( )
507+ } else {
508+ assoc
509+ }
510+ }
505511 _ => assoc,
506512 } ;
507513
@@ -515,7 +521,7 @@ impl SourceAnalyzer {
515521 prefer_value_ns = true ;
516522 } else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
517523 let pat_id = self . pat_id ( & path_pat. into ( ) ) ?;
518- if let Some ( assoc) = infer. assoc_resolutions_for_pat ( pat_id) {
524+ if let Some ( ( assoc, _ ) ) = infer. assoc_resolutions_for_pat ( pat_id) {
519525 return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
520526 }
521527 if let Some ( VariantId :: EnumVariantId ( variant) ) =
@@ -792,6 +798,24 @@ impl SourceAnalyzer {
792798 method_resolution:: lookup_impl_method ( db, env, func, substs)
793799 }
794800
801+ fn resolve_impl_const_or_trait_def (
802+ & self ,
803+ db : & dyn HirDatabase ,
804+ const_id : ConstId ,
805+ subs : Substitution ,
806+ ) -> ConstId {
807+ let krate = self . resolver . krate ( ) ;
808+ let owner = match self . resolver . body_owner ( ) {
809+ Some ( it) => it,
810+ None => return const_id,
811+ } ;
812+ let env = owner. as_generic_def_id ( ) . map_or_else (
813+ || Arc :: new ( hir_ty:: TraitEnvironment :: empty ( krate) ) ,
814+ |d| db. trait_environment ( d) ,
815+ ) ;
816+ method_resolution:: lookup_impl_const ( db, env, const_id, subs)
817+ }
818+
795819 fn lang_trait_fn (
796820 & self ,
797821 db : & dyn HirDatabase ,
0 commit comments