| 25 | |
| 26 | |
| 27 | class Optimizer(NodeTransformer): |
| 28 | def __init__(self, environment: "t.Optional[Environment]") -> None: |
| 29 | self.environment = environment |
| 30 | |
| 31 | def generic_visit( |
| 32 | self, node: nodes.Node, *args: t.Any, **kwargs: t.Any |
| 33 | ) -> nodes.Node: |
| 34 | node = super().generic_visit(node, *args, **kwargs) |
| 35 | |
| 36 | # Do constant folding. Some other nodes besides Expr have |
| 37 | # as_const, but folding them causes errors later on. |
| 38 | if isinstance(node, nodes.Expr): |
| 39 | try: |
| 40 | return nodes.Const.from_untrusted( |
| 41 | node.as_const(args[0] if args else None), |
| 42 | lineno=node.lineno, |
| 43 | environment=self.environment, |
| 44 | ) |
| 45 | except nodes.Impossible: |
| 46 | pass |
| 47 | |
| 48 | return node |