1
0
forked from VimPlug/jedi

Scope.names_dict implementation.

This commit is contained in:
Dave Halter
2014-10-23 00:51:02 +02:00
parent 4f4aef7ac8
commit 3bbce49fd3
2 changed files with 29 additions and 9 deletions

View File

@@ -25,6 +25,7 @@ from jedi.parser import representation as pr
from jedi.parser import tokenize from jedi.parser import tokenize
from jedi.parser import pytree from jedi.parser import pytree
from jedi.parser.pgen2 import Driver from jedi.parser.pgen2 import Driver
from jedi.parser import pgen2
OPERATOR_KEYWORDS = 'and', 'for', 'if', 'else', 'in', 'is', 'lambda', 'not', 'or' OPERATOR_KEYWORDS = 'and', 'for', 'if', 'else', 'in', 'is', 'lambda', 'not', 'or'
# Not used yet. In the future I intend to add something like KeywordStatement # Not used yet. In the future I intend to add something like KeywordStatement
@@ -57,6 +58,7 @@ class Parser(object):
# files processed even if they were not changed during refactoring. If # files processed even if they were not changed during refactoring. If
# and only if the refactor method's write parameter was True. # and only if the refactor method's write parameter was True.
self.used_names = {} self.used_names = {}
self.scope_names_stack = [{}]
logger = logging.getLogger("Jedi-Parser") logger = logging.getLogger("Jedi-Parser")
d = Driver(pytree.python_grammar, convert=self.convert, logger=logger) d = Driver(pytree.python_grammar, convert=self.convert, logger=logger)
self.module = d.parse_string(source).get_parent_until() self.module = d.parse_string(source).get_parent_until()
@@ -65,13 +67,30 @@ class Parser(object):
self.module.set_global_names(self.global_names) self.module.set_global_names(self.global_names)
def convert(self, grammar, raw_node): def convert(self, grammar, raw_node):
if raw_node[1] in ('def', 'class') and raw_node[0] == pgen2.tokenize.NAME:
self.scope_names_stack.append({})
new_node = pytree.convert(grammar, raw_node) new_node = pytree.convert(grammar, raw_node)
if isinstance(new_node, pr.GlobalStmt): # We need to check raw_node always, because the same node can be
# returned by convert multiple times.
if raw_node[0] == pytree.python_symbols.global_stmt:
self.global_names += new_node.names() self.global_names += new_node.names()
elif isinstance(new_node, pr.Name): elif isinstance(new_node, pr.Name) and raw_node[0] == pgen2.tokenize.NAME:
# Keep a listing of all used names # Keep a listing of all used names
arr = self.used_names.setdefault(new_node.value, []) arr = self.used_names.setdefault(new_node.value, [])
arr.append(new_node) arr.append(new_node)
arr = self.scope_names_stack[-1].setdefault(new_node.value, [])
arr.append(new_node)
elif isinstance(new_node, pr.ClassOrFunc) \
and raw_node[0] == pytree.python_symbols.compound_stmt:
# scope_name_stack handling
n = new_node.name
scope_names = self.scope_names_stack.pop()
scope_names[n.value].remove(n)
new_node.names_dict = scope_names
# Set the func name of the current node
arr = self.scope_names_stack[-1].setdefault(n.value, [])
arr.append(n)
return new_node return new_node
def __init__old__(self, source, module_path=None, no_docstr=False, def __init__old__(self, source, module_path=None, no_docstr=False,

View File

@@ -660,7 +660,13 @@ class SubModule(Scope, Module):
return False return False
class Class(Scope): class ClassOrFunc(Scope):
@property
def name(self):
return self.children[1]
class Class(ClassOrFunc):
""" """
Used to store the parsed contents of a python class. Used to store the parsed contents of a python class.
@@ -686,11 +692,6 @@ class Class(Scope):
else: else:
return self.children[3] return self.children[3]
@property
def name(self):
return self.children[1] # First token after `def`
@property @property
def doc(self): def doc(self):
""" """
@@ -709,7 +710,7 @@ class Class(Scope):
yield self, filter_after_position(self.get_defined_names(), position) yield self, filter_after_position(self.get_defined_names(), position)
class Function(Scope): class Function(ClassOrFunc):
""" """
Used to store the parsed contents of a python function. Used to store the parsed contents of a python function.