mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-30 04:44:44 +00:00
Update register.rs
This commit is contained in:
parent
27c58e803f
commit
09cca638a6
1 changed files with 24 additions and 9 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue