mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-28 12:14:43 +00:00
chore: error report delay with variable defs
This commit is contained in:
parent
9682c0ddaf
commit
4da45eb842
3 changed files with 47 additions and 9 deletions
|
@ -677,6 +677,7 @@ impl Context {
|
|||
.into(),
|
||||
)
|
||||
})?;
|
||||
// TODO: __call__
|
||||
let subr = option_enum_unwrap!(obj, ValueObj::Subr)
|
||||
.ok_or_else(|| {
|
||||
(
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue