mirror of
https://github.com/erg-lang/erg.git
synced 2025-12-23 05:36:48 +00:00
fix: attribute type inference bug
This commit is contained in:
parent
c1f6e4b900
commit
282c82aea3
2 changed files with 31 additions and 12 deletions
|
|
@ -715,15 +715,16 @@ impl Context {
|
|||
match self.get_bound_attr_from_nominal_t(obj, ident, input, namespace) {
|
||||
Triple::Ok(vi) => {
|
||||
if let Some(self_t) = vi.t.self_t() {
|
||||
match self
|
||||
.sub_unify(obj.ref_t(), self_t, obj, Some(&"self".into()))
|
||||
let list = UndoableLinkedList::new();
|
||||
if let Err(errs) = self
|
||||
.undoable_sub_unify(obj.ref_t(), self_t, obj, &list, Some(&"self".into()))
|
||||
.map_err(|mut e| e.remove(0))
|
||||
{
|
||||
Ok(_) => {}
|
||||
Err(e) => {
|
||||
return Triple::Err(e);
|
||||
}
|
||||
return Triple::Err(errs);
|
||||
}
|
||||
drop(list);
|
||||
self.sub_unify(obj.ref_t(), self_t, obj, Some(&"self".into()))
|
||||
.unwrap();
|
||||
}
|
||||
return Triple::Ok(vi);
|
||||
}
|
||||
|
|
@ -748,14 +749,19 @@ impl Context {
|
|||
}
|
||||
}
|
||||
}
|
||||
// REVIEW: get by name > coercion?
|
||||
match self.get_attr_type_by_name(obj, ident, namespace) {
|
||||
Triple::Ok(method) => {
|
||||
if let Err(mut errs) =
|
||||
self.sub_unify(obj.ref_t(), &method.definition_type, obj, None)
|
||||
let list = UndoableLinkedList::new();
|
||||
if self
|
||||
.undoable_sub_unify(obj.ref_t(), &method.definition_type, obj, &list, None)
|
||||
.is_ok()
|
||||
{
|
||||
return Triple::Err(errs.remove(0));
|
||||
drop(list);
|
||||
self.sub_unify(obj.ref_t(), &method.definition_type, obj, None)
|
||||
.unwrap();
|
||||
return Triple::Ok(method.method_info.clone());
|
||||
}
|
||||
return Triple::Ok(method.method_info.clone());
|
||||
}
|
||||
Triple::Err(err) if ERG_MODE => {
|
||||
return Triple::Err(err);
|
||||
|
|
@ -1198,9 +1204,12 @@ impl Context {
|
|||
match self.get_attr_type_by_name(obj, attr_name, namespace) {
|
||||
Triple::Ok(method) => {
|
||||
let def_t = self.instantiate_def_type(&method.definition_type).unwrap();
|
||||
self.sub_unify(obj.ref_t(), &def_t, obj, None)
|
||||
let list = UndoableLinkedList::new();
|
||||
self.undoable_sub_unify(obj.ref_t(), &def_t, obj, &list, None)
|
||||
// HACK: change this func's return type to TyCheckResult<Type>
|
||||
.map_err(|mut errs| errs.remove(0))?;
|
||||
drop(list);
|
||||
self.sub_unify(obj.ref_t(), &def_t, obj, None).unwrap();
|
||||
return Ok(method.method_info.clone());
|
||||
}
|
||||
Triple::Err(err) => {
|
||||
|
|
@ -1319,9 +1328,12 @@ impl Context {
|
|||
match self.get_attr_type_by_name(obj, attr_name, namespace) {
|
||||
Triple::Ok(method) => {
|
||||
let def_t = self.instantiate_def_type(&method.definition_type).unwrap();
|
||||
self.sub_unify(obj.ref_t(), &def_t, obj, None)
|
||||
let list = UndoableLinkedList::new();
|
||||
self.undoable_sub_unify(obj.ref_t(), &def_t, obj, &list, None)
|
||||
// HACK: change this func's return type to TyCheckResult<Type>
|
||||
.map_err(|mut errs| errs.remove(0))?;
|
||||
drop(list);
|
||||
self.sub_unify(obj.ref_t(), &def_t, obj, None).unwrap();
|
||||
return Ok(method.method_info.clone());
|
||||
}
|
||||
Triple::Err(err) => {
|
||||
|
|
|
|||
|
|
@ -5,3 +5,10 @@ func! pkgs: [{.a = Int}; _] =
|
|||
arr
|
||||
|
||||
assert func!([{.a = 1}, {.a = 2}]) == [1, 2]
|
||||
|
||||
.Name = Class { .name = Str }
|
||||
.Name.
|
||||
parse(_: Str): Name = todo()
|
||||
.collect!(names: [{ .name = Str; }; _]) =
|
||||
for! names, rec =>
|
||||
discard .Name.parse(rec.name)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue