mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-09 22:25:53 +08:00
Implement the first few issues of the E12x issues.
This commit is contained in:
@@ -38,6 +38,7 @@ class WhitespaceInfo(object):
|
|||||||
self.has_backslash = False
|
self.has_backslash = False
|
||||||
self.comments = []
|
self.comments = []
|
||||||
indentation_part = None
|
indentation_part = None
|
||||||
|
self.newline_count = 0
|
||||||
for part in parts:
|
for part in parts:
|
||||||
if part.type == 'backslash':
|
if part.type == 'backslash':
|
||||||
self.has_backslash = True
|
self.has_backslash = True
|
||||||
@@ -50,17 +51,44 @@ class WhitespaceInfo(object):
|
|||||||
else:
|
else:
|
||||||
indentation_part = None
|
indentation_part = None
|
||||||
|
|
||||||
|
if part.type == 'newline':
|
||||||
|
self.newline_count += 1
|
||||||
|
|
||||||
if indentation_part is None:
|
if indentation_part is None:
|
||||||
self.indentation = ''
|
self.indentation = ''
|
||||||
else:
|
else:
|
||||||
self.indentation = indentation_part.value
|
self.indentation = indentation_part.value
|
||||||
self.indentation_part = indentation_part
|
self.indentation_part = indentation_part
|
||||||
|
|
||||||
self.newline_count = 2
|
|
||||||
self.trailing_whitespace = []
|
self.trailing_whitespace = []
|
||||||
self.comment_whitespace = []
|
self.comment_whitespace = []
|
||||||
|
|
||||||
|
|
||||||
|
class BracketNode(object):
|
||||||
|
def __init__(self, config, indentation_level, leaf):
|
||||||
|
next_leaf = leaf.get_next_leaf()
|
||||||
|
if '\n' in next_leaf.prefix:
|
||||||
|
# This implies code like:
|
||||||
|
# foobarbaz(
|
||||||
|
# a,
|
||||||
|
# b,
|
||||||
|
# )
|
||||||
|
self.bracket_indentation = config.indentation * indentation_level
|
||||||
|
self.item_indentation = self.bracket_indentation + config.indentation
|
||||||
|
else:
|
||||||
|
# Implies code like:
|
||||||
|
# foobarbaz(
|
||||||
|
# a,
|
||||||
|
# b,
|
||||||
|
# )
|
||||||
|
self.expected_end_indent = leaf.end_pos[1]
|
||||||
|
if '\t' in config.indentation:
|
||||||
|
self.bracket_indentation = None
|
||||||
|
else:
|
||||||
|
self.bracket_indentation = ' ' * self.expected_end_indent
|
||||||
|
self.item_indentation = self.bracket_indentation
|
||||||
|
|
||||||
|
|
||||||
def _is_magic_name(name):
|
def _is_magic_name(name):
|
||||||
return name.value.startswith('__') and name.value.startswith('__')
|
return name.value.startswith('__') and name.value.startswith('__')
|
||||||
|
|
||||||
@@ -71,6 +99,7 @@ class PEP8Normalizer(Normalizer):
|
|||||||
self._indentation_level = 0
|
self._indentation_level = 0
|
||||||
self._last_indentation_level = 0
|
self._last_indentation_level = 0
|
||||||
self._on_newline = True
|
self._on_newline = True
|
||||||
|
self._bracket_stack = []
|
||||||
|
|
||||||
if ' ' in config.indentation:
|
if ' ' in config.indentation:
|
||||||
self._indentation_type = 'spaces'
|
self._indentation_type = 'spaces'
|
||||||
@@ -152,6 +181,7 @@ class PEP8Normalizer(Normalizer):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def normalize(self, leaf):
|
def normalize(self, leaf):
|
||||||
|
value = leaf.value
|
||||||
info = WhitespaceInfo(leaf)
|
info = WhitespaceInfo(leaf)
|
||||||
should_be_indenation = self._indentation_level * self._config.indentation
|
should_be_indenation = self._indentation_level * self._config.indentation
|
||||||
if self._on_newline:
|
if self._on_newline:
|
||||||
@@ -159,6 +189,23 @@ class PEP8Normalizer(Normalizer):
|
|||||||
if not self._check_tabs_spaces(info.indentation_part, info.indentation):
|
if not self._check_tabs_spaces(info.indentation_part, info.indentation):
|
||||||
s = '%s %s' % (len(self._config.indentation), self._indentation_type)
|
s = '%s %s' % (len(self._config.indentation), self._indentation_type)
|
||||||
self.add_issue(111, 'Indentation is not a multiple of ' + s, leaf)
|
self.add_issue(111, 'Indentation is not a multiple of ' + s, leaf)
|
||||||
|
elif info.newline_count:
|
||||||
|
if self._bracket_stack:
|
||||||
|
node = self._bracket_stack[-1]
|
||||||
|
if value in '])}':
|
||||||
|
should_be_indenation = node.bracket_indentation
|
||||||
|
else:
|
||||||
|
should_be_indenation = node.item_indentation
|
||||||
|
if info.indentation != should_be_indenation:
|
||||||
|
if not self._check_tabs_spaces(info.indentation_part, info.indentation):
|
||||||
|
if len(info.indentation) < len(should_be_indenation):
|
||||||
|
if value in '])}':
|
||||||
|
self.add_issue(124, "Closing bracket does not match visual indentation", leaf)
|
||||||
|
else:
|
||||||
|
self.add_issue(121, 'Continuation line under-indented for hanging indent', leaf)
|
||||||
|
else:
|
||||||
|
self.add_issue(123, "Losing bracket does not match indentation of opening bracket's line", leaf)
|
||||||
|
# TODO else?
|
||||||
|
|
||||||
first = True
|
first = True
|
||||||
for comment in info.comments:
|
for comment in info.comments:
|
||||||
@@ -190,10 +237,18 @@ class PEP8Normalizer(Normalizer):
|
|||||||
|
|
||||||
self._analyse_non_prefix(leaf)
|
self._analyse_non_prefix(leaf)
|
||||||
|
|
||||||
|
# Finalize the state.
|
||||||
|
if value and value in '()[]{}' and leaf.parent.type not in ('error_node', 'error_leaf'):
|
||||||
|
if value in '([{':
|
||||||
|
node = BracketNode(self._config, self._indentation_level, leaf)
|
||||||
|
self._bracket_stack.append(node)
|
||||||
|
else:
|
||||||
|
self._bracket_stack.pop()
|
||||||
|
|
||||||
self._on_newline = leaf.type == 'newline'
|
self._on_newline = leaf.type == 'newline'
|
||||||
self._last_indentation_level = self._indentation_level
|
self._last_indentation_level = self._indentation_level
|
||||||
|
|
||||||
return leaf.value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def _analyse_non_prefix(self, leaf):
|
def _analyse_non_prefix(self, leaf):
|
||||||
|
|||||||
Reference in New Issue
Block a user