(self, lowered: dict)
| 461 | return |
| 462 | |
| 463 | def lower_once(self, lowered: dict): |
| 464 | # Check for a cached result |
| 465 | try: |
| 466 | return lowered[self._name] |
| 467 | except KeyError: |
| 468 | pass |
| 469 | |
| 470 | expr = self |
| 471 | |
| 472 | # Lower this node |
| 473 | out = expr._lower() |
| 474 | if out is None: |
| 475 | out = expr |
| 476 | if not isinstance(out, Expr): |
| 477 | return out |
| 478 | |
| 479 | # Lower all children |
| 480 | new_operands = [] |
| 481 | changed = False |
| 482 | for operand in out.operands: |
| 483 | if isinstance(operand, Expr): |
| 484 | new = operand.lower_once(lowered) |
| 485 | if new._name != operand._name: |
| 486 | changed = True |
| 487 | else: |
| 488 | new = operand |
| 489 | new_operands.append(new) |
| 490 | |
| 491 | if changed: |
| 492 | out = type(out)(*new_operands) |
| 493 | |
| 494 | # Cache the result and return |
| 495 | return lowered.setdefault(self._name, out) |
| 496 | |
| 497 | def lower_completely(self) -> Expr: |
| 498 | """Lower an expression completely |
no test coverage detected