@@ -6,74 +6,28 @@ mod tests;
66use base_db:: Crate ;
77use hir_def:: {
88 EnumVariantId , GeneralConstId , HasModule , StaticId ,
9- expr_store:: { Body , HygieneId , path :: Path } ,
9+ expr_store:: Body ,
1010 hir:: { Expr , ExprId } ,
11- resolver:: { Resolver , ValueNs } ,
1211 type_ref:: LiteralConstRef ,
1312} ;
1413use hir_expand:: Lookup ;
15- use rustc_type_ir:: { UnevaluatedConst , inherent:: IntoKind } ;
16- use stdx:: never;
14+ use rustc_type_ir:: inherent:: IntoKind ;
1715use triomphe:: Arc ;
1816
1917use crate :: {
20- MemoryMap , TraitEnvironment ,
18+ LifetimeElisionKind , MemoryMap , TraitEnvironment , TyLoweringContext ,
2119 db:: HirDatabase ,
2220 display:: DisplayTarget ,
23- generics:: Generics ,
2421 infer:: InferenceContext ,
2522 mir:: { MirEvalError , MirLowerError } ,
2623 next_solver:: {
2724 Const , ConstBytes , ConstKind , DbInterner , ErrorGuaranteed , GenericArg , GenericArgs ,
28- ParamConst , SolverDefId , Ty , ValueConst ,
25+ SolverDefId , Ty , ValueConst ,
2926 } ,
3027} ;
3128
3229use super :: mir:: { interpret_mir, lower_to_mir, pad16} ;
3330
34- pub ( crate ) fn path_to_const < ' a , ' g > (
35- db : & ' a dyn HirDatabase ,
36- resolver : & Resolver < ' a > ,
37- path : & Path ,
38- args : impl FnOnce ( ) -> & ' g Generics ,
39- _expected_ty : Ty < ' a > ,
40- ) -> Option < Const < ' a > > {
41- let interner = DbInterner :: new_with ( db, Some ( resolver. krate ( ) ) , None ) ;
42- match resolver. resolve_path_in_value_ns_fully ( db, path, HygieneId :: ROOT ) {
43- Some ( ValueNs :: GenericParam ( p) ) => {
44- let args = args ( ) ;
45- match args
46- . type_or_const_param ( p. into ( ) )
47- . and_then ( |( idx, p) | p. const_param ( ) . map ( |p| ( idx, p. clone ( ) ) ) )
48- {
49- Some ( ( idx, _param) ) => {
50- Some ( Const :: new_param ( interner, ParamConst { index : idx as u32 , id : p } ) )
51- }
52- None => {
53- never ! (
54- "Generic list doesn't contain this param: {:?}, {:?}, {:?}" ,
55- args,
56- path,
57- p
58- ) ;
59- None
60- }
61- }
62- }
63- Some ( ValueNs :: ConstId ( c) ) => {
64- let args = GenericArgs :: new_from_iter ( interner, [ ] ) ;
65- Some ( Const :: new (
66- interner,
67- rustc_type_ir:: ConstKind :: Unevaluated ( UnevaluatedConst :: new (
68- SolverDefId :: ConstId ( c) ,
69- args,
70- ) ) ,
71- ) )
72- }
73- _ => None ,
74- }
75- }
76-
7731pub fn unknown_const < ' db > ( _ty : Ty < ' db > ) -> Const < ' db > {
7832 Const :: new ( DbInterner :: conjure ( ) , rustc_type_ir:: ConstKind :: Error ( ErrorGuaranteed ) )
7933}
@@ -279,8 +233,14 @@ pub(crate) fn eval_to_const<'db>(expr: ExprId, ctx: &mut InferenceContext<'_, 'd
279233 return unknown_const ( infer[ expr] ) ;
280234 }
281235 if let Expr :: Path ( p) = & ctx. body [ expr] {
282- let resolver = & ctx. resolver ;
283- if let Some ( c) = path_to_const ( ctx. db , resolver, p, || ctx. generics ( ) , infer[ expr] ) {
236+ let mut ctx = TyLoweringContext :: new (
237+ ctx. db ,
238+ & ctx. resolver ,
239+ ctx. body ,
240+ ctx. generic_def ,
241+ LifetimeElisionKind :: Infer ,
242+ ) ;
243+ if let Some ( c) = ctx. path_to_const ( p) {
284244 return c;
285245 }
286246 }
0 commit comments