Do basic checks for final declaration on self in __init__. Additional re-definition checks are performed by `analyze_lvalue`.
(self, s: AssignmentStmt)
| 3806 | return True |
| 3807 | |
| 3808 | def check_final_implicit_def(self, s: AssignmentStmt) -> None: |
| 3809 | """Do basic checks for final declaration on self in __init__. |
| 3810 | |
| 3811 | Additional re-definition checks are performed by `analyze_lvalue`. |
| 3812 | """ |
| 3813 | if not s.is_final_def: |
| 3814 | return |
| 3815 | lval = s.lvalues[0] |
| 3816 | assert isinstance(lval, RefExpr) |
| 3817 | if isinstance(lval, MemberExpr): |
| 3818 | if not self.is_self_member_ref(lval): |
| 3819 | self.fail("Final can be only applied to a name or an attribute on self", s) |
| 3820 | s.is_final_def = False |
| 3821 | return |
| 3822 | else: |
| 3823 | assert self.function_stack |
| 3824 | if self.function_stack[-1].name != "__init__": |
| 3825 | self.fail("Can only declare a final attribute in class body or __init__", s) |
| 3826 | s.is_final_def = False |
| 3827 | return |
| 3828 | |
| 3829 | def store_final_status(self, s: AssignmentStmt) -> None: |
| 3830 | """If this is a locally valid final declaration, set the corresponding flag on `Var`.""" |
no test coverage detected