forked from VimPlug/jedi
Remove _remove_last_newline from the parser.
This commit is contained in:
@@ -12,7 +12,7 @@ from collections import namedtuple
|
|||||||
from jedi._compatibility import use_metaclass
|
from jedi._compatibility import use_metaclass
|
||||||
from jedi import settings
|
from jedi import settings
|
||||||
from jedi.common import splitlines
|
from jedi.common import splitlines
|
||||||
from jedi.parser import ParserWithRecovery
|
from jedi.parser.python.parser import ParserWithRecovery, _remove_last_newline
|
||||||
from jedi.parser.python.tree import EndMarker
|
from jedi.parser.python.tree import EndMarker
|
||||||
from jedi.parser.utils import parser_cache
|
from jedi.parser.utils import parser_cache
|
||||||
from jedi import debug
|
from jedi import debug
|
||||||
@@ -183,7 +183,7 @@ class DiffParser(object):
|
|||||||
self._nodes_stack.close()
|
self._nodes_stack.close()
|
||||||
|
|
||||||
if self._added_newline:
|
if self._added_newline:
|
||||||
self._parser._remove_last_newline()
|
_remove_last_newline(self._parser.get_root_node())
|
||||||
|
|
||||||
self._parser.source = ''.join(lines_new)
|
self._parser.source = ''.join(lines_new)
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@ import os
|
|||||||
|
|
||||||
from jedi._compatibility import FileNotFoundError
|
from jedi._compatibility import FileNotFoundError
|
||||||
from jedi.parser.pgen2.pgen import generate_grammar
|
from jedi.parser.pgen2.pgen import generate_grammar
|
||||||
from jedi.parser.python.parser import Parser, ParserWithRecovery
|
from jedi.parser.python.parser import Parser, ParserWithRecovery, \
|
||||||
|
_remove_last_newline
|
||||||
from jedi.parser.tokenize import source_tokens
|
from jedi.parser.tokenize import source_tokens
|
||||||
|
|
||||||
|
|
||||||
@@ -82,6 +83,6 @@ def parse(code, grammar=None, error_recovery=True, start_symbol='file_input'):
|
|||||||
p = parser(grammar, code, start_parsing=False, **kwargs)
|
p = parser(grammar, code, start_parsing=False, **kwargs)
|
||||||
module = p.parse(tokens=tokens)
|
module = p.parse(tokens=tokens)
|
||||||
if added_newline:
|
if added_newline:
|
||||||
p._remove_last_newline()
|
_remove_last_newline(module)
|
||||||
|
|
||||||
return module
|
return module
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class Parser(BaseParser):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if self._added_newline:
|
if self._added_newline:
|
||||||
self._remove_last_newline()
|
_remove_last_newline(node)
|
||||||
return node
|
return node
|
||||||
|
|
||||||
def get_root_node(self):
|
def get_root_node(self):
|
||||||
@@ -114,31 +114,32 @@ class Parser(BaseParser):
|
|||||||
else:
|
else:
|
||||||
return tree.Operator(value, start_pos, prefix)
|
return tree.Operator(value, start_pos, prefix)
|
||||||
|
|
||||||
def _remove_last_newline(self):
|
|
||||||
endmarker = self._parsed.children[-1]
|
|
||||||
# The newline is either in the endmarker as a prefix or the previous
|
|
||||||
# leaf as a newline token.
|
|
||||||
prefix = endmarker.prefix
|
|
||||||
if prefix.endswith('\n'):
|
|
||||||
endmarker.prefix = prefix = prefix[:-1]
|
|
||||||
last_end = 0
|
|
||||||
if '\n' not in prefix:
|
|
||||||
# Basically if the last line doesn't end with a newline. we
|
|
||||||
# have to add the previous line's end_position.
|
|
||||||
previous_leaf = endmarker.get_previous_leaf()
|
|
||||||
if previous_leaf is not None:
|
|
||||||
last_end = previous_leaf.end_pos[1]
|
|
||||||
last_line = re.sub('.*\n', '', prefix)
|
|
||||||
endmarker.start_pos = endmarker.line - 1, last_end + len(last_line)
|
|
||||||
else:
|
|
||||||
newline = endmarker.get_previous_leaf()
|
|
||||||
if newline is None:
|
|
||||||
return # This means that the parser is empty.
|
|
||||||
|
|
||||||
assert newline.value.endswith('\n')
|
def _remove_last_newline(node):
|
||||||
newline.value = newline.value[:-1]
|
endmarker = node.children[-1]
|
||||||
endmarker.start_pos = \
|
# The newline is either in the endmarker as a prefix or the previous
|
||||||
newline.start_pos[0], newline.start_pos[1] + len(newline.value)
|
# leaf as a newline token.
|
||||||
|
prefix = endmarker.prefix
|
||||||
|
if prefix.endswith('\n'):
|
||||||
|
endmarker.prefix = prefix = prefix[:-1]
|
||||||
|
last_end = 0
|
||||||
|
if '\n' not in prefix:
|
||||||
|
# Basically if the last line doesn't end with a newline. we
|
||||||
|
# have to add the previous line's end_position.
|
||||||
|
previous_leaf = endmarker.get_previous_leaf()
|
||||||
|
if previous_leaf is not None:
|
||||||
|
last_end = previous_leaf.end_pos[1]
|
||||||
|
last_line = re.sub('.*\n', '', prefix)
|
||||||
|
endmarker.start_pos = endmarker.line - 1, last_end + len(last_line)
|
||||||
|
else:
|
||||||
|
newline = endmarker.get_previous_leaf()
|
||||||
|
if newline is None:
|
||||||
|
return # This means that the parser is empty.
|
||||||
|
|
||||||
|
assert newline.value.endswith('\n')
|
||||||
|
newline.value = newline.value[:-1]
|
||||||
|
endmarker.start_pos = \
|
||||||
|
newline.start_pos[0], newline.start_pos[1] + len(newline.value)
|
||||||
|
|
||||||
|
|
||||||
class ParserWithRecovery(Parser):
|
class ParserWithRecovery(Parser):
|
||||||
|
|||||||
Reference in New Issue
Block a user