def eval_trailer(context, base_contexts, trailer): trailer_op, node = trailer.children[:2] if node == ')': # `arglist` is optional. node = None if trailer_op == '[': trailer_op, node, _ = trailer.children # TODO It's kind of stupid to cast this from a context set to a set. foo = set(base_contexts) # special case: PEP0484 typing module, see # https://github.com/davidhalter/jedi/issues/663 result = ContextSet() for typ in list(foo): if isinstance(typ, (ClassContext, TreeInstance)): typing_module_types = pep0484.py__getitem__(context, typ, node) if typing_module_types is not None: foo.remove(typ) result |= typing_module_types return result | base_contexts.get_item( eval_subscript_list(context.evaluator, context, node), ContextualizedNode(context, trailer) ) else: debug.dbg('eval_trailer: %s in %s', trailer, base_contexts) if trailer_op == '.': return base_contexts.py__getattribute__( name_context=context, name_or_str=node ) else: assert trailer_op == '(', 'trailer_op is actually %s' % trailer_op args = arguments.TreeArguments(context.evaluator, context, node, trailer) return base_contexts.execute(args)
def eval_trailer(context, base_contexts, trailer): trailer_op, node = trailer.children[:2] if node == ')': # `arglist` is optional. node = None if trailer_op == '[': trailer_op, node, _ = trailer.children # TODO It's kind of stupid to cast this from a context set to a set. foo = set(base_contexts) # special case: PEP0484 typing module, see # https://github.com/davidhalter/jedi/issues/663 result = ContextSet() for typ in list(foo): if isinstance(typ, (ClassContext, TreeInstance)): typing_module_types = pep0484.py__getitem__(context, typ, node) if typing_module_types is not None: foo.remove(typ) result |= typing_module_types return result | base_contexts.get_item( eval_subscript_list(context.evaluator, context, node), ContextualizedNode(context, trailer)) else: debug.dbg('eval_trailer: %s in %s', trailer, base_contexts) if trailer_op == '.': return base_contexts.py__getattribute__(name_context=context, name_or_str=node) else: assert trailer_op == '(', 'trailer_op is actually %s' % trailer_op args = arguments.TreeArguments(context.evaluator, context, node, trailer) return base_contexts.execute(args)
def py__getitem__(evaluator, context, types, trailer): from jedi.evaluate.representation import ClassContext from jedi.evaluate.instance import TreeInstance result = set() trailer_op, node, trailer_cl = trailer.children assert trailer_op == "[" assert trailer_cl == "]" # special case: PEP0484 typing module, see # https://github.com/davidhalter/jedi/issues/663 for typ in list(types): if isinstance(typ, (ClassContext, TreeInstance)): typing_module_types = pep0484.py__getitem__(context, typ, node) if typing_module_types is not None: types.remove(typ) result |= typing_module_types if not types: # all consumed by special cases return result for index in create_index_types(evaluator, context, node): if isinstance(index, (compiled.CompiledObject, Slice)): index = index.obj if type(index) not in (float, int, str, unicode, slice, type(Ellipsis)): # If the index is not clearly defined, we have to get all the # possiblities. for typ in list(types): if isinstance(typ, AbstractSequence) and typ.array_type == 'dict': types.remove(typ) result |= typ.dict_values() return result | py__iter__types(evaluator, types) for typ in types: # The actual getitem call. try: getitem = typ.py__getitem__ except AttributeError: # TODO this context is probably not right. analysis.add( context, 'type-error-not-subscriptable', trailer_op, message="TypeError: '%s' object is not subscriptable" % typ) else: try: result |= getitem(index) except IndexError: result |= py__iter__types(evaluator, set([typ])) except KeyError: # Must be a dict. Lists don't raise KeyErrors. result |= typ.dict_values() return result
def py__getitem__(evaluator, context, types, trailer): from jedi.evaluate.representation import ClassContext from jedi.evaluate.instance import TreeInstance result = set() trailer_op, node, trailer_cl = trailer.children assert trailer_op == "[" assert trailer_cl == "]" # special case: PEP0484 typing module, see # https://github.com/davidhalter/jedi/issues/663 for typ in list(types): if isinstance(typ, (ClassContext, TreeInstance)): typing_module_types = pep0484.py__getitem__(context, typ, node) if typing_module_types is not None: types.remove(typ) result |= typing_module_types if not types: # all consumed by special cases return result for index in create_index_types(evaluator, context, node): if isinstance(index, (compiled.CompiledObject, Slice)): index = index.obj if type(index) not in (float, int, str, unicode, slice): # If the index is not clearly defined, we have to get all the # possiblities. for typ in list(types): if isinstance(typ, AbstractSequence) and typ.array_type == 'dict': types.remove(typ) result |= typ.dict_values() return result | py__iter__types(evaluator, types) for typ in types: # The actual getitem call. try: getitem = typ.py__getitem__ except AttributeError: # TODO this context is probably not right. analysis.add(context, 'type-error-not-subscriptable', trailer_op, message="TypeError: '%s' object is not subscriptable" % typ) else: try: result |= getitem(index) except IndexError: result |= py__iter__types(evaluator, set([typ])) except KeyError: # Must be a dict. Lists don't raise KeyErrors. result |= typ.dict_values() return result