(original) (raw)
--- /usr/lib/python2.3/compiler/transformer.py 2004-07-05 09:23:56.000000000 +0200 +++ /home/syt/local/lib/python/compiler/transformer.py 2004-08-25 15:53:18.000000000 +0200 @@ -14,7 +14,10 @@ # # Modifications and improvements for Python 2.0 by Jeremy Hylton and # Mark Hammond - +# +# Some fixes to try to have correct line number on almost all nodes +# (except Module, Discard and Stmt) added by Sylvain Thenault +# # Portions of this file are: # Copyright (C) 1997-1998 Greg Stein. All Rights Reserved. # @@ -68,6 +71,18 @@ l.append(item) return l +from types import TupleType + +def extractLineNo(ast): + if type(ast[1]) is not TupleType: + # get a terminal node + return ast[2] + for child in ast[1:]: + if type(child) is TupleType: + lineno = extractLineNo(child) + if lineno is not None: + return lineno + def Node(*args): kind = args[0] if nodes.has_key(kind): @@ -684,16 +699,12 @@ def atom_lpar(self, nodelist): if nodelist[1][0] == token.RPAR: - n = Tuple(()) - n.lineno = nodelist[0][2] - return n + return Tuple(()) return self.com_node(nodelist[1]) def atom_lsqb(self, nodelist): if nodelist[1][0] == token.RSQB: - n = List(()) - n.lineno = nodelist[0][2] - return n + return List(()) return self.com_list_constructor(nodelist[1]) def atom_lbrace(self, nodelist): @@ -702,16 +713,12 @@ return self.com_dictmaker(nodelist[1]) def atom_backquote(self, nodelist): - n = Backquote(self.com_node(nodelist[1])) - n.lineno = nodelist[0][2] - return n + return Backquote(self.com_node(nodelist[1])) def atom_number(self, nodelist): ### need to verify this matches compile.c k = eval(nodelist[0][1]) - n = Const(k) - n.lineno = nodelist[0][2] - return n + return Const(k) def decode_literal(self, lit): if self.encoding: @@ -728,15 +735,11 @@ k = '' for node in nodelist: k += self.decode_literal(node[1]) - n = Const(k) - n.lineno = nodelist[0][2] - return n + return Const(k) def atom_name(self, nodelist): ### any processing to do? - n = Name(nodelist[0][1]) - n.lineno = nodelist[0][2] - return n + return Name(nodelist[0][1]) # -------------------------------------------------------------- # @@ -966,7 +969,9 @@ assigns = [] for i in range(1, len(node), 2): assigns.append(self.com_assign(node[i], assigning)) - return AssTuple(assigns) + n = AssTuple(assigns) + n.lineno = extractLineNo(node) + return n def com_assign_list(self, node, assigning): assigns = [] @@ -976,7 +981,9 @@ raise SyntaxError, "can't assign to list comprehension" assert node[i + 1][0] == token.COMMA, node[i + 1] assigns.append(self.com_assign(node[i], assigning)) - return AssList(assigns) + n = AssList(assigns) + n.lineno = extractLineNo(node) + return n def com_assign_name(self, node, assigning): n = AssName(node[1], assigning) @@ -994,7 +1001,9 @@ raise SyntaxError, "unknown trailer type: %s" % t def com_assign_attr(self, primary, node, assigning): - return AssAttr(primary, node[1], assigning) + n = AssAttr(primary, node[1], assigning) + n.lineno = node[-1] + return n def com_binary(self, constructor, nodelist): "Compile 'NODE (OP NODE)*' into (type, [ node1, ..., nodeN ])." @@ -1006,7 +1015,9 @@ for i in range(0, l, 2): n = nodelist[i] items.append(self.lookup_node(n)(n[1:])) - return constructor(items) + n = constructor(items) + n.lineno = extractLineNo(nodelist) + return n def com_stmt(self, node): result = self.lookup_node(node)(node[1:]) @@ -1113,7 +1124,9 @@ def com_call_function(self, primaryNode, nodelist): if nodelist[0] == token.RPAR: - return CallFunc(primaryNode, []) + n = CallFunc(primaryNode, []) + n.lineno = extractLineNo(nodelist) + return n args = [] kw = 0 len_nodelist = len(nodelist) @@ -1144,8 +1157,9 @@ dstar_node = self.com_node(ch) else: raise SyntaxError, 'unknown node type: %s' % tok - - return CallFunc(primaryNode, args, star_node, dstar_node) + n = CallFunc(primaryNode, args, star_node, dstar_node) + n.lineno = extractLineNo(nodelist) + return n def com_argument(self, nodelist, kw): if len(nodelist) == 2: @@ -1179,8 +1193,9 @@ subscripts = [] for i in range(1, len(nodelist), 2): subscripts.append(self.com_subscript(nodelist[i])) - - return Subscript(primary, assigning, subscripts) + n = Subscript(primary, assigning, subscripts) + n.lineno = extractLineNo(nodelist) + return n def com_subscript(self, node): # slice_item: expression | proper_slice | ellipsis @@ -1226,8 +1241,9 @@ items.append(Const(None)) else: items.append(self.com_node(ch[2])) - - return Sliceobj(items) + n = Sliceobj(items) + n.lineno = extractLineNo(node) + return n def com_slice(self, primary, node, assigning): # short_slice: [lower_bound] ":" [upper_bound] @@ -1240,7 +1256,9 @@ elif len(node) == 4: lower = self.com_node(node[1]) upper = self.com_node(node[3]) - return Slice(primary, assigning, lower, upper) + n = Slice(primary, assigning, lower, upper) + n.lineno = extractLineNo(node) + return n def get_docstring(self, node, n=None): if n is None: