chore: error report delay with variable defs

This commit is contained in:
Shunsuke Shibayama 2024-08-18 13:18:20 +09:00
parent 9682c0ddaf
commit 4da45eb842
3 changed files with 47 additions and 9 deletions

View file

@ -677,6 +677,7 @@ impl Context {
.into(),
)
})?;
// TODO: __call__
let subr = option_enum_unwrap!(obj, ValueObj::Subr)
.ok_or_else(|| {
(

View file

@ -1277,14 +1277,29 @@ impl Context {
match &def.sig {
ast::Signature::Subr(sig) => {
if sig.is_const() {
let tv_cache = self
.instantiate_ty_bounds(&sig.bounds, PreRegister)
.map_err(|(_, errs)| errs)?;
let tv_cache = match self.instantiate_ty_bounds(&sig.bounds, PreRegister) {
Ok(tv_cache) => tv_cache,
Err((tv_cache, es)) => {
errs.extend(es);
tv_cache
}
};
let vis = self.instantiate_vis_modifier(sig.vis())?;
self.grow(__name__, ContextKind::Proc, vis, Some(tv_cache));
let (obj, const_t) = match self.eval_const_block(&def.body.block) {
Ok(obj) => (obj.clone(), v_enum(set! {obj})),
Err((obj, es)) => {
if PYTHON_MODE {
self.pop();
if let Err(es) = self.declare_sub(sig, id) {
errs.extend(es);
}
if errs.is_empty() {
return Ok(());
} else {
return Err(errs);
}
}
errs.extend(es);
(obj.clone(), v_enum(set! {obj}))
}
@ -1311,14 +1326,16 @@ impl Context {
})?;
}
self.pop();
self.register_gen_const(
if let Err(es) = self.register_gen_const(
def.sig.ident().unwrap(),
obj,
call,
def.def_kind().is_other(),
)?;
} else {
self.declare_sub(sig, id)?;
) {
errs.extend(es);
}
} else if let Err(es) = self.declare_sub(sig, id) {
errs.extend(es);
}
}
ast::Signature::Var(sig) => {
@ -1329,6 +1346,17 @@ impl Context {
let (obj, const_t) = match self.eval_const_block(&def.body.block) {
Ok(obj) => (obj.clone(), v_enum(set! {obj})),
Err((obj, es)) => {
if PYTHON_MODE {
self.pop();
if let Err((_, es)) = self.pre_define_var(sig, id) {
errs.extend(es);
}
if errs.is_empty() {
return Ok(());
} else {
return Err(errs);
}
}
errs.extend(es);
(obj.clone(), v_enum(set! {obj}))
}
@ -1356,7 +1384,11 @@ impl Context {
}
self.pop();
if let Some(ident) = sig.ident() {
self.register_gen_const(ident, obj, call, def.def_kind().is_other())?;
if let Err(es) =
self.register_gen_const(ident, obj, call, def.def_kind().is_other())
{
errs.extend(es);
}
}
} else if let Err((_, es)) = self.pre_define_var(sig, id) {
errs.extend(es);