@@ -8,13 +8,12 @@ use std::{
88
99use chalk_ir:: { BoundVar , DebruijnIndex , GenericArgData , IntTy , Scalar } ;
1010use hir_def:: {
11- expr:: { ArithOp , BinaryOp , Expr , ExprId , Literal , Pat } ,
11+ expr:: { ArithOp , BinaryOp , Expr , ExprId , Literal , Pat , PatId } ,
1212 path:: ModPath ,
1313 resolver:: { resolver_for_expr, ResolveValueResult , Resolver , ValueNs } ,
1414 type_ref:: ConstScalar ,
1515 ConstId , DefWithBodyId ,
1616} ;
17- use hir_expand:: name:: Name ;
1817use la_arena:: { Arena , Idx } ;
1918use stdx:: never;
2019
@@ -57,7 +56,7 @@ pub struct ConstEvalCtx<'a> {
5756 pub owner : DefWithBodyId ,
5857 pub exprs : & ' a Arena < Expr > ,
5958 pub pats : & ' a Arena < Pat > ,
60- pub local_data : HashMap < Name , ComputedExpr > ,
59+ pub local_data : HashMap < PatId , ComputedExpr > ,
6160 infer : & ' a InferenceResult ,
6261}
6362
@@ -266,13 +265,13 @@ pub fn eval_const(
266265 }
267266 }
268267 Expr :: Block { statements, tail, .. } => {
269- let mut prev_values = HashMap :: < Name , Option < ComputedExpr > > :: default ( ) ;
268+ let mut prev_values = HashMap :: < PatId , Option < ComputedExpr > > :: default ( ) ;
270269 for statement in & * * statements {
271270 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 ( ) => ( ) ,
276275 _ => {
277276 return Err ( ConstEvalError :: NotSupported ( "complex patterns in let" ) )
278277 }
@@ -281,11 +280,11 @@ pub fn eval_const(
281280 Some ( x) => eval_const ( x, ctx) ?,
282281 None => continue ,
283282 } ;
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) ;
287286 } else {
288- ctx. local_data . insert ( name , value) ;
287+ ctx. local_data . insert ( pat_id , value) ;
289288 }
290289 }
291290 hir_def:: expr:: Statement :: Expr { .. } => {
@@ -330,12 +329,10 @@ pub fn eval_const(
330329 }
331330 } ;
332331 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) => {
336333 let r = ctx
337334 . local_data
338- . get ( name )
335+ . get ( & pat_id )
339336 . ok_or ( ConstEvalError :: NotSupported ( "Unexpected missing local" ) ) ?;
340337 Ok ( r. clone ( ) )
341338 }
0 commit comments