@@ -8,13 +8,12 @@ use std::{
8
8
9
9
use chalk_ir:: { BoundVar , DebruijnIndex , GenericArgData , IntTy , Scalar } ;
10
10
use hir_def:: {
11
- expr:: { ArithOp , BinaryOp , Expr , ExprId , Literal , Pat } ,
11
+ expr:: { ArithOp , BinaryOp , Expr , ExprId , Literal , Pat , PatId } ,
12
12
path:: ModPath ,
13
13
resolver:: { resolver_for_expr, ResolveValueResult , Resolver , ValueNs } ,
14
14
type_ref:: ConstScalar ,
15
15
ConstId , DefWithBodyId ,
16
16
} ;
17
- use hir_expand:: name:: Name ;
18
17
use la_arena:: { Arena , Idx } ;
19
18
use stdx:: never;
20
19
@@ -57,7 +56,7 @@ pub struct ConstEvalCtx<'a> {
57
56
pub owner : DefWithBodyId ,
58
57
pub exprs : & ' a Arena < Expr > ,
59
58
pub pats : & ' a Arena < Pat > ,
60
- pub local_data : HashMap < Name , ComputedExpr > ,
59
+ pub local_data : HashMap < PatId , ComputedExpr > ,
61
60
infer : & ' a InferenceResult ,
62
61
}
63
62
@@ -266,13 +265,13 @@ pub fn eval_const(
266
265
}
267
266
}
268
267
Expr :: Block { statements, tail, .. } => {
269
- let mut prev_values = HashMap :: < Name , Option < ComputedExpr > > :: default ( ) ;
268
+ let mut prev_values = HashMap :: < PatId , Option < ComputedExpr > > :: default ( ) ;
270
269
for statement in & * * statements {
271
270
match * statement {
272
- hir_def:: expr:: Statement :: Let { pat, initializer, .. } => {
273
- let pat = & ctx. pats [ pat ] ;
274
- let name = match pat {
275
- Pat :: Bind { name , subpat, .. } if subpat. is_none ( ) => name . clone ( ) ,
271
+ hir_def:: expr:: Statement :: Let { pat : pat_id , initializer, .. } => {
272
+ let pat = & ctx. pats [ pat_id ] ;
273
+ match pat {
274
+ Pat :: Bind { subpat, .. } if subpat. is_none ( ) => ( ) ,
276
275
_ => {
277
276
return Err ( ConstEvalError :: NotSupported ( "complex patterns in let" ) )
278
277
}
@@ -281,11 +280,11 @@ pub fn eval_const(
281
280
Some ( x) => eval_const ( x, ctx) ?,
282
281
None => continue ,
283
282
} ;
284
- if !prev_values. contains_key ( & name ) {
285
- let prev = ctx. local_data . insert ( name . clone ( ) , value) ;
286
- prev_values. insert ( name , prev) ;
283
+ if !prev_values. contains_key ( & pat_id ) {
284
+ let prev = ctx. local_data . insert ( pat_id , value) ;
285
+ prev_values. insert ( pat_id , prev) ;
287
286
} else {
288
- ctx. local_data . insert ( name , value) ;
287
+ ctx. local_data . insert ( pat_id , value) ;
289
288
}
290
289
}
291
290
hir_def:: expr:: Statement :: Expr { .. } => {
@@ -330,12 +329,10 @@ pub fn eval_const(
330
329
}
331
330
} ;
332
331
match pr {
333
- ValueNs :: LocalBinding ( _) => {
334
- let name =
335
- p. mod_path ( ) . as_ident ( ) . ok_or ( ConstEvalError :: NotSupported ( "big paths" ) ) ?;
332
+ ValueNs :: LocalBinding ( pat_id) => {
336
333
let r = ctx
337
334
. local_data
338
- . get ( name )
335
+ . get ( & pat_id )
339
336
. ok_or ( ConstEvalError :: NotSupported ( "Unexpected missing local" ) ) ?;
340
337
Ok ( r. clone ( ) )
341
338
}
0 commit comments