mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-03 18:29:00 +00:00
fix: type spec instantiating bug
This commit is contained in:
parent
a998ec1b7b
commit
8f64853dad
3 changed files with 29 additions and 15 deletions
|
@ -2620,4 +2620,24 @@ impl Context {
|
|||
_ => Type,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn get_tp_from_name(
|
||||
&self,
|
||||
name: &Str,
|
||||
tmp_tv_cache: &TyVarCache,
|
||||
) -> Option<TyParam> {
|
||||
if let Some(tp) = tmp_tv_cache.get_typaram(name) {
|
||||
Some(tp.clone())
|
||||
} else if let Some(t) = tmp_tv_cache.get_tyvar(name) {
|
||||
Some(TyParam::t(t.clone()))
|
||||
} else if let Some(tv_ctx) = &self.tv_cache {
|
||||
if let Some(t) = tv_ctx.get_tyvar(name) {
|
||||
Some(TyParam::t(t.clone()))
|
||||
} else {
|
||||
tv_ctx.get_typaram(name).cloned()
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -401,10 +401,10 @@ impl Context {
|
|||
.and_then(|name| self.get_const_local(name.token(), &self.name).ok())
|
||||
{
|
||||
return Ok(ParamTy::pos(None, v_enum(set! { value })));
|
||||
} else if let Some(tp) = sig.name().and_then(|name| {
|
||||
self.instantiate_local(name.inspect(), None, tmp_tv_cache, sig)
|
||||
.ok()
|
||||
}) {
|
||||
} else if let Some(tp) = sig
|
||||
.name()
|
||||
.and_then(|name| self.get_tp_from_name(name.inspect(), tmp_tv_cache))
|
||||
{
|
||||
match tp {
|
||||
TyParam::Type(t) => return Ok(ParamTy::pos(None, *t)),
|
||||
other => {
|
||||
|
@ -665,17 +665,8 @@ impl Context {
|
|||
};
|
||||
return Ok(TyParam::erased(t));
|
||||
}
|
||||
if let Some(tp) = tmp_tv_cache.get_typaram(name) {
|
||||
return Ok(tp.clone());
|
||||
} else if let Some(t) = tmp_tv_cache.get_tyvar(name) {
|
||||
return Ok(TyParam::t(t.clone()));
|
||||
}
|
||||
if let Some(tv_ctx) = &self.tv_cache {
|
||||
if let Some(t) = tv_ctx.get_tyvar(name) {
|
||||
return Ok(TyParam::t(t.clone()));
|
||||
} else if let Some(tp) = tv_ctx.get_typaram(name) {
|
||||
return Ok(tp.clone());
|
||||
}
|
||||
if let Some(tp) = self.get_tp_from_name(name, tmp_tv_cache) {
|
||||
return Ok(tp);
|
||||
}
|
||||
if let Some(value) = self.rec_get_const_obj(name) {
|
||||
return Ok(TyParam::Value(value.clone()));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue