Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/builtins.py
1421 views
"""This module trys to support builtin types and functions."""1import inspect23import rope.base.evaluate4from rope.base import pynames, pyobjects, arguments, utils, ast567class BuiltinModule(pyobjects.AbstractModule):89def __init__(self, name, pycore=None, initial={}):10super(BuiltinModule, self).__init__()11self.name = name12self.pycore = pycore13self.initial = initial1415parent = None1617def get_attributes(self):18return self.attributes1920def get_doc(self):21if self.module:22return self.module.__doc__2324def get_name(self):25return self.name.split('.')[-1]2627@property28@utils.saveit29def attributes(self):30result = _object_attributes(self.module, self)31result.update(self.initial)32if self.pycore is not None:33submodules = self.pycore._builtin_submodules(self.name)34for name, module in submodules.iteritems():35result[name] = rope.base.builtins.BuiltinName(module)36return result3738@property39@utils.saveit40def module(self):41try:42result = __import__(self.name)43for token in self.name.split('.')[1:]:44result = getattr(result, token, None)45return result46except ImportError:47return484950class _BuiltinElement(object):5152def __init__(self, builtin, parent=None):53self.builtin = builtin54self._parent = parent5556def get_doc(self):57if self.builtin:58return getattr(self.builtin, '__doc__', None)5960def get_name(self):61if self.builtin:62return getattr(self.builtin, '__name__', None)6364@property65def parent(self):66if self._parent is None:67return builtins68return self._parent697071class BuiltinClass(_BuiltinElement, pyobjects.AbstractClass):7273def __init__(self, builtin, attributes, parent=None):74_BuiltinElement.__init__(self, builtin, parent)75pyobjects.AbstractClass.__init__(self)76self.initial = attributes7778@utils.saveit79def get_attributes(self):80result = _object_attributes(self.builtin, self)81result.update(self.initial)82return result838485class BuiltinFunction(_BuiltinElement, pyobjects.AbstractFunction):8687def __init__(self, returned=None, function=None, builtin=None,88argnames=[], parent=None):89_BuiltinElement.__init__(self, builtin, parent)90pyobjects.AbstractFunction.__init__(self)91self.argnames = argnames92self.returned = returned93self.function = function9495def get_returned_object(self, args):96if self.function is not None:97return self.function(_CallContext(self.argnames, args))98else:99return self.returned100101def get_param_names(self, special_args=True):102return self.argnames103104105class BuiltinUnknown(_BuiltinElement, pyobjects.PyObject):106107def __init__(self, builtin):108super(BuiltinUnknown, self).__init__(pyobjects.get_unknown())109self.builtin = builtin110self.type = pyobjects.get_unknown()111112@utils.saveit113def get_attributes(self):114return _object_attributes(self.builtin, self)115116117def _object_attributes(obj, parent):118attributes = {}119for name in dir(obj):120if name == 'None':121continue122child = getattr(obj, name)123pyobject = None124if inspect.isclass(child):125pyobject = BuiltinClass(child, {}, parent=parent)126elif inspect.isroutine(child):127pyobject = BuiltinFunction(builtin=child, parent=parent)128else:129pyobject = BuiltinUnknown(builtin=child)130attributes[name] = BuiltinName(pyobject)131return attributes132133134def _create_builtin_type_getter(cls):135def _get_builtin(*args):136if not hasattr(cls, '_generated'):137cls._generated = {}138if args not in cls._generated:139cls._generated[args] = cls(*args)140return cls._generated[args]141return _get_builtin142143def _create_builtin_getter(cls):144type_getter = _create_builtin_type_getter(cls)145def _get_builtin(*args):146return pyobjects.PyObject(type_getter(*args))147return _get_builtin148149150class _CallContext(object):151152def __init__(self, argnames, args):153self.argnames = argnames154self.args = args155156def _get_scope_and_pyname(self, pyname):157if pyname is not None and isinstance(pyname, pynames.AssignedName):158pymodule, lineno = pyname.get_definition_location()159if pymodule is None:160return None, None161if lineno is None:162lineno = 1163scope = pymodule.get_scope().get_inner_scope_for_line(lineno)164name = None165while name is None and scope is not None:166for current in scope.get_names():167if scope[current] is pyname:168name = current169break170else:171scope = scope.parent172return scope, name173return None, None174175def get_argument(self, name):176if self.args:177args = self.args.get_arguments(self.argnames)178return args[self.argnames.index(name)]179180def get_pyname(self, name):181if self.args:182args = self.args.get_pynames(self.argnames)183if name in self.argnames:184return args[self.argnames.index(name)]185186def get_arguments(self, argnames):187if self.args:188return self.args.get_arguments(argnames)189190def get_pynames(self, argnames):191if self.args:192return self.args.get_pynames(argnames)193194def get_per_name(self):195if self.args is None:196return None197pyname = self.args.get_instance_pyname()198scope, name = self._get_scope_and_pyname(pyname)199if name is not None:200pymodule = pyname.get_definition_location()[0]201return pymodule.pycore.object_info.get_per_name(scope, name)202return None203204def save_per_name(self, value):205if self.args is None:206return None207pyname = self.args.get_instance_pyname()208scope, name = self._get_scope_and_pyname(pyname)209if name is not None:210pymodule = pyname.get_definition_location()[0]211pymodule.pycore.object_info.save_per_name(scope, name, value)212213214class _AttributeCollector(object):215216def __init__(self, type):217self.attributes = {}218self.type = type219220def __call__(self, name, returned=None, function=None,221argnames=['self'], check_existence=True):222try:223builtin = getattr(self.type, name)224except AttributeError:225if check_existence:226raise227builtin=None228self.attributes[name] = BuiltinName(229BuiltinFunction(returned=returned, function=function,230argnames=argnames, builtin=builtin))231232def __setitem__(self, name, value):233self.attributes[name] = value234235236class List(BuiltinClass):237238def __init__(self, holding=None):239self.holding = holding240collector = _AttributeCollector(list)241242collector('__iter__', function=self._iterator_get)243collector('__new__', function=self._new_list)244245# Adding methods246collector('append', function=self._list_add, argnames=['self', 'value'])247collector('__setitem__', function=self._list_add,248argnames=['self', 'index', 'value'])249collector('insert', function=self._list_add,250argnames=['self', 'index', 'value'])251collector('extend', function=self._self_set,252argnames=['self', 'iterable'])253254# Getting methods255collector('__getitem__', function=self._list_get)256collector('pop', function=self._list_get)257collector('__getslice__', function=self._self_get)258259super(List, self).__init__(list, collector.attributes)260261def _new_list(self, args):262return _create_builtin(args, get_list)263264def _list_add(self, context):265if self.holding is not None:266return267holding = context.get_argument('value')268if holding is not None and holding != pyobjects.get_unknown():269context.save_per_name(holding)270271def _self_set(self, context):272if self.holding is not None:273return274iterable = context.get_pyname('iterable')275holding = _infer_sequence_for_pyname(iterable)276if holding is not None and holding != pyobjects.get_unknown():277context.save_per_name(holding)278279def _list_get(self, context):280if self.holding is not None:281return self.holding282return context.get_per_name()283284def _iterator_get(self, context):285return get_iterator(self._list_get(context))286287def _self_get(self, context):288return get_list(self._list_get(context))289290291get_list = _create_builtin_getter(List)292get_list_type = _create_builtin_type_getter(List)293294295class Dict(BuiltinClass):296297def __init__(self, keys=None, values=None):298self.keys = keys299self.values = values300item = get_tuple(self.keys, self.values)301collector = _AttributeCollector(dict)302collector('__new__', function=self._new_dict)303collector('__setitem__', function=self._dict_add)304collector('popitem', function=self._item_get)305collector('pop', function=self._value_get)306collector('get', function=self._key_get)307collector('keys', function=self._key_list)308collector('values', function=self._value_list)309collector('items', function=self._item_list)310collector('copy', function=self._self_get)311collector('__getitem__', function=self._value_get)312collector('__iter__', function=self._key_iter)313collector('update', function=self._self_set)314super(Dict, self).__init__(dict, collector.attributes)315316def _new_dict(self, args):317def do_create(holding=None):318if holding is None:319return get_dict()320type = holding.get_type()321if isinstance(type, Tuple) and len(type.get_holding_objects()) == 2:322return get_dict(*type.get_holding_objects())323return _create_builtin(args, do_create)324325def _dict_add(self, context):326if self.keys is not None:327return328key, value = context.get_arguments(['self', 'key', 'value'])[1:]329if key is not None and key != pyobjects.get_unknown():330context.save_per_name(get_tuple(key, value))331332def _item_get(self, context):333if self.keys is not None:334return get_tuple(self.keys, self.values)335item = context.get_per_name()336if item is None or not isinstance(item.get_type(), Tuple):337return get_tuple(self.keys, self.values)338return item339340def _value_get(self, context):341item = self._item_get(context).get_type()342return item.get_holding_objects()[1]343344def _key_get(self, context):345item = self._item_get(context).get_type()346return item.get_holding_objects()[0]347348def _value_list(self, context):349return get_list(self._value_get(context))350351def _key_list(self, context):352return get_list(self._key_get(context))353354def _item_list(self, context):355return get_list(self._item_get(context))356357def _value_iter(self, context):358return get_iterator(self._value_get(context))359360def _key_iter(self, context):361return get_iterator(self._key_get(context))362363def _item_iter(self, context):364return get_iterator(self._item_get(context))365366def _self_get(self, context):367item = self._item_get(context).get_type()368key, value = item.get_holding_objects()[:2]369return get_dict(key, value)370371def _self_set(self, context):372if self.keys is not None:373return374new_dict = context.get_pynames(['self', 'd'])[1]375if new_dict and isinstance(new_dict.get_object().get_type(), Dict):376args = arguments.ObjectArguments([new_dict])377items = new_dict.get_object()['popitem'].\378get_object().get_returned_object(args)379context.save_per_name(items)380else:381holding = _infer_sequence_for_pyname(new_dict)382if holding is not None and isinstance(holding.get_type(), Tuple):383context.save_per_name(holding)384385386get_dict = _create_builtin_getter(Dict)387get_dict_type = _create_builtin_type_getter(Dict)388389390class Tuple(BuiltinClass):391392def __init__(self, *objects):393self.objects = objects394first = None395if objects:396first = objects[0]397attributes = {398'__getitem__': BuiltinName(BuiltinFunction(first)),399'__getslice__': BuiltinName(BuiltinFunction(pyobjects.PyObject(self))),400'__new__': BuiltinName(BuiltinFunction(function=self._new_tuple)),401'__iter__': BuiltinName(BuiltinFunction(get_iterator(first)))}402super(Tuple, self).__init__(tuple, attributes)403404def get_holding_objects(self):405return self.objects406407def _new_tuple(self, args):408return _create_builtin(args, get_tuple)409410411get_tuple = _create_builtin_getter(Tuple)412get_tuple_type = _create_builtin_type_getter(Tuple)413414415class Set(BuiltinClass):416417def __init__(self, holding=None):418self.holding = holding419collector = _AttributeCollector(set)420collector('__new__', function=self._new_set)421422self_methods = ['copy', 'difference', 'intersection',423'symmetric_difference', 'union']424for method in self_methods:425collector(method, function=self._self_get)426collector('add', function=self._set_add)427collector('update', function=self._self_set)428collector('update', function=self._self_set)429collector('symmetric_difference_update', function=self._self_set)430collector('difference_update', function=self._self_set)431432collector('pop', function=self._set_get)433collector('__iter__', function=self._iterator_get)434super(Set, self).__init__(set, collector.attributes)435436def _new_set(self, args):437return _create_builtin(args, get_set)438439def _set_add(self, context):440if self.holding is not None:441return442holding = context.get_arguments(['self', 'value'])[1]443if holding is not None and holding != pyobjects.get_unknown():444context.save_per_name(holding)445446def _self_set(self, context):447if self.holding is not None:448return449iterable = context.get_pyname('iterable')450holding = _infer_sequence_for_pyname(iterable)451if holding is not None and holding != pyobjects.get_unknown():452context.save_per_name(holding)453454def _set_get(self, context):455if self.holding is not None:456return self.holding457return context.get_per_name()458459def _iterator_get(self, context):460return get_iterator(self._set_get(context))461462def _self_get(self, context):463return get_list(self._set_get(context))464465466get_set = _create_builtin_getter(Set)467get_set_type = _create_builtin_type_getter(Set)468469470class Str(BuiltinClass):471472def __init__(self):473self_object = pyobjects.PyObject(self)474collector = _AttributeCollector(str)475collector('__iter__', get_iterator(self_object), check_existence=False)476477self_methods = ['__getitem__', '__getslice__', 'capitalize', 'center',478'decode', 'encode', 'expandtabs', 'join', 'ljust',479'lower', 'lstrip', 'replace', 'rjust', 'rstrip', 'strip',480'swapcase', 'title', 'translate', 'upper', 'zfill']481for method in self_methods:482collector(method, self_object)483484for method in ['rsplit', 'split', 'splitlines']:485collector(method, get_list(self_object))486487super(Str, self).__init__(str, collector.attributes)488489def get_doc(self):490return str.__doc__491492493get_str = _create_builtin_getter(Str)494get_str_type = _create_builtin_type_getter(Str)495496497class BuiltinName(pynames.PyName):498499def __init__(self, pyobject):500self.pyobject = pyobject501502def get_object(self):503return self.pyobject504505def get_definition_location(self):506return (None, None)507508class Iterator(pyobjects.AbstractClass):509510def __init__(self, holding=None):511super(Iterator, self).__init__()512self.holding = holding513self.attributes = {514'next': BuiltinName(BuiltinFunction(self.holding)),515'__iter__': BuiltinName(BuiltinFunction(self))}516517def get_attributes(self):518return self.attributes519520def get_returned_object(self, args):521return self.holding522523get_iterator = _create_builtin_getter(Iterator)524525526class Generator(pyobjects.AbstractClass):527528def __init__(self, holding=None):529super(Generator, self).__init__()530self.holding = holding531self.attributes = {532'next': BuiltinName(BuiltinFunction(self.holding)),533'__iter__': BuiltinName(BuiltinFunction(get_iterator(self.holding))),534'close': BuiltinName(BuiltinFunction()),535'send': BuiltinName(BuiltinFunction()),536'throw': BuiltinName(BuiltinFunction())}537538def get_attributes(self):539return self.attributes540541def get_returned_object(self, args):542return self.holding543544get_generator = _create_builtin_getter(Generator)545546547class File(BuiltinClass):548549def __init__(self):550self_object = pyobjects.PyObject(self)551str_object = get_str()552str_list = get_list(get_str())553attributes = {}554def add(name, returned=None, function=None):555builtin = getattr(file, name, None)556attributes[name] = BuiltinName(557BuiltinFunction(returned=returned, function=function,558builtin=builtin))559add('__iter__', get_iterator(str_object))560for method in ['next', 'read', 'readline', 'readlines']:561add(method, str_list)562for method in ['close', 'flush', 'lineno', 'isatty', 'seek', 'tell',563'truncate', 'write', 'writelines']:564add(method)565super(File, self).__init__(file, attributes)566567568get_file = _create_builtin_getter(File)569get_file_type = _create_builtin_type_getter(File)570571572class Property(BuiltinClass):573574def __init__(self, fget=None, fset=None, fdel=None, fdoc=None):575self._fget = fget576self._fdoc = fdoc577attributes = {578'fget': BuiltinName(BuiltinFunction()),579'fset': BuiltinName(pynames.UnboundName()),580'fdel': BuiltinName(pynames.UnboundName()),581'__new__': BuiltinName(BuiltinFunction(function=_property_function))}582super(Property, self).__init__(property, attributes)583584def get_property_object(self, args):585if isinstance(self._fget, pyobjects.AbstractFunction):586return self._fget.get_returned_object(args)587588589def _property_function(args):590parameters = args.get_arguments(['fget', 'fset', 'fdel', 'fdoc'])591return pyobjects.PyObject(Property(parameters[0]))592593594class Lambda(pyobjects.AbstractFunction):595596def __init__(self, node, scope):597super(Lambda, self).__init__()598self.node = node599self.arguments = node.args600self.scope = scope601602def get_returned_object(self, args):603result = rope.base.evaluate.eval_node(self.scope, self.node.body)604if result is not None:605return result.get_object()606else:607return pyobjects.get_unknown()608609def get_module(self):610return self.parent.get_module()611612def get_scope(self):613return self.scope614615def get_kind(self):616return 'lambda'617618def get_ast(self):619return self.node620621def get_attributes(self):622return {}623624def get_name(self):625return 'lambda'626627def get_param_names(self, special_args=True):628result = [node.id for node in self.arguments.args629if isinstance(node, ast.Name)]630if self.arguments.vararg:631result.append('*' + self.arguments.vararg)632if self.arguments.kwarg:633result.append('**' + self.arguments.kwarg)634return result635636@property637def parent(self):638return self.scope.pyobject639640641class BuiltinObject(BuiltinClass):642643def __init__(self):644super(BuiltinObject, self).__init__(object, {})645646647class BuiltinType(BuiltinClass):648649def __init__(self):650super(BuiltinType, self).__init__(type, {})651652653def _infer_sequence_for_pyname(pyname):654if pyname is None:655return None656seq = pyname.get_object()657args = arguments.ObjectArguments([pyname])658if '__iter__' in seq:659obj = seq['__iter__'].get_object()660if not isinstance(obj, pyobjects.AbstractFunction):661return None662iter = obj.get_returned_object(args)663if iter is not None and 'next' in iter:664holding = iter['next'].get_object().\665get_returned_object(args)666return holding667668669def _create_builtin(args, creator):670passed = args.get_pynames(['sequence'])[0]671if passed is None:672holding = None673else:674holding = _infer_sequence_for_pyname(passed)675if holding is not None:676return creator(holding)677else:678return creator()679680681def _range_function(args):682return get_list()683684def _reversed_function(args):685return _create_builtin(args, get_iterator)686687def _sorted_function(args):688return _create_builtin(args, get_list)689690def _super_function(args):691passed_class, passed_self = args.get_arguments(['type', 'self'])692if passed_self is None:693return passed_class694else:695#pyclass = passed_self.get_type()696pyclass = passed_class697if isinstance(pyclass, pyobjects.AbstractClass):698supers = pyclass.get_superclasses()699if supers:700return pyobjects.PyObject(supers[0])701return passed_self702703def _zip_function(args):704args = args.get_pynames(['sequence'])705objects = []706for seq in args:707if seq is None:708holding = None709else:710holding = _infer_sequence_for_pyname(seq)711objects.append(holding)712tuple = get_tuple(*objects)713return get_list(tuple)714715def _enumerate_function(args):716passed = args.get_pynames(['sequence'])[0]717if passed is None:718holding = None719else:720holding = _infer_sequence_for_pyname(passed)721tuple = get_tuple(None, holding)722return get_iterator(tuple)723724def _iter_function(args):725passed = args.get_pynames(['sequence'])[0]726if passed is None:727holding = None728else:729holding = _infer_sequence_for_pyname(passed)730return get_iterator(holding)731732def _input_function(args):733return get_str()734735736_initial_builtins = {737'list': BuiltinName(get_list_type()),738'dict': BuiltinName(get_dict_type()),739'tuple': BuiltinName(get_tuple_type()),740'set': BuiltinName(get_set_type()),741'str': BuiltinName(get_str_type()),742'file': BuiltinName(get_file_type()),743'open': BuiltinName(get_file_type()),744'unicode': BuiltinName(get_str_type()),745'range': BuiltinName(BuiltinFunction(function=_range_function, builtin=range)),746'reversed': BuiltinName(BuiltinFunction(function=_reversed_function, builtin=reversed)),747'sorted': BuiltinName(BuiltinFunction(function=_sorted_function, builtin=sorted)),748'super': BuiltinName(BuiltinFunction(function=_super_function, builtin=super)),749'property': BuiltinName(BuiltinFunction(function=_property_function, builtin=property)),750'zip': BuiltinName(BuiltinFunction(function=_zip_function, builtin=zip)),751'enumerate': BuiltinName(BuiltinFunction(function=_enumerate_function, builtin=enumerate)),752'object': BuiltinName(BuiltinObject()),753'type': BuiltinName(BuiltinType()),754'iter': BuiltinName(BuiltinFunction(function=_iter_function, builtin=iter)),755'raw_input': BuiltinName(BuiltinFunction(function=_input_function, builtin=raw_input)),756}757758builtins = BuiltinModule('__builtin__', initial=_initial_builtins)759760761