mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
use pat_id instead of name in const eval stack
This commit is contained in:
parent
22eaee25b8
commit
bf4a1e4842
@ -8,13 +8,12 @@ use std::{
|
|||||||
|
|
||||||
use chalk_ir::{BoundVar, DebruijnIndex, GenericArgData, IntTy, Scalar};
|
use chalk_ir::{BoundVar, DebruijnIndex, GenericArgData, IntTy, Scalar};
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
expr::{ArithOp, BinaryOp, Expr, ExprId, Literal, Pat},
|
expr::{ArithOp, BinaryOp, Expr, ExprId, Literal, Pat, PatId},
|
||||||
path::ModPath,
|
path::ModPath,
|
||||||
resolver::{resolver_for_expr, ResolveValueResult, Resolver, ValueNs},
|
resolver::{resolver_for_expr, ResolveValueResult, Resolver, ValueNs},
|
||||||
type_ref::ConstScalar,
|
type_ref::ConstScalar,
|
||||||
ConstId, DefWithBodyId,
|
ConstId, DefWithBodyId,
|
||||||
};
|
};
|
||||||
use hir_expand::name::Name;
|
|
||||||
use la_arena::{Arena, Idx};
|
use la_arena::{Arena, Idx};
|
||||||
use stdx::never;
|
use stdx::never;
|
||||||
|
|
||||||
@ -57,7 +56,7 @@ pub struct ConstEvalCtx<'a> {
|
|||||||
pub owner: DefWithBodyId,
|
pub owner: DefWithBodyId,
|
||||||
pub exprs: &'a Arena<Expr>,
|
pub exprs: &'a Arena<Expr>,
|
||||||
pub pats: &'a Arena<Pat>,
|
pub pats: &'a Arena<Pat>,
|
||||||
pub local_data: HashMap<Name, ComputedExpr>,
|
pub local_data: HashMap<PatId, ComputedExpr>,
|
||||||
infer: &'a InferenceResult,
|
infer: &'a InferenceResult,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,13 +265,13 @@ pub fn eval_const(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Expr::Block { statements, tail, .. } => {
|
Expr::Block { statements, tail, .. } => {
|
||||||
let mut prev_values = HashMap::<Name, Option<ComputedExpr>>::default();
|
let mut prev_values = HashMap::<PatId, Option<ComputedExpr>>::default();
|
||||||
for statement in &**statements {
|
for statement in &**statements {
|
||||||
match *statement {
|
match *statement {
|
||||||
hir_def::expr::Statement::Let { pat, initializer, .. } => {
|
hir_def::expr::Statement::Let { pat: pat_id, initializer, .. } => {
|
||||||
let pat = &ctx.pats[pat];
|
let pat = &ctx.pats[pat_id];
|
||||||
let name = match pat {
|
match pat {
|
||||||
Pat::Bind { name, subpat, .. } if subpat.is_none() => name.clone(),
|
Pat::Bind { subpat, .. } if subpat.is_none() => (),
|
||||||
_ => {
|
_ => {
|
||||||
return Err(ConstEvalError::NotSupported("complex patterns in let"))
|
return Err(ConstEvalError::NotSupported("complex patterns in let"))
|
||||||
}
|
}
|
||||||
@ -281,11 +280,11 @@ pub fn eval_const(
|
|||||||
Some(x) => eval_const(x, ctx)?,
|
Some(x) => eval_const(x, ctx)?,
|
||||||
None => continue,
|
None => continue,
|
||||||
};
|
};
|
||||||
if !prev_values.contains_key(&name) {
|
if !prev_values.contains_key(&pat_id) {
|
||||||
let prev = ctx.local_data.insert(name.clone(), value);
|
let prev = ctx.local_data.insert(pat_id, value);
|
||||||
prev_values.insert(name, prev);
|
prev_values.insert(pat_id, prev);
|
||||||
} else {
|
} else {
|
||||||
ctx.local_data.insert(name, value);
|
ctx.local_data.insert(pat_id, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hir_def::expr::Statement::Expr { .. } => {
|
hir_def::expr::Statement::Expr { .. } => {
|
||||||
@ -330,12 +329,10 @@ pub fn eval_const(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
match pr {
|
match pr {
|
||||||
ValueNs::LocalBinding(_) => {
|
ValueNs::LocalBinding(pat_id) => {
|
||||||
let name =
|
|
||||||
p.mod_path().as_ident().ok_or(ConstEvalError::NotSupported("big paths"))?;
|
|
||||||
let r = ctx
|
let r = ctx
|
||||||
.local_data
|
.local_data
|
||||||
.get(name)
|
.get(&pat_id)
|
||||||
.ok_or(ConstEvalError::NotSupported("Unexpected missing local"))?;
|
.ok_or(ConstEvalError::NotSupported("Unexpected missing local"))?;
|
||||||
Ok(r.clone())
|
Ok(r.clone())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user