| @@ -27,33 +27,39 @@ class PropagatePositions: | |||||
| def __call__(self, children): | def __call__(self, children): | ||||
| res = self.node_builder(children) | res = self.node_builder(children) | ||||
| # local reference to Tree.meta reduces number of presence checks | |||||
| if isinstance(res, Tree): | if isinstance(res, Tree): | ||||
| res_meta = res.meta | |||||
| for c in children: | for c in children: | ||||
| if isinstance(c, Tree) and not c.meta.empty: | |||||
| res.meta.line = c.meta.line | |||||
| res.meta.column = c.meta.column | |||||
| res.meta.start_pos = c.meta.start_pos | |||||
| res.meta.empty = False | |||||
| break | |||||
| if isinstance(c, Tree): | |||||
| child_meta = c.meta | |||||
| if not child_meta.empty: | |||||
| res_meta.line = child_meta.line | |||||
| res_meta.column = child_meta.column | |||||
| res_meta.start_pos = child_meta.start_pos | |||||
| res_meta.empty = False | |||||
| break | |||||
| elif isinstance(c, Token): | elif isinstance(c, Token): | ||||
| res.meta.line = c.line | |||||
| res.meta.column = c.column | |||||
| res.meta.start_pos = c.pos_in_stream | |||||
| res.meta.empty = False | |||||
| res_meta.line = c.line | |||||
| res_meta.column = c.column | |||||
| res_meta.start_pos = c.pos_in_stream | |||||
| res_meta.empty = False | |||||
| break | break | ||||
| for c in reversed(children): | for c in reversed(children): | ||||
| if isinstance(c, Tree) and not c.meta.empty: | |||||
| res.meta.end_line = c.meta.end_line | |||||
| res.meta.end_column = c.meta.end_column | |||||
| res.meta.end_pos = c.meta.end_pos | |||||
| res.meta.empty = False | |||||
| break | |||||
| if isinstance(c, Tree): | |||||
| child_meta = c.meta | |||||
| if not child_meta.empty: | |||||
| res_meta.end_line = child_meta.end_line | |||||
| res_meta.end_column = child_meta.end_column | |||||
| res_meta.end_pos = child_meta.end_pos | |||||
| res_meta.empty = False | |||||
| break | |||||
| elif isinstance(c, Token): | elif isinstance(c, Token): | ||||
| res.meta.end_line = c.end_line | |||||
| res.meta.end_column = c.end_column | |||||
| res.meta.end_pos = c.end_pos | |||||
| res.meta.empty = False | |||||
| res_meta.end_line = c.end_line | |||||
| res_meta.end_column = c.end_column | |||||
| res_meta.end_pos = c.end_pos | |||||
| res_meta.empty = False | |||||
| break | break | ||||
| return res | return res | ||||