diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 45dcc34..ed6e67c 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -5,6 +5,7 @@ from parso.normalizer import Normalizer, Rule, NormalizerConfig _IMPORT_TYPES = ('import_name', 'import_from') _SUITE_INTRODUCERS = ('classdef', 'funcdef', 'if_stmt', 'while_stmt', 'for_stmt', 'try_stmt', 'with_stmt') +_OPENING_BRACKETS = '([{' class CompressNormalizer(Normalizer): """ @@ -81,6 +82,8 @@ class IndentationNode(object): class BracketNode(IndentationNode): def __init__(self, config, parent_indentation, leaf): + self.leaf = leaf + next_leaf = leaf.get_next_leaf() if '\n' in next_leaf.prefix: # This implies code like: @@ -256,14 +259,14 @@ class PEP8Normalizer(Normalizer): self.add_issue(123, "Losing bracket does not match indentation of opening bracket's line", leaf) else: if len(info.indentation) < len(should_be_indentation): - if node.type == BracketNode.SAME_INDENT_TYPE: + if node.type == IndentationNode.SAME_INDENT_TYPE: self.add_issue(128, 'Continuation line under-indented for visual indent', leaf) - elif node.type == BracketNode.BACKSLASH_TYPE: + elif node.type == IndentationNode.BACKSLASH_TYPE: self.add_issue(122, 'Continuation line missing indentation or outdented', leaf) else: self.add_issue(121, 'Continuation line under-indented for hanging indent', leaf) else: - if node.type == BracketNode.SAME_INDENT_TYPE: + if node.type == IndentationNode.SAME_INDENT_TYPE: self.add_issue(127, 'Continuation line over-indented for visual indent', leaf) else: self.add_issue(126, 'Continuation line over-indented for hanging indent', leaf) @@ -307,10 +310,22 @@ class PEP8Normalizer(Normalizer): # ------------------------------- if value and value in '()[]{}' and leaf.type != 'error_leaf' \ and leaf.parent.type != 'error_node': - if value in '([{': + if value in _OPENING_BRACKETS: + # Figure out here what the indentation is. For chained brackets + # we can basically use the previous indentation. + previous_leaf = leaf + index = 1 + while not info.newline_count: + previous_leaf = previous_leaf.get_previous_leaf() + n = self._indentation_stack[-index] + if not isinstance(n, BracketNode) or previous_leaf != n.leaf: + break + index += 1 + indentation = self._indentation_stack[-index].indentation + self._indentation_stack.append( BracketNode( - self._config, self._indentation_stack[-1].indentation, + self._config, indentation, leaf ) ) diff --git a/test/normalizer_issue_files/E12_first.py b/test/normalizer_issue_files/E12_first.py new file mode 100644 index 0000000..79cf627 --- /dev/null +++ b/test/normalizer_issue_files/E12_first.py @@ -0,0 +1,79 @@ +print "E121", ( + #: E121:2 + "dent") +print "E122", ( + #: E121:0 +"dent") +my_list = [ + 1, 2, 3, + 4, 5, 6, + #: E123 + ] +print "E124", ("visual", + "indent_two" + #: E124:14 + ) +print "E124", ("visual", + "indent_five" + #: E124:0 +) +a = (123, + #: E124:0 +) +#: E129+1:4 +if (row < 0 or self.moduleCount <= row or + col < 0 or self.moduleCount <= col): + raise Exception("%s,%s - %s" % (row, col, self.moduleCount)) + +print "E126", ( + #: E126:12 + "dent") +print "E126", ( + #: E126:8 + "dent") +print "E127", ("over-", + #: E127:18 + "over-indent") +print "E128", ("visual", + #: E128:4 + "hanging") +print "E128", ("under-", + #: E128:14 + "under-indent") + + +my_list = [ + 1, 2, 3, + 4, 5, 6, + #: E123:5 + ] +result = { + #: E121:3 + 'key1': 'value', + #: E121:3 + 'key2': 'value', +} +rv.update(dict.fromkeys(( + 'qualif_nr', 'reasonComment_en', 'reasonComment_fr', + 'reasonComment_de', 'reasonComment_it'), + #: E128 + '?'), + "foo") + +#: E126+1:10 E126+2:10 +abricot = 3 + \ + 4 + \ + 5 + 6 +print "hello", ( + + "there", + #: E131:5 + # "john", + "dude") +part = set_mimetype(( + a.get('mime_type', 'text')), + 'default') +part = set_mimetype(( + a.get('mime_type', 'text')), + #: E127:21 + 'default')