forked from VimPlug/jedi
fast parser produces now trees that are correct
This commit is contained in:
@@ -132,26 +132,25 @@ class ParserNode(object):
|
|||||||
|
|
||||||
self.children = []
|
self.children = []
|
||||||
self._checked = True
|
self._checked = True
|
||||||
|
# must be created before new things are added to it.
|
||||||
|
try:
|
||||||
|
# with fast_parser we have either 1 subscope or only statements.
|
||||||
|
self._content_scope = self.parser.module.subscopes[0]
|
||||||
|
except IndexError:
|
||||||
|
self._content_scope = self.parser.module
|
||||||
self.save_contents()
|
self.save_contents()
|
||||||
|
|
||||||
def save_contents(self):
|
def save_contents(self):
|
||||||
scope = self._get_content_scope()
|
scope = self._content_scope
|
||||||
self._contents = {}
|
self._contents = {}
|
||||||
for c in SCOPE_CONTENTS:
|
for c in SCOPE_CONTENTS:
|
||||||
self._contents[c] = list(getattr(scope, c))
|
self._contents[c] = list(getattr(scope, c))
|
||||||
self._is_generator = scope.is_generator
|
self._is_generator = scope.is_generator
|
||||||
|
|
||||||
def _get_content_scope(self):
|
|
||||||
try:
|
|
||||||
# with fast_parser we have either 1 subscope or only statements.
|
|
||||||
return self.parser.module.subscopes[0]
|
|
||||||
except IndexError:
|
|
||||||
return self.parser.module
|
|
||||||
|
|
||||||
def reset_contents(self):
|
def reset_contents(self):
|
||||||
self._checked = False
|
self._checked = False
|
||||||
|
|
||||||
scope = self._get_content_scope()
|
scope = self._content_scope
|
||||||
for key, c in self._contents.items():
|
for key, c in self._contents.items():
|
||||||
setattr(scope, key, self.contents.items())
|
setattr(scope, key, self.contents.items())
|
||||||
scope.is_generator = self._is_generator
|
scope.is_generator = self._is_generator
|
||||||
@@ -160,7 +159,7 @@ class ParserNode(object):
|
|||||||
c.reset_contents()
|
c.reset_contents()
|
||||||
|
|
||||||
def parent_until_indent(self, indent):
|
def parent_until_indent(self, indent):
|
||||||
if self.indent >= indent:
|
if self.indent >= indent and self.parent:
|
||||||
# check for
|
# check for
|
||||||
for i, c in enumerate(self.children):
|
for i, c in enumerate(self.children):
|
||||||
if not c._checked:
|
if not c._checked:
|
||||||
@@ -174,7 +173,7 @@ class ParserNode(object):
|
|||||||
@property
|
@property
|
||||||
def indent(self):
|
def indent(self):
|
||||||
if not self.parent:
|
if not self.parent:
|
||||||
return -1
|
return 0
|
||||||
module = self.parser.module
|
module = self.parser.module
|
||||||
try:
|
try:
|
||||||
el = module.subscopes[0]
|
el = module.subscopes[0]
|
||||||
@@ -195,7 +194,7 @@ class ParserNode(object):
|
|||||||
self.children.insert(insert, node)
|
self.children.insert(insert, node)
|
||||||
|
|
||||||
# insert parser objects into current structure
|
# insert parser objects into current structure
|
||||||
scope = self._get_content_scope()
|
scope = self._content_scope
|
||||||
for c in SCOPE_CONTENTS:
|
for c in SCOPE_CONTENTS:
|
||||||
content = getattr(scope, c)
|
content = getattr(scope, c)
|
||||||
content += getattr(parser.module, c)
|
content += getattr(parser.module, c)
|
||||||
@@ -332,7 +331,7 @@ class FastParser(use_metaclass(CachedFastParser)):
|
|||||||
for code_part in parts:
|
for code_part in parts:
|
||||||
lines = code_part.count('\n') + 1
|
lines = code_part.count('\n') + 1
|
||||||
if is_first or self._line_offset >= p.end_pos[0] - 1:
|
if is_first or self._line_offset >= p.end_pos[0] - 1:
|
||||||
indent = len(re.match(r'[ \t]*', code).groups(0))
|
indent = len(re.match(r'[ \t]*', code_part).group(0))
|
||||||
if is_first and self.current_node is not None:
|
if is_first and self.current_node is not None:
|
||||||
nodes = [self]
|
nodes = [self]
|
||||||
else:
|
else:
|
||||||
@@ -344,7 +343,7 @@ class FastParser(use_metaclass(CachedFastParser)):
|
|||||||
nodes += self.current_node.children
|
nodes += self.current_node.children
|
||||||
|
|
||||||
# check if code_part has already been parsed
|
# check if code_part has already been parsed
|
||||||
p = self._get_parser(code, nodes)
|
p = self._get_parser(code_part, nodes)
|
||||||
|
|
||||||
if is_first:
|
if is_first:
|
||||||
if self.current_node is None:
|
if self.current_node is None:
|
||||||
@@ -360,10 +359,11 @@ class FastParser(use_metaclass(CachedFastParser)):
|
|||||||
|
|
||||||
self._line_offset += lines
|
self._line_offset += lines
|
||||||
self._start += len(code_part) + 1 # +1 for newline
|
self._start += len(code_part) + 1 # +1 for newline
|
||||||
print 'hmm'
|
|
||||||
for p in self.parsers:
|
print(self.parsers[0].module.get_code())
|
||||||
print(p.module.get_code())
|
#for p in self.parsers:
|
||||||
print(p.module.start_pos, p.module.end_pos)
|
# print(p.module.get_code())
|
||||||
|
# print(p.module.start_pos, p.module.end_pos)
|
||||||
exit()
|
exit()
|
||||||
del self._code
|
del self._code
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user