Try to introduce is_instance and is_function

This commit is contained in:
Dave Halter
2018-09-24 00:09:40 +02:00
parent 2ec4d1e426
commit cc493866cd
6 changed files with 20 additions and 14 deletions

View File

@@ -326,8 +326,8 @@ class BaseDefinition(object):
param_names = list(context.get_param_names())
if isinstance(context, instance.BoundMethod):
param_names = param_names[1:]
elif isinstance(context, (instance.AbstractInstanceContext, ClassContext)):
if isinstance(context, ClassContext):
elif context.is_class() or context.is_instance():
if context.is_class():
search = u'__init__'
else:
search = u'__call__'

View File

@@ -113,11 +113,11 @@ def _check_for_setattr(instance):
def add_attribute_error(name_context, lookup_context, name):
message = ('AttributeError: %s has no attribute %s.' % (lookup_context, name))
from jedi.evaluate.context.instance import AbstractInstanceContext, CompiledInstanceName
from jedi.evaluate.context.instance import CompiledInstanceName
# Check for __getattr__/__getattribute__ existance and issue a warning
# instead of an error, if that happens.
typ = Error
if isinstance(lookup_context, AbstractInstanceContext):
if lookup_context.is_instance():
slot_names = lookup_context.get_function_slot_names(u'__getattr__') + \
lookup_context.get_function_slot_names(u'__getattribute__')
for n in slot_names:

View File

@@ -132,6 +132,12 @@ class Context(HelperContextMixin, BaseContext):
def is_class(self):
return False
def is_instance(self):
return False
def is_function(self):
return False
def py__bool__(self):
"""
Since Wrapper is a super class for classes, functions and modules,

View File

@@ -75,6 +75,9 @@ class FunctionContext(use_metaclass(CachedMetaClass, AbstractFunction)):
"""
Needed because of decorators. Decorators are evaluated here.
"""
def is_function(self):
return True
@classmethod
def from_context(cls, context, tree_node):
def create(tree_node):
@@ -92,12 +95,10 @@ class FunctionContext(use_metaclass(CachedMetaClass, AbstractFunction)):
tree_node=tree_node
)
from jedi.evaluate.context import AbstractInstanceContext
overloaded_funcs = list(_find_overload_functions(context, tree_node))
parent_context = context
while parent_context.is_class() or isinstance(parent_context, AbstractInstanceContext):
while parent_context.is_class() or parent_context.is_instance():
parent_context = parent_context.parent_context
function = create(tree_node)

View File

@@ -68,8 +68,8 @@ class AbstractInstanceContext(Context):
self.class_context = class_context
self.var_args = var_args
def is_class(self):
return False
def is_instance(self):
return True
def get_annotated_class_object(self):
return self.class_context # This is the default.
@@ -114,7 +114,7 @@ class AbstractInstanceContext(Context):
# `method` is the new parent of the array, don't know if that's good.
names = self.get_function_slot_names(u'__get__')
if names:
if isinstance(obj, AbstractInstanceContext):
if obj.is_instance():
return self.execute_function_slots(names, obj, obj.class_context)
else:
none_obj = compiled.builtin_from_name(self.evaluator, u'None')
@@ -156,7 +156,7 @@ class AbstractInstanceContext(Context):
return
for generator in self.execute_function_slots(iter_slot_names):
if isinstance(generator, AbstractInstanceContext):
if generator.is_instance():
# `__next__` logic.
if self.evaluator.environment.version_info.major == 2:
name = u'next'

View File

@@ -19,7 +19,6 @@ from parso.python import tree
from parso.tree import search_ancestor
from jedi import debug
from jedi import settings
from jedi.evaluate.context import AbstractInstanceContext
from jedi.evaluate import compiled
from jedi.evaluate import analysis
from jedi.evaluate import flow_analysis
@@ -178,13 +177,13 @@ class NameFinder(object):
contexts = ContextSet.from_sets(name.infer() for name in names)
debug.dbg('finder._names_to_types: %s -> %s', names, contexts)
if not names and isinstance(self._context, AbstractInstanceContext):
if not names and self._context.is_instance():
# handling __getattr__ / __getattribute__
return self._check_getattr(self._context)
# Add isinstance and other if/assert knowledge.
if not contexts and isinstance(self._name, tree.Name) and \
not isinstance(self._name_context, AbstractInstanceContext):
not self._name_context.is_instance():
flow_scope = self._name
base_node = self._name_context.tree_node
if base_node.type == 'comp_for':