1
0
forked from VimPlug/jedi

Some changes to the interpreter completions.

This commit is contained in:
Dave Halter
2014-12-11 03:49:05 +01:00
parent 220610bbf4
commit 4aac363413

View File

@@ -7,25 +7,41 @@ from jedi.common import source_to_unicode
from jedi.cache import underscore_memoization from jedi.cache import underscore_memoization
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate.compiled.fake import get_module from jedi.evaluate.compiled.fake import get_module
from jedi.parser import tree as pr from jedi.parser import tree as pt
from jedi.parser import load_grammar
from jedi.parser.fast import FastParser from jedi.parser.fast import FastParser
from jedi.evaluate import helpers from jedi.evaluate import helpers
from jedi.evaluate import iterable
class InterpreterNamespace(pr.Module): class InterpreterNamespace(pt.Module):
def __init__(self, evaluator, namespace, parser_module): def __init__(self, evaluator, namespace, parser_module):
self.namespace = namespace self.namespace = namespace
self.parser_module = parser_module self.parser_module = parser_module
self._evaluator = evaluator self._evaluator = evaluator
for key, value in self.namespace.items():
arr = self.parser_module.names_dict.setdefault(key, [])
arr.append(LazyName(self._evaluator, parser_module, key, value))
@underscore_memoization @underscore_memoization
def get_defined_names(self): def get_defined_names(self):
raise NotImplementedError
for name in self.parser_module.get_defined_names():
yield name
for key, value in self.namespace.items():
yield LazyName(self._evaluator, key, value)
@underscore_memoization
def used_names(self):
raise NotImplementedError
for name in self.parser_module.get_defined_names(): for name in self.parser_module.get_defined_names():
yield name yield name
for key, value in self.namespace.items(): for key, value in self.namespace.items():
yield LazyName(self._evaluator, key, value) yield LazyName(self._evaluator, key, value)
def scope_names_generator(self, position=None): def scope_names_generator(self, position=None):
raise NotImplementedError
yield self, list(self.get_defined_names()) yield self, list(self.get_defined_names())
def __getattr__(self, name): def __getattr__(self, name):
@@ -33,12 +49,16 @@ class InterpreterNamespace(pr.Module):
class LazyName(helpers.FakeName): class LazyName(helpers.FakeName):
def __init__(self, evaluator, name, value): def __init__(self, evaluator, module, name, value):
super(LazyName, self).__init__(name) super(LazyName, self).__init__(name)
self._module = module
self._evaluator = evaluator self._evaluator = evaluator
self._value = value self._value = value
self._name = name self._name = name
def is_definition(self):
return True
@property @property
@underscore_memoization @underscore_memoization
def parent(self): def parent(self):
@@ -47,7 +67,7 @@ class LazyName(helpers.FakeName):
if inspect.ismodule(obj): if inspect.ismodule(obj):
module = obj module = obj
else: else:
class FakeParent(pr.Base): class FakeParent(pt.Base):
parent = compiled.builtin parent = compiled.builtin
names = [] names = []
@@ -79,12 +99,17 @@ class LazyName(helpers.FakeName):
# cut the `c` from `.pyc` # cut the `c` from `.pyc`
with open(path) as f: with open(path) as f:
source = source_to_unicode(f.read()) source = source_to_unicode(f.read())
mod = FastParser(source, path[:-1]).module mod = FastParser(load_grammar(), source, path[:-1]).module
if not parser_path: if not parser_path:
return mod return mod
found = self._evaluator.eval_call_path(iter(parser_path), mod, None) assert len(parser_path) == 1
found = self._evaluator.find_types(mod, parser_path[0], search_global=True)
#found = self._evaluator.eval_call_path(iter(parser_path), mod, None)
if found: if found:
return found[0] content = iterable.AlreadyEvaluated(found)
s = pt.ExprStmt([self, pt.Operator('=', (0, 0), ''), content])
s.parent = self._module
return s
debug.warning('Interpreter lookup for Python code failed %s', debug.warning('Interpreter lookup for Python code failed %s',
mod) mod)
@@ -101,6 +126,6 @@ class LazyName(helpers.FakeName):
def create(evaluator, namespace, parser_module): def create(evaluator, namespace, parser_module):
ns = InterpreterNamespace(evaluator, namespace, parser_module) ns = InterpreterNamespace(evaluator, namespace, parser_module)
for attr_name in pr.SCOPE_CONTENTS: #for attr_name in pt.SCOPE_CONTENTS:
for something in getattr(parser_module, attr_name): # for something in getattr(parser_module, attr_name):
something.parent = ns # something.parent = ns