1
0
forked from VimPlug/jedi

Try to avoid CachedMetaClass for modules

This commit is contained in:
Dave Halter
2018-02-13 20:47:43 +01:00
parent 36699b77b2
commit 2a56323c16
3 changed files with 16 additions and 4 deletions

View File

@@ -286,9 +286,10 @@ class Script(object):
def _analysis(self): def _analysis(self):
self._evaluator.is_analysis = True self._evaluator.is_analysis = True
self._evaluator.analysis_modules = [self._module_node] self._evaluator.analysis_modules = [self._module_node]
module = self._get_module()
try: try:
for node in get_executable_nodes(self._module_node): for node in get_executable_nodes(self._module_node):
context = self._get_module().create_context(node) context = module.create_context(node)
if node.type in ('funcdef', 'classdef'): if node.type in ('funcdef', 'classdef'):
# Resolve the decorators. # Resolve the decorators.
tree_name_to_contexts(self._evaluator, context, node.children[1]) tree_name_to_contexts(self._evaluator, context, node.children[1])

View File

@@ -5,8 +5,7 @@ import os
from parso import python_bytes_to_unicode from parso import python_bytes_to_unicode
from jedi._compatibility import use_metaclass from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.cache import CachedMetaClass, evaluator_method_cache
from jedi.evaluate.filters import GlobalNameFilter, ContextNameMixin, \ from jedi.evaluate.filters import GlobalNameFilter, ContextNameMixin, \
AbstractNameDefinition, ParserTreeFilter, DictFilter AbstractNameDefinition, ParserTreeFilter, DictFilter
from jedi.evaluate import compiled from jedi.evaluate import compiled
@@ -41,7 +40,7 @@ class ModuleName(ContextNameMixin, AbstractNameDefinition):
return self._name return self._name
class ModuleContext(use_metaclass(CachedMetaClass, TreeContext)): class ModuleContext(TreeContext):
api_type = u'module' api_type = u'module'
parent_context = None parent_context = None

View File

@@ -46,6 +46,9 @@ class ModuleCache(object):
def get(self, name): def get(self, name):
return self._name_cache[name] return self._name_cache[name]
def get_from_path(self, path):
return self._path_cache[path]
# This memoization is needed, because otherwise we will infinitely loop on # This memoization is needed, because otherwise we will infinitely loop on
# certain imports. # certain imports.
@@ -468,6 +471,15 @@ class Importer(object):
def _load_module(evaluator, path=None, code=None, sys_path=None, def _load_module(evaluator, path=None, code=None, sys_path=None,
parent_module=None, module_name=None, safe_module_name=False): parent_module=None, module_name=None, safe_module_name=False):
try:
return evaluator.module_cache.get(module_name)
except KeyError:
pass
try:
return evaluator.module_cache.get_from_path(path)
except KeyError:
pass
if isinstance(path, ImplicitNSInfo): if isinstance(path, ImplicitNSInfo):
from jedi.evaluate.context.namespace import ImplicitNamespaceContext from jedi.evaluate.context.namespace import ImplicitNamespaceContext
module = ImplicitNamespaceContext( module = ImplicitNamespaceContext(