Traverse GN parse-tree and build resulting object.
| 89 | |
| 90 | |
| 91 | class V8GNTransformer(object): |
| 92 | """ |
| 93 | Traverse GN parse-tree and build resulting object. |
| 94 | """ |
| 95 | def __init__(self, builder, filtered_targets): |
| 96 | self.builder = builder |
| 97 | self.filtered_targets = filtered_targets |
| 98 | self.current_target = None |
| 99 | |
| 100 | def Traverse(self, tree): |
| 101 | self.builder.BuildPrologue() |
| 102 | self.TraverseTargets(tree) |
| 103 | self.builder.BuildEpilogue() |
| 104 | |
| 105 | def TraverseTargets(self, tree): |
| 106 | 'Traverse top level GN targets and call the builder functions' |
| 107 | for stmt in tree.children: |
| 108 | if stmt.data != 'call': |
| 109 | continue |
| 110 | target_type = stmt.children[0] |
| 111 | if target_type not in V8_TARGET_TYPES: |
| 112 | continue |
| 113 | target = stmt.children[1].children[0].strip('\"') |
| 114 | if target not in self.filtered_targets: |
| 115 | continue |
| 116 | self.current_target = target |
| 117 | self._Target(target_type, target, stmt.children[2].children) |
| 118 | |
| 119 | def _Target(self, target_type, target, stmts): |
| 120 | stmts = self._StatementList(stmts) |
| 121 | return self.builder.BuildTarget(target_type, target, stmts) |
| 122 | |
| 123 | def _StatementList(self, stmts): |
| 124 | built_stmts = [] |
| 125 | for stmt in stmts: |
| 126 | built_stmts.append(self._Statement(stmt)) |
| 127 | return [stmt for stmt in built_stmts if stmt] |
| 128 | |
| 129 | def _Statement(self, stmt): |
| 130 | # Handle only interesting gn statements. |
| 131 | with suppress(KeyError): |
| 132 | return self.STATEMENTS[stmt.data](self, *stmt.children) |
| 133 | |
| 134 | def _Assignment(self, left, op, right): |
| 135 | return self.ASSIGN_TYPES[op.data](self, left, right) |
| 136 | |
| 137 | def _AssignEq(self, left, right): |
| 138 | if left == 'sources': |
| 139 | return self.builder.BuildSourcesList( |
| 140 | self.current_target, [str(token) for token in right.children]) |
| 141 | |
| 142 | def _AssignAdd(self, left, right): |
| 143 | if left == 'sources': |
| 144 | return self.builder.BuildAppendSources( |
| 145 | self.current_target, [str(token) for token in right.children]) |
| 146 | |
| 147 | def _AssignSub(self, left, right): |
| 148 | if left == 'sources': |