mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-21 11:51:28 +08:00
Figuring out how indentation of chained brackets works.
This commit is contained in:
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
79
test/normalizer_issue_files/E12_first.py
Normal file
79
test/normalizer_issue_files/E12_first.py
Normal file
@@ -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')
|
||||
Reference in New Issue
Block a user