forked from VimPlug/jedi
68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
"""
|
|
TODO Some parts of this module are still not well documented.
|
|
"""
|
|
import copy
|
|
|
|
from jedi.cache import underscore_memoization
|
|
from jedi.evaluate import helpers
|
|
from jedi.evaluate.representation import ModuleContext
|
|
from jedi.evaluate.compiled import mixed
|
|
|
|
|
|
class MixedModule(object):
|
|
resets_positions = True
|
|
type = 'mixed_module'
|
|
|
|
def __init__(self, evaluator, parser_module, namespaces):
|
|
self._evaluator = evaluator
|
|
self._namespaces = namespaces
|
|
|
|
self._namespace_objects = [type('jedi_namespace', (), n) for n in namespaces]
|
|
self._wrapped_module = ModuleContext(evaluator, parser_module)
|
|
# Usually we are dealing with very small code sizes when it comes to
|
|
# interpreter modules. In this case we just copy the whole syntax tree
|
|
# to be able to modify it.
|
|
self._parser_module = copy.deepcopy(parser_module)
|
|
|
|
for child in self._parser_module.children:
|
|
child.parent = self
|
|
|
|
def names_dicts(self, search_global):
|
|
for names_dict in self._wrapped_module.names_dicts(search_global):
|
|
yield names_dict
|
|
|
|
for namespace_obj in self._namespace_objects:
|
|
m = mixed.MixedObject(self._evaluator, namespace_obj, self._parser_module.name)
|
|
for names_dict in m.names_dicts(False):
|
|
yield names_dict
|
|
|
|
def __getattr__(self, name):
|
|
return getattr(self._parser_module, name)
|
|
|
|
|
|
class LazyName(helpers.FakeName):
|
|
def __init__(self, evaluator, module, name, value):
|
|
super(LazyName, self).__init__(name)
|
|
self._module = module
|
|
self._evaluator = evaluator
|
|
self._value = value
|
|
self._name = name
|
|
|
|
def is_definition(self):
|
|
return True
|
|
|
|
@property
|
|
@underscore_memoization
|
|
def parent(self):
|
|
"""
|
|
Creating fake statements for the interpreter.
|
|
|
|
Here we are trying to link back to Python code, if possible. This means
|
|
we try to find the python module for a name (not the builtin).
|
|
"""
|
|
return mixed.create(self._evaluator, self._value)
|
|
|
|
@parent.setter
|
|
def parent(self, value):
|
|
"""Needed because the super class tries to set parent."""
|