mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-04 02:39:20 +00:00
fix(compiler): runtime type matching system
This commit is contained in:
parent
92614ce8d2
commit
af0fff8226
25 changed files with 793 additions and 429 deletions
|
@ -761,6 +761,26 @@ impl Context {
|
|||
self.methods_list = methods_list;
|
||||
}
|
||||
|
||||
fn resolve_params_t(&self, params: &mut hir::Params) -> TyCheckResult<()> {
|
||||
for param in params.non_defaults.iter_mut() {
|
||||
param.vi.t =
|
||||
self.deref_tyvar(mem::take(&mut param.vi.t), Contravariant, param.loc())?;
|
||||
}
|
||||
if let Some(var_params) = &mut params.var_params {
|
||||
var_params.vi.t = self.deref_tyvar(
|
||||
mem::take(&mut var_params.vi.t),
|
||||
Contravariant,
|
||||
var_params.loc(),
|
||||
)?;
|
||||
}
|
||||
for param in params.defaults.iter_mut() {
|
||||
param.sig.vi.t =
|
||||
self.deref_tyvar(mem::take(&mut param.sig.vi.t), Contravariant, param.loc())?;
|
||||
self.resolve_expr_t(&mut param.default_val)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn resolve_expr_t(&self, expr: &mut hir::Expr) -> TyCheckResult<()> {
|
||||
match expr {
|
||||
hir::Expr::Lit(_) => Ok(()),
|
||||
|
@ -898,6 +918,9 @@ impl Context {
|
|||
hir::Expr::Def(def) => {
|
||||
*def.sig.ref_mut_t() =
|
||||
self.deref_tyvar(mem::take(def.sig.ref_mut_t()), Covariant, def.sig.loc())?;
|
||||
if let Some(params) = def.sig.params_mut() {
|
||||
self.resolve_params_t(params)?;
|
||||
}
|
||||
for chunk in def.body.block.iter_mut() {
|
||||
self.resolve_expr_t(chunk)?;
|
||||
}
|
||||
|
@ -905,6 +928,7 @@ impl Context {
|
|||
}
|
||||
hir::Expr::Lambda(lambda) => {
|
||||
lambda.t = self.deref_tyvar(mem::take(&mut lambda.t), Covariant, lambda.loc())?;
|
||||
self.resolve_params_t(&mut lambda.params)?;
|
||||
for chunk in lambda.body.iter_mut() {
|
||||
self.resolve_expr_t(chunk)?;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue