Skip to content

Commit bf4a1e4

Browse files
committed
use pat_id instead of name in const eval stack
1 parent 22eaee2 commit bf4a1e4

File tree

1 file changed

+13
-16
lines changed

1 file changed

+13
-16
lines changed

crates/hir_ty/src/consteval.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ use std::{
88

99
use chalk_ir::{BoundVar, DebruijnIndex, GenericArgData, IntTy, Scalar};
1010
use 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;
1817
use la_arena::{Arena, Idx};
1918
use 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

Comments
 (0)