Mercurial > public > mercurial-scm > hg
comparison contrib/byteify-strings.py @ 42687:26a31c88e1a5
byteify-strings: fix misalignment with multi-line parenthesis
This improves the current fix to also take into account cases where the last
line ended on the opening `(`, `[` or `{` and adds a regression test.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Sun, 04 Aug 2019 22:14:26 +0200 |
parents | bbb002b378f3 |
children | f9b64ff9d26b |
comparison
equal
deleted
inserted
replaced
42686:3364b4da5271 | 42687:26a31c88e1a5 |
---|---|
122 except IndexError: | 122 except IndexError: |
123 return False | 123 return False |
124 | 124 |
125 coldelta = 0 # column increment for new opening parens | 125 coldelta = 0 # column increment for new opening parens |
126 coloffset = -1 # column offset for the current line (-1: TBD) | 126 coloffset = -1 # column offset for the current line (-1: TBD) |
127 parens = [(0, 0, 0)] # stack of (line, end-column, column-offset) | 127 parens = [(0, 0, 0, -1)] # stack of (line, end-column, column-offset, type) |
128 ignorenextline = False # don't transform the next line | 128 ignorenextline = False # don't transform the next line |
129 insideignoreblock = False # don't transform until turned off | 129 insideignoreblock = False # don't transform until turned off |
130 for i, t in enumerate(tokens): | 130 for i, t in enumerate(tokens): |
131 # Compute the column offset for the current line, such that | 131 # Compute the column offset for the current line, such that |
132 # the current line will be aligned to the last opening paren | 132 # the current line will be aligned to the last opening paren |
133 # as before. | 133 # as before. |
134 if coloffset < 0: | 134 if coloffset < 0: |
135 if t.start[1] == parens[-1][1]: | 135 lastparen = parens[-1] |
136 coloffset = parens[-1][2] | 136 if t.start[1] == lastparen[1]: |
137 elif t.start[1] + 1 == parens[-1][1]: | 137 coloffset = lastparen[2] |
138 elif ( | |
139 t.start[1] + 1 == lastparen[1] | |
140 and lastparen[3] not in (token.NEWLINE, tokenize.NL) | |
141 ): | |
138 # fix misaligned indent of s/util.Abort/error.Abort/ | 142 # fix misaligned indent of s/util.Abort/error.Abort/ |
139 coloffset = parens[-1][2] + (parens[-1][1] - t.start[1]) | 143 coloffset = lastparen[2] + (lastparen[1] - t.start[1]) |
140 else: | 144 else: |
141 coloffset = 0 | 145 coloffset = 0 |
142 | 146 |
143 # Reset per-line attributes at EOL. | 147 # Reset per-line attributes at EOL. |
144 if t.type in (token.NEWLINE, tokenize.NL): | 148 if t.type in (token.NEWLINE, tokenize.NL): |
162 yield adjusttokenpos(t, coloffset) | 166 yield adjusttokenpos(t, coloffset) |
163 continue | 167 continue |
164 | 168 |
165 # Remember the last paren position. | 169 # Remember the last paren position. |
166 if _isop(i, '(', '[', '{'): | 170 if _isop(i, '(', '[', '{'): |
167 parens.append(t.end + (coloffset + coldelta,)) | 171 parens.append(t.end + (coloffset + coldelta, tokens[i + 1].type)) |
168 elif _isop(i, ')', ']', '}'): | 172 elif _isop(i, ')', ']', '}'): |
169 parens.pop() | 173 parens.pop() |
170 | 174 |
171 # Convert most string literals to byte literals. String literals | 175 # Convert most string literals to byte literals. String literals |
172 # in Python 2 are bytes. String literals in Python 3 are unicode. | 176 # in Python 2 are bytes. String literals in Python 3 are unicode. |