469 |
469 |
470 @param line line number of the issue (integer) |
470 @param line line number of the issue (integer) |
471 @param pos position inside line (integer) |
471 @param pos position inside line (integer) |
472 @param logical logical line structure |
472 @param logical logical line structure |
473 @return flag indicating a change was done (boolean) |
473 @return flag indicating a change was done (boolean) |
474 """ |
474 @exception ValueError raised to indicate a bad 'logical' parameter |
475 assert logical |
475 """ |
|
476 if not logical: |
|
477 raise ValueError("Bad value for 'logical' parameter.") |
|
478 |
476 ls, _, original = logical |
479 ls, _, original = logical |
477 |
480 |
478 rewrapper = IndentationWrapper(original) |
481 rewrapper = IndentationWrapper(original) |
479 valid_indents = rewrapper.pep8Expected() |
482 valid_indents = rewrapper.pep8Expected() |
480 if not rewrapper.rel_indent: |
483 if not rewrapper.rel_indent: |
2300 fill = self.lines[end_line - 1][end:start] |
2302 fill = self.lines[end_line - 1][end:start] |
2301 logical.append(fill) |
2303 logical.append(fill) |
2302 logical.append(text) |
2304 logical.append(text) |
2303 previous = t |
2305 previous = t |
2304 logical_line = ''.join(logical) |
2306 logical_line = ''.join(logical) |
2305 assert logical_line.lstrip() == logical_line |
|
2306 assert logical_line.rstrip() == logical_line |
|
2307 return logical_line |
2307 return logical_line |
2308 |
2308 |
2309 def pep8Expected(self): |
2309 def pep8Expected(self): |
2310 """ |
2310 """ |
2311 Public method to replicate logic in pycodestyle.py, to know what level |
2311 Public method to replicate logic in pycodestyle.py, to know what level |
2463 indent_chances[indent[depth]] = True |
2463 indent_chances[indent[depth]] = True |
2464 for idx in range(row, -1, -1): |
2464 for idx in range(row, -1, -1): |
2465 if parens[idx]: |
2465 if parens[idx]: |
2466 parens[idx] -= 1 |
2466 parens[idx] -= 1 |
2467 break |
2467 break |
2468 assert len(indent) == depth + 1 |
|
2469 if start[1] not in indent_chances: |
2468 if start[1] not in indent_chances: |
2470 indent_chances[start[1]] = text |
2469 indent_chances[start[1]] = text |
2471 |
2470 |
2472 last_token_multiline = (start[0] != end[0]) |
2471 last_token_multiline = (start[0] != end[0]) |
2473 |
2472 |
2575 newNext = "" |
2574 newNext = "" |
2576 return True, newText, newNext |
2575 return True, newText, newNext |
2577 |
2576 |
2578 indent = self.__getIndent(self.__text) |
2577 indent = self.__getIndent(self.__text) |
2579 source = self.__text[len(indent):] |
2578 source = self.__text[len(indent):] |
2580 assert source.lstrip() == source |
|
2581 sio = StringIO(source) |
2579 sio = StringIO(source) |
2582 |
2580 |
2583 # Check for multi line string. |
2581 # Check for multi line string. |
2584 try: |
2582 try: |
2585 tokens = list(tokenize.generate_tokens(sio.readline)) |
2583 tokens = list(tokenize.generate_tokens(sio.readline)) |
2807 candidates.append( |
2805 candidates.append( |
2808 indent + second.strip() + self.__eol + |
2806 indent + second.strip() + self.__eol + |
2809 indent + first.strip() + self.__eol) |
2807 indent + first.strip() + self.__eol) |
2810 elif tokenType == tokenize.OP and tokenString != '=': |
2808 elif tokenType == tokenize.OP and tokenString != '=': |
2811 # Don't break on '=' after keyword as this violates PEP 8. |
2809 # Don't break on '=' after keyword as this violates PEP 8. |
2812 |
|
2813 assert tokenType != tokenize.INDENT |
|
2814 |
|
2815 offset = tkn[2][1] + 1 |
2810 offset = tkn[2][1] + 1 |
2816 first = source[:offset] |
2811 first = source[:offset] |
2817 |
2812 |
2818 secondIndent = indent |
2813 secondIndent = indent |
2819 if first.rstrip().endswith('('): |
2814 if first.rstrip().endswith('('): |