fix: external module errors were ignored

This commit is contained in:
Shunsuke Shibayama 2023-04-18 19:47:04 +09:00
parent ffd33015d5
commit 943ee32db2
2 changed files with 15 additions and 20 deletions

View file

@ -813,25 +813,27 @@ impl Context {
match expr {
ast::Expr::Def(def) => {
if let Err(errs) = self.preregister_def(def) {
total_errs.extend(errs.into_iter());
total_errs.extend(errs);
}
if def.def_kind().is_import() {
self.pre_import(def);
if let Err(errs) = self.pre_import(def) {
total_errs.extend(errs);
}
}
}
ast::Expr::ClassDef(class_def) => {
if let Err(errs) = self.preregister_def(&class_def.def) {
total_errs.extend(errs.into_iter());
total_errs.extend(errs);
}
}
ast::Expr::PatchDef(patch_def) => {
if let Err(errs) = self.preregister_def(&patch_def.def) {
total_errs.extend(errs.into_iter());
total_errs.extend(errs);
}
}
ast::Expr::Dummy(dummy) => {
if let Err(errs) = self.preregister(&dummy.exprs) {
total_errs.extend(errs.into_iter());
total_errs.extend(errs);
}
}
_ => {}
@ -846,15 +848,15 @@ impl Context {
/// HACK: The constant expression evaluator can evaluate attributes when the type of the receiver is known.
/// import/pyimport is not a constant function, but specially assumes that the type of the module is known in the eval phase.
fn pre_import(&mut self, def: &ast::Def) {
fn pre_import(&mut self, def: &ast::Def) -> TyCheckResult<()> {
let Some(ast::Expr::Call(call)) = def.body.block.first() else { unreachable!() };
let Some(ast::Expr::Literal(mod_name)) = call.args.get_left_or_key("Path") else {
return;
return Ok(());
};
let Ok(mod_name) = hir::Literal::try_from(mod_name.token.clone()) else {
return;
return Ok(());
};
let _ = self.import_mod(call.additional_operation().unwrap(), &mod_name);
let res = self.import_mod(call.additional_operation().unwrap(), &mod_name);
let arg = TyParam::Value(ValueObj::Str(
mod_name.token.content.replace('\"', "").into(),
));
@ -869,13 +871,14 @@ impl Context {
params: vec![arg],
}
};
let Some(ident) = def.sig.ident() else { return };
let Some(ident) = def.sig.ident() else { return Ok(()) };
let Some((_, vi)) = self.get_var_info(ident.inspect()) else {
return;
return Ok(());
};
if let Some(fv) = vi.t.as_free() {
fv.link(&typ);
}
res.map(|_| ())
}
pub(crate) fn preregister_def(&mut self, def: &ast::Def) -> TyCheckResult<()> {

View file

@ -1026,17 +1026,9 @@ impl ASTLowerer {
Ok(call)
}
/// importing is done in [preregister](https://github.com/erg-lang/erg/blob/ffd33015d540ff5a0b853b28c01370e46e0fcc52/crates/erg_compiler/context/register.rs#L819)
fn exec_additional_op(&mut self, call: &mut hir::Call) -> LowerResult<()> {
match call.additional_operation() {
Some(kind @ (OperationKind::Import | OperationKind::PyImport)) => {
let hir::Expr::Lit(mod_name) = call.args.get_left_or_key("Path").unwrap() else {
return unreachable_error!(LowerErrors, LowerError, self);
};
if let Err(errs) = self.module.context.import_mod(kind, mod_name) {
self.errs.extend(errs);
};
Ok(())
}
Some(OperationKind::Del) => match call.args.get_left_or_key("obj").unwrap() {
hir::Expr::Accessor(hir::Accessor::Ident(ident)) => {
self.module.context.del(ident)?;