Generate additional dependencies for an lvalue.
(self, lvalue: Expression)
| 519 | self.add_dependency(make_trigger(fname), make_trigger(lv.fullname)) |
| 520 | |
| 521 | def process_lvalue(self, lvalue: Expression) -> None: |
| 522 | """Generate additional dependencies for an lvalue.""" |
| 523 | if isinstance(lvalue, IndexExpr): |
| 524 | self.add_operator_method_dependency(lvalue.base, "__setitem__") |
| 525 | elif isinstance(lvalue, NameExpr): |
| 526 | if lvalue.kind in (MDEF, GDEF): |
| 527 | # Assignment to an attribute in the class body, or direct assignment to a |
| 528 | # global variable. |
| 529 | lvalue_type = self.get_non_partial_lvalue_type(lvalue) |
| 530 | type_triggers = self.get_type_triggers(lvalue_type) |
| 531 | attr_trigger = make_trigger(f"{self.scope.current_full_target()}.{lvalue.name}") |
| 532 | for type_trigger in type_triggers: |
| 533 | self.add_dependency(type_trigger, attr_trigger) |
| 534 | elif isinstance(lvalue, MemberExpr): |
| 535 | if self.is_self_member_ref(lvalue) and lvalue.is_new_def: |
| 536 | node = lvalue.node |
| 537 | if isinstance(node, Var): |
| 538 | info = node.info |
| 539 | if info and has_user_bases(info): |
| 540 | # Recheck Liskov for self definitions |
| 541 | self.add_dependency(make_trigger(info.fullname + "." + lvalue.name)) |
| 542 | if lvalue.kind is None: |
| 543 | # Reference to a non-module attribute |
| 544 | if lvalue.expr not in self.type_map: |
| 545 | # Unreachable assignment -> not checked so no dependencies to generate. |
| 546 | return |
| 547 | object_type = self.type_map[lvalue.expr] |
| 548 | lvalue_type = self.get_non_partial_lvalue_type(lvalue) |
| 549 | type_triggers = self.get_type_triggers(lvalue_type) |
| 550 | for attr_trigger in self.attribute_triggers(object_type, lvalue.name): |
| 551 | for type_trigger in type_triggers: |
| 552 | self.add_dependency(type_trigger, attr_trigger) |
| 553 | elif isinstance(lvalue, TupleExpr): |
| 554 | for item in lvalue.items: |
| 555 | self.process_lvalue(item) |
| 556 | elif isinstance(lvalue, StarExpr): |
| 557 | self.process_lvalue(lvalue.expr) |
| 558 | |
| 559 | def is_self_member_ref(self, memberexpr: MemberExpr) -> bool: |
| 560 | """Does memberexpr to refer to an attribute of self?""" |
no test coverage detected