Update register.rs

This commit is contained in:
Shunsuke Shibayama 2022-12-11 11:39:47 +09:00
parent 27c58e803f
commit 09cca638a6

View file

@ -441,7 +441,7 @@ impl Context {
let non_default_params = t.non_default_params().unwrap(); let non_default_params = t.non_default_params().unwrap();
let var_args = t.var_args(); let var_args = t.var_args();
let default_params = t.default_params().unwrap(); let default_params = t.default_params().unwrap();
if let Some(spec_ret_t) = t.return_t() { let mut errs = if let Some(spec_ret_t) = t.return_t() {
self.sub_unify(body_t, spec_ret_t, ident.loc(), None) self.sub_unify(body_t, spec_ret_t, ident.loc(), None)
.map_err(|errs| { .map_err(|errs| {
TyCheckErrors::new( TyCheckErrors::new(
@ -450,8 +450,7 @@ impl Context {
TyCheckError::return_type_error( TyCheckError::return_type_error(
self.cfg.input.clone(), self.cfg.input.clone(),
line!() as usize, line!() as usize,
// TODO: is it possible to get 0? e.core.get_loc_with_fallback(),
e.core.sub_messages.get(0).unwrap().loc,
e.caused_by, e.caused_by,
readable_name(name.inspect()), readable_name(name.inspect()),
spec_ret_t, spec_ret_t,
@ -460,28 +459,35 @@ impl Context {
}) })
.collect(), .collect(),
) )
})?; })
} } else {
Ok(())
};
let return_t = if errs.is_err() {
Type::Failure
} else {
body_t.clone()
};
let sub_t = if ident.is_procedural() { let sub_t = if ident.is_procedural() {
proc( proc(
non_default_params.clone(), non_default_params.clone(),
var_args.cloned(), var_args.cloned(),
default_params.clone(), default_params.clone(),
body_t.clone(), return_t,
) )
} else { } else {
func( func(
non_default_params.clone(), non_default_params.clone(),
var_args.cloned(), var_args.cloned(),
default_params.clone(), default_params.clone(),
body_t.clone(), return_t,
) )
}; };
sub_t.lift(); sub_t.lift();
let found_t = self.generalize_t(sub_t); let found_t = self.generalize_t(sub_t);
let py_name = if let Some(vi) = self.decls.remove(name) { let py_name = if let Some(vi) = self.decls.remove(name) {
if !self.supertype_of(&vi.t, &found_t) { if !self.supertype_of(&vi.t, &found_t) {
return Err(TyCheckErrors::from(TyCheckError::violate_decl_error( let err = TyCheckError::violate_decl_error(
self.cfg.input.clone(), self.cfg.input.clone(),
line!() as usize, line!() as usize,
ident.loc(), ident.loc(),
@ -489,7 +495,15 @@ impl Context {
name.inspect(), name.inspect(),
&vi.t, &vi.t,
&found_t, &found_t,
))); );
match errs {
Ok(()) => {
errs = Err(TyCheckErrors::from(err));
}
Err(ref mut es) => {
es.push(err);
}
}
} }
vi.py_name vi.py_name
} else { } else {
@ -516,6 +530,7 @@ impl Context {
let t = vi.t.clone(); let t = vi.t.clone();
log!(info "Registered {}::{name}: {t}", self.name); log!(info "Registered {}::{name}: {t}", self.name);
self.locals.insert(name.clone(), vi); self.locals.insert(name.clone(), vi);
errs?;
Ok(t) Ok(t)
} }