(builder: IRBuilder, target: AssignmentTarget, line: int)
| 1220 | |
| 1221 | |
| 1222 | def transform_del_item(builder: IRBuilder, target: AssignmentTarget, line: int) -> None: |
| 1223 | if isinstance(target, AssignmentTargetIndex): |
| 1224 | builder.gen_method_call( |
| 1225 | target.base, "__delitem__", [target.index], result_type=None, line=line |
| 1226 | ) |
| 1227 | elif isinstance(target, AssignmentTargetAttr): |
| 1228 | if isinstance(target.obj_type, RInstance): |
| 1229 | cl = target.obj_type.class_ir |
| 1230 | if not cl.is_deletable(target.attr): |
| 1231 | builder.error(f'"{target.attr}" cannot be deleted', line) |
| 1232 | builder.note( |
| 1233 | 'Using "__deletable__ = ' |
| 1234 | + '[\'<attr>\']" in the class body enables "del obj.<attr>"', |
| 1235 | line, |
| 1236 | ) |
| 1237 | key = builder.load_str(target.attr) |
| 1238 | builder.primitive_op(py_delattr_op, [target.obj, key], line) |
| 1239 | elif isinstance(target, AssignmentTargetRegister): |
| 1240 | # Delete a local by assigning an error value to it, which will |
| 1241 | # prompt the insertion of uninit checks. |
| 1242 | builder.add( |
| 1243 | Assign(target.register, builder.add(LoadErrorValue(target.type, undefines=True))) |
| 1244 | ) |
| 1245 | elif isinstance(target, AssignmentTargetTuple): |
| 1246 | for subtarget in target.items: |
| 1247 | transform_del_item(builder, subtarget, line) |
| 1248 | |
| 1249 | |
| 1250 | # yield/yield from/await |
no test coverage detected
searching dependent graphs…