@@ -21,8 +21,8 @@ use hir_def::{
21
21
path:: { ModPath , Path , PathKind } ,
22
22
resolver:: { resolver_for_scope, Resolver , TypeNs , ValueNs } ,
23
23
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 ,
26
26
} ;
27
27
use hir_expand:: {
28
28
builtin_fn_macro:: BuiltinFnLikeExpander ,
@@ -482,7 +482,7 @@ impl SourceAnalyzer {
482
482
let infer = self . infer . as_deref ( ) ?;
483
483
if let Some ( path_expr) = parent ( ) . and_then ( ast:: PathExpr :: cast) {
484
484
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) {
486
486
let assoc = match assoc {
487
487
AssocItemId :: FunctionId ( f_in_trait) => {
488
488
match infer. type_of_expr . get ( expr_id) {
@@ -501,7 +501,13 @@ impl SourceAnalyzer {
501
501
}
502
502
}
503
503
}
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
+ }
505
511
_ => assoc,
506
512
} ;
507
513
@@ -515,7 +521,7 @@ impl SourceAnalyzer {
515
521
prefer_value_ns = true ;
516
522
} else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
517
523
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) {
519
525
return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
520
526
}
521
527
if let Some ( VariantId :: EnumVariantId ( variant) ) =
@@ -792,6 +798,24 @@ impl SourceAnalyzer {
792
798
method_resolution:: lookup_impl_method ( db, env, func, substs)
793
799
}
794
800
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
+
795
819
fn lang_trait_fn (
796
820
& self ,
797
821
db : & dyn HirDatabase ,
0 commit comments