mirror of
https://github.com/erg-lang/erg.git
synced 2025-08-04 02:39:20 +00:00
feat: support using attributes in predicate
This commit is contained in:
parent
47818e431e
commit
0bedeb51ab
6 changed files with 194 additions and 21 deletions
|
@ -1664,7 +1664,9 @@ impl Context {
|
|||
Predicate::Call { receiver, name, .. } => {
|
||||
let receiver_t = self.get_tp_t(receiver).unwrap_or(Obj);
|
||||
if let Some(name) = name {
|
||||
let ctx = self.get_nominal_type_ctx(&receiver_t).unwrap();
|
||||
let Some(ctx) = self.get_nominal_type_ctx(&receiver_t) else {
|
||||
return Obj;
|
||||
};
|
||||
if let Some((_, method)) = ctx.get_var_info(name) {
|
||||
method.t.return_t().cloned().unwrap_or(Obj)
|
||||
} else {
|
||||
|
@ -1674,6 +1676,17 @@ impl Context {
|
|||
receiver_t.return_t().cloned().unwrap_or(Obj)
|
||||
}
|
||||
}
|
||||
Predicate::Attr { receiver, name } => {
|
||||
let receiver_t = self.get_tp_t(receiver).unwrap_or(Obj);
|
||||
let Some(ctx) = self.get_nominal_type_ctx(&receiver_t) else {
|
||||
return Obj;
|
||||
};
|
||||
if let Some((_, field)) = ctx.get_var_info(name) {
|
||||
field.t.clone()
|
||||
} else {
|
||||
Obj
|
||||
}
|
||||
}
|
||||
// REVIEW
|
||||
Predicate::GeneralEqual { rhs, .. }
|
||||
| Predicate::GeneralGreaterEqual { rhs, .. }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue