Returns a deep copy of node (excluding some fields, see copy_clean).
(self, node)
| 35 | self.preserve_annos = preserve_annos |
| 36 | |
| 37 | def copy(self, node): |
| 38 | """Returns a deep copy of node (excluding some fields, see copy_clean).""" |
| 39 | |
| 40 | if isinstance(node, list): |
| 41 | return [self.copy(n) for n in node] |
| 42 | elif isinstance(node, tuple): |
| 43 | return tuple(self.copy(n) for n in node) |
| 44 | elif not isinstance(node, (gast.AST, ast.AST)): |
| 45 | # Assuming everything that's not an AST, list or tuple is a value type |
| 46 | # and may simply be assigned. |
| 47 | return node |
| 48 | |
| 49 | assert isinstance(node, (gast.AST, ast.AST)) |
| 50 | |
| 51 | new_fields = {} |
| 52 | for f in node._fields: |
| 53 | if not f.startswith('__') and hasattr(node, f): |
| 54 | new_fields[f] = self.copy(getattr(node, f)) |
| 55 | new_node = type(node)(**new_fields) |
| 56 | |
| 57 | if self.preserve_annos: |
| 58 | for k in self.preserve_annos: |
| 59 | anno.copyanno(node, new_node, k) |
| 60 | return new_node |
| 61 | |
| 62 | |
| 63 | def copy_clean(node, preserve_annos=None): |