Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/builtins.py
1421 views
1
"""This module trys to support builtin types and functions."""
2
import inspect
3
4
import rope.base.evaluate
5
from rope.base import pynames, pyobjects, arguments, utils, ast
6
7
8
class BuiltinModule(pyobjects.AbstractModule):
9
10
def __init__(self, name, pycore=None, initial={}):
11
super(BuiltinModule, self).__init__()
12
self.name = name
13
self.pycore = pycore
14
self.initial = initial
15
16
parent = None
17
18
def get_attributes(self):
19
return self.attributes
20
21
def get_doc(self):
22
if self.module:
23
return self.module.__doc__
24
25
def get_name(self):
26
return self.name.split('.')[-1]
27
28
@property
29
@utils.saveit
30
def attributes(self):
31
result = _object_attributes(self.module, self)
32
result.update(self.initial)
33
if self.pycore is not None:
34
submodules = self.pycore._builtin_submodules(self.name)
35
for name, module in submodules.iteritems():
36
result[name] = rope.base.builtins.BuiltinName(module)
37
return result
38
39
@property
40
@utils.saveit
41
def module(self):
42
try:
43
result = __import__(self.name)
44
for token in self.name.split('.')[1:]:
45
result = getattr(result, token, None)
46
return result
47
except ImportError:
48
return
49
50
51
class _BuiltinElement(object):
52
53
def __init__(self, builtin, parent=None):
54
self.builtin = builtin
55
self._parent = parent
56
57
def get_doc(self):
58
if self.builtin:
59
return getattr(self.builtin, '__doc__', None)
60
61
def get_name(self):
62
if self.builtin:
63
return getattr(self.builtin, '__name__', None)
64
65
@property
66
def parent(self):
67
if self._parent is None:
68
return builtins
69
return self._parent
70
71
72
class BuiltinClass(_BuiltinElement, pyobjects.AbstractClass):
73
74
def __init__(self, builtin, attributes, parent=None):
75
_BuiltinElement.__init__(self, builtin, parent)
76
pyobjects.AbstractClass.__init__(self)
77
self.initial = attributes
78
79
@utils.saveit
80
def get_attributes(self):
81
result = _object_attributes(self.builtin, self)
82
result.update(self.initial)
83
return result
84
85
86
class BuiltinFunction(_BuiltinElement, pyobjects.AbstractFunction):
87
88
def __init__(self, returned=None, function=None, builtin=None,
89
argnames=[], parent=None):
90
_BuiltinElement.__init__(self, builtin, parent)
91
pyobjects.AbstractFunction.__init__(self)
92
self.argnames = argnames
93
self.returned = returned
94
self.function = function
95
96
def get_returned_object(self, args):
97
if self.function is not None:
98
return self.function(_CallContext(self.argnames, args))
99
else:
100
return self.returned
101
102
def get_param_names(self, special_args=True):
103
return self.argnames
104
105
106
class BuiltinUnknown(_BuiltinElement, pyobjects.PyObject):
107
108
def __init__(self, builtin):
109
super(BuiltinUnknown, self).__init__(pyobjects.get_unknown())
110
self.builtin = builtin
111
self.type = pyobjects.get_unknown()
112
113
@utils.saveit
114
def get_attributes(self):
115
return _object_attributes(self.builtin, self)
116
117
118
def _object_attributes(obj, parent):
119
attributes = {}
120
for name in dir(obj):
121
if name == 'None':
122
continue
123
child = getattr(obj, name)
124
pyobject = None
125
if inspect.isclass(child):
126
pyobject = BuiltinClass(child, {}, parent=parent)
127
elif inspect.isroutine(child):
128
pyobject = BuiltinFunction(builtin=child, parent=parent)
129
else:
130
pyobject = BuiltinUnknown(builtin=child)
131
attributes[name] = BuiltinName(pyobject)
132
return attributes
133
134
135
def _create_builtin_type_getter(cls):
136
def _get_builtin(*args):
137
if not hasattr(cls, '_generated'):
138
cls._generated = {}
139
if args not in cls._generated:
140
cls._generated[args] = cls(*args)
141
return cls._generated[args]
142
return _get_builtin
143
144
def _create_builtin_getter(cls):
145
type_getter = _create_builtin_type_getter(cls)
146
def _get_builtin(*args):
147
return pyobjects.PyObject(type_getter(*args))
148
return _get_builtin
149
150
151
class _CallContext(object):
152
153
def __init__(self, argnames, args):
154
self.argnames = argnames
155
self.args = args
156
157
def _get_scope_and_pyname(self, pyname):
158
if pyname is not None and isinstance(pyname, pynames.AssignedName):
159
pymodule, lineno = pyname.get_definition_location()
160
if pymodule is None:
161
return None, None
162
if lineno is None:
163
lineno = 1
164
scope = pymodule.get_scope().get_inner_scope_for_line(lineno)
165
name = None
166
while name is None and scope is not None:
167
for current in scope.get_names():
168
if scope[current] is pyname:
169
name = current
170
break
171
else:
172
scope = scope.parent
173
return scope, name
174
return None, None
175
176
def get_argument(self, name):
177
if self.args:
178
args = self.args.get_arguments(self.argnames)
179
return args[self.argnames.index(name)]
180
181
def get_pyname(self, name):
182
if self.args:
183
args = self.args.get_pynames(self.argnames)
184
if name in self.argnames:
185
return args[self.argnames.index(name)]
186
187
def get_arguments(self, argnames):
188
if self.args:
189
return self.args.get_arguments(argnames)
190
191
def get_pynames(self, argnames):
192
if self.args:
193
return self.args.get_pynames(argnames)
194
195
def get_per_name(self):
196
if self.args is None:
197
return None
198
pyname = self.args.get_instance_pyname()
199
scope, name = self._get_scope_and_pyname(pyname)
200
if name is not None:
201
pymodule = pyname.get_definition_location()[0]
202
return pymodule.pycore.object_info.get_per_name(scope, name)
203
return None
204
205
def save_per_name(self, value):
206
if self.args is None:
207
return None
208
pyname = self.args.get_instance_pyname()
209
scope, name = self._get_scope_and_pyname(pyname)
210
if name is not None:
211
pymodule = pyname.get_definition_location()[0]
212
pymodule.pycore.object_info.save_per_name(scope, name, value)
213
214
215
class _AttributeCollector(object):
216
217
def __init__(self, type):
218
self.attributes = {}
219
self.type = type
220
221
def __call__(self, name, returned=None, function=None,
222
argnames=['self'], check_existence=True):
223
try:
224
builtin = getattr(self.type, name)
225
except AttributeError:
226
if check_existence:
227
raise
228
builtin=None
229
self.attributes[name] = BuiltinName(
230
BuiltinFunction(returned=returned, function=function,
231
argnames=argnames, builtin=builtin))
232
233
def __setitem__(self, name, value):
234
self.attributes[name] = value
235
236
237
class List(BuiltinClass):
238
239
def __init__(self, holding=None):
240
self.holding = holding
241
collector = _AttributeCollector(list)
242
243
collector('__iter__', function=self._iterator_get)
244
collector('__new__', function=self._new_list)
245
246
# Adding methods
247
collector('append', function=self._list_add, argnames=['self', 'value'])
248
collector('__setitem__', function=self._list_add,
249
argnames=['self', 'index', 'value'])
250
collector('insert', function=self._list_add,
251
argnames=['self', 'index', 'value'])
252
collector('extend', function=self._self_set,
253
argnames=['self', 'iterable'])
254
255
# Getting methods
256
collector('__getitem__', function=self._list_get)
257
collector('pop', function=self._list_get)
258
collector('__getslice__', function=self._self_get)
259
260
super(List, self).__init__(list, collector.attributes)
261
262
def _new_list(self, args):
263
return _create_builtin(args, get_list)
264
265
def _list_add(self, context):
266
if self.holding is not None:
267
return
268
holding = context.get_argument('value')
269
if holding is not None and holding != pyobjects.get_unknown():
270
context.save_per_name(holding)
271
272
def _self_set(self, context):
273
if self.holding is not None:
274
return
275
iterable = context.get_pyname('iterable')
276
holding = _infer_sequence_for_pyname(iterable)
277
if holding is not None and holding != pyobjects.get_unknown():
278
context.save_per_name(holding)
279
280
def _list_get(self, context):
281
if self.holding is not None:
282
return self.holding
283
return context.get_per_name()
284
285
def _iterator_get(self, context):
286
return get_iterator(self._list_get(context))
287
288
def _self_get(self, context):
289
return get_list(self._list_get(context))
290
291
292
get_list = _create_builtin_getter(List)
293
get_list_type = _create_builtin_type_getter(List)
294
295
296
class Dict(BuiltinClass):
297
298
def __init__(self, keys=None, values=None):
299
self.keys = keys
300
self.values = values
301
item = get_tuple(self.keys, self.values)
302
collector = _AttributeCollector(dict)
303
collector('__new__', function=self._new_dict)
304
collector('__setitem__', function=self._dict_add)
305
collector('popitem', function=self._item_get)
306
collector('pop', function=self._value_get)
307
collector('get', function=self._key_get)
308
collector('keys', function=self._key_list)
309
collector('values', function=self._value_list)
310
collector('items', function=self._item_list)
311
collector('copy', function=self._self_get)
312
collector('__getitem__', function=self._value_get)
313
collector('__iter__', function=self._key_iter)
314
collector('update', function=self._self_set)
315
super(Dict, self).__init__(dict, collector.attributes)
316
317
def _new_dict(self, args):
318
def do_create(holding=None):
319
if holding is None:
320
return get_dict()
321
type = holding.get_type()
322
if isinstance(type, Tuple) and len(type.get_holding_objects()) == 2:
323
return get_dict(*type.get_holding_objects())
324
return _create_builtin(args, do_create)
325
326
def _dict_add(self, context):
327
if self.keys is not None:
328
return
329
key, value = context.get_arguments(['self', 'key', 'value'])[1:]
330
if key is not None and key != pyobjects.get_unknown():
331
context.save_per_name(get_tuple(key, value))
332
333
def _item_get(self, context):
334
if self.keys is not None:
335
return get_tuple(self.keys, self.values)
336
item = context.get_per_name()
337
if item is None or not isinstance(item.get_type(), Tuple):
338
return get_tuple(self.keys, self.values)
339
return item
340
341
def _value_get(self, context):
342
item = self._item_get(context).get_type()
343
return item.get_holding_objects()[1]
344
345
def _key_get(self, context):
346
item = self._item_get(context).get_type()
347
return item.get_holding_objects()[0]
348
349
def _value_list(self, context):
350
return get_list(self._value_get(context))
351
352
def _key_list(self, context):
353
return get_list(self._key_get(context))
354
355
def _item_list(self, context):
356
return get_list(self._item_get(context))
357
358
def _value_iter(self, context):
359
return get_iterator(self._value_get(context))
360
361
def _key_iter(self, context):
362
return get_iterator(self._key_get(context))
363
364
def _item_iter(self, context):
365
return get_iterator(self._item_get(context))
366
367
def _self_get(self, context):
368
item = self._item_get(context).get_type()
369
key, value = item.get_holding_objects()[:2]
370
return get_dict(key, value)
371
372
def _self_set(self, context):
373
if self.keys is not None:
374
return
375
new_dict = context.get_pynames(['self', 'd'])[1]
376
if new_dict and isinstance(new_dict.get_object().get_type(), Dict):
377
args = arguments.ObjectArguments([new_dict])
378
items = new_dict.get_object()['popitem'].\
379
get_object().get_returned_object(args)
380
context.save_per_name(items)
381
else:
382
holding = _infer_sequence_for_pyname(new_dict)
383
if holding is not None and isinstance(holding.get_type(), Tuple):
384
context.save_per_name(holding)
385
386
387
get_dict = _create_builtin_getter(Dict)
388
get_dict_type = _create_builtin_type_getter(Dict)
389
390
391
class Tuple(BuiltinClass):
392
393
def __init__(self, *objects):
394
self.objects = objects
395
first = None
396
if objects:
397
first = objects[0]
398
attributes = {
399
'__getitem__': BuiltinName(BuiltinFunction(first)),
400
'__getslice__': BuiltinName(BuiltinFunction(pyobjects.PyObject(self))),
401
'__new__': BuiltinName(BuiltinFunction(function=self._new_tuple)),
402
'__iter__': BuiltinName(BuiltinFunction(get_iterator(first)))}
403
super(Tuple, self).__init__(tuple, attributes)
404
405
def get_holding_objects(self):
406
return self.objects
407
408
def _new_tuple(self, args):
409
return _create_builtin(args, get_tuple)
410
411
412
get_tuple = _create_builtin_getter(Tuple)
413
get_tuple_type = _create_builtin_type_getter(Tuple)
414
415
416
class Set(BuiltinClass):
417
418
def __init__(self, holding=None):
419
self.holding = holding
420
collector = _AttributeCollector(set)
421
collector('__new__', function=self._new_set)
422
423
self_methods = ['copy', 'difference', 'intersection',
424
'symmetric_difference', 'union']
425
for method in self_methods:
426
collector(method, function=self._self_get)
427
collector('add', function=self._set_add)
428
collector('update', function=self._self_set)
429
collector('update', function=self._self_set)
430
collector('symmetric_difference_update', function=self._self_set)
431
collector('difference_update', function=self._self_set)
432
433
collector('pop', function=self._set_get)
434
collector('__iter__', function=self._iterator_get)
435
super(Set, self).__init__(set, collector.attributes)
436
437
def _new_set(self, args):
438
return _create_builtin(args, get_set)
439
440
def _set_add(self, context):
441
if self.holding is not None:
442
return
443
holding = context.get_arguments(['self', 'value'])[1]
444
if holding is not None and holding != pyobjects.get_unknown():
445
context.save_per_name(holding)
446
447
def _self_set(self, context):
448
if self.holding is not None:
449
return
450
iterable = context.get_pyname('iterable')
451
holding = _infer_sequence_for_pyname(iterable)
452
if holding is not None and holding != pyobjects.get_unknown():
453
context.save_per_name(holding)
454
455
def _set_get(self, context):
456
if self.holding is not None:
457
return self.holding
458
return context.get_per_name()
459
460
def _iterator_get(self, context):
461
return get_iterator(self._set_get(context))
462
463
def _self_get(self, context):
464
return get_list(self._set_get(context))
465
466
467
get_set = _create_builtin_getter(Set)
468
get_set_type = _create_builtin_type_getter(Set)
469
470
471
class Str(BuiltinClass):
472
473
def __init__(self):
474
self_object = pyobjects.PyObject(self)
475
collector = _AttributeCollector(str)
476
collector('__iter__', get_iterator(self_object), check_existence=False)
477
478
self_methods = ['__getitem__', '__getslice__', 'capitalize', 'center',
479
'decode', 'encode', 'expandtabs', 'join', 'ljust',
480
'lower', 'lstrip', 'replace', 'rjust', 'rstrip', 'strip',
481
'swapcase', 'title', 'translate', 'upper', 'zfill']
482
for method in self_methods:
483
collector(method, self_object)
484
485
for method in ['rsplit', 'split', 'splitlines']:
486
collector(method, get_list(self_object))
487
488
super(Str, self).__init__(str, collector.attributes)
489
490
def get_doc(self):
491
return str.__doc__
492
493
494
get_str = _create_builtin_getter(Str)
495
get_str_type = _create_builtin_type_getter(Str)
496
497
498
class BuiltinName(pynames.PyName):
499
500
def __init__(self, pyobject):
501
self.pyobject = pyobject
502
503
def get_object(self):
504
return self.pyobject
505
506
def get_definition_location(self):
507
return (None, None)
508
509
class Iterator(pyobjects.AbstractClass):
510
511
def __init__(self, holding=None):
512
super(Iterator, self).__init__()
513
self.holding = holding
514
self.attributes = {
515
'next': BuiltinName(BuiltinFunction(self.holding)),
516
'__iter__': BuiltinName(BuiltinFunction(self))}
517
518
def get_attributes(self):
519
return self.attributes
520
521
def get_returned_object(self, args):
522
return self.holding
523
524
get_iterator = _create_builtin_getter(Iterator)
525
526
527
class Generator(pyobjects.AbstractClass):
528
529
def __init__(self, holding=None):
530
super(Generator, self).__init__()
531
self.holding = holding
532
self.attributes = {
533
'next': BuiltinName(BuiltinFunction(self.holding)),
534
'__iter__': BuiltinName(BuiltinFunction(get_iterator(self.holding))),
535
'close': BuiltinName(BuiltinFunction()),
536
'send': BuiltinName(BuiltinFunction()),
537
'throw': BuiltinName(BuiltinFunction())}
538
539
def get_attributes(self):
540
return self.attributes
541
542
def get_returned_object(self, args):
543
return self.holding
544
545
get_generator = _create_builtin_getter(Generator)
546
547
548
class File(BuiltinClass):
549
550
def __init__(self):
551
self_object = pyobjects.PyObject(self)
552
str_object = get_str()
553
str_list = get_list(get_str())
554
attributes = {}
555
def add(name, returned=None, function=None):
556
builtin = getattr(file, name, None)
557
attributes[name] = BuiltinName(
558
BuiltinFunction(returned=returned, function=function,
559
builtin=builtin))
560
add('__iter__', get_iterator(str_object))
561
for method in ['next', 'read', 'readline', 'readlines']:
562
add(method, str_list)
563
for method in ['close', 'flush', 'lineno', 'isatty', 'seek', 'tell',
564
'truncate', 'write', 'writelines']:
565
add(method)
566
super(File, self).__init__(file, attributes)
567
568
569
get_file = _create_builtin_getter(File)
570
get_file_type = _create_builtin_type_getter(File)
571
572
573
class Property(BuiltinClass):
574
575
def __init__(self, fget=None, fset=None, fdel=None, fdoc=None):
576
self._fget = fget
577
self._fdoc = fdoc
578
attributes = {
579
'fget': BuiltinName(BuiltinFunction()),
580
'fset': BuiltinName(pynames.UnboundName()),
581
'fdel': BuiltinName(pynames.UnboundName()),
582
'__new__': BuiltinName(BuiltinFunction(function=_property_function))}
583
super(Property, self).__init__(property, attributes)
584
585
def get_property_object(self, args):
586
if isinstance(self._fget, pyobjects.AbstractFunction):
587
return self._fget.get_returned_object(args)
588
589
590
def _property_function(args):
591
parameters = args.get_arguments(['fget', 'fset', 'fdel', 'fdoc'])
592
return pyobjects.PyObject(Property(parameters[0]))
593
594
595
class Lambda(pyobjects.AbstractFunction):
596
597
def __init__(self, node, scope):
598
super(Lambda, self).__init__()
599
self.node = node
600
self.arguments = node.args
601
self.scope = scope
602
603
def get_returned_object(self, args):
604
result = rope.base.evaluate.eval_node(self.scope, self.node.body)
605
if result is not None:
606
return result.get_object()
607
else:
608
return pyobjects.get_unknown()
609
610
def get_module(self):
611
return self.parent.get_module()
612
613
def get_scope(self):
614
return self.scope
615
616
def get_kind(self):
617
return 'lambda'
618
619
def get_ast(self):
620
return self.node
621
622
def get_attributes(self):
623
return {}
624
625
def get_name(self):
626
return 'lambda'
627
628
def get_param_names(self, special_args=True):
629
result = [node.id for node in self.arguments.args
630
if isinstance(node, ast.Name)]
631
if self.arguments.vararg:
632
result.append('*' + self.arguments.vararg)
633
if self.arguments.kwarg:
634
result.append('**' + self.arguments.kwarg)
635
return result
636
637
@property
638
def parent(self):
639
return self.scope.pyobject
640
641
642
class BuiltinObject(BuiltinClass):
643
644
def __init__(self):
645
super(BuiltinObject, self).__init__(object, {})
646
647
648
class BuiltinType(BuiltinClass):
649
650
def __init__(self):
651
super(BuiltinType, self).__init__(type, {})
652
653
654
def _infer_sequence_for_pyname(pyname):
655
if pyname is None:
656
return None
657
seq = pyname.get_object()
658
args = arguments.ObjectArguments([pyname])
659
if '__iter__' in seq:
660
obj = seq['__iter__'].get_object()
661
if not isinstance(obj, pyobjects.AbstractFunction):
662
return None
663
iter = obj.get_returned_object(args)
664
if iter is not None and 'next' in iter:
665
holding = iter['next'].get_object().\
666
get_returned_object(args)
667
return holding
668
669
670
def _create_builtin(args, creator):
671
passed = args.get_pynames(['sequence'])[0]
672
if passed is None:
673
holding = None
674
else:
675
holding = _infer_sequence_for_pyname(passed)
676
if holding is not None:
677
return creator(holding)
678
else:
679
return creator()
680
681
682
def _range_function(args):
683
return get_list()
684
685
def _reversed_function(args):
686
return _create_builtin(args, get_iterator)
687
688
def _sorted_function(args):
689
return _create_builtin(args, get_list)
690
691
def _super_function(args):
692
passed_class, passed_self = args.get_arguments(['type', 'self'])
693
if passed_self is None:
694
return passed_class
695
else:
696
#pyclass = passed_self.get_type()
697
pyclass = passed_class
698
if isinstance(pyclass, pyobjects.AbstractClass):
699
supers = pyclass.get_superclasses()
700
if supers:
701
return pyobjects.PyObject(supers[0])
702
return passed_self
703
704
def _zip_function(args):
705
args = args.get_pynames(['sequence'])
706
objects = []
707
for seq in args:
708
if seq is None:
709
holding = None
710
else:
711
holding = _infer_sequence_for_pyname(seq)
712
objects.append(holding)
713
tuple = get_tuple(*objects)
714
return get_list(tuple)
715
716
def _enumerate_function(args):
717
passed = args.get_pynames(['sequence'])[0]
718
if passed is None:
719
holding = None
720
else:
721
holding = _infer_sequence_for_pyname(passed)
722
tuple = get_tuple(None, holding)
723
return get_iterator(tuple)
724
725
def _iter_function(args):
726
passed = args.get_pynames(['sequence'])[0]
727
if passed is None:
728
holding = None
729
else:
730
holding = _infer_sequence_for_pyname(passed)
731
return get_iterator(holding)
732
733
def _input_function(args):
734
return get_str()
735
736
737
_initial_builtins = {
738
'list': BuiltinName(get_list_type()),
739
'dict': BuiltinName(get_dict_type()),
740
'tuple': BuiltinName(get_tuple_type()),
741
'set': BuiltinName(get_set_type()),
742
'str': BuiltinName(get_str_type()),
743
'file': BuiltinName(get_file_type()),
744
'open': BuiltinName(get_file_type()),
745
'unicode': BuiltinName(get_str_type()),
746
'range': BuiltinName(BuiltinFunction(function=_range_function, builtin=range)),
747
'reversed': BuiltinName(BuiltinFunction(function=_reversed_function, builtin=reversed)),
748
'sorted': BuiltinName(BuiltinFunction(function=_sorted_function, builtin=sorted)),
749
'super': BuiltinName(BuiltinFunction(function=_super_function, builtin=super)),
750
'property': BuiltinName(BuiltinFunction(function=_property_function, builtin=property)),
751
'zip': BuiltinName(BuiltinFunction(function=_zip_function, builtin=zip)),
752
'enumerate': BuiltinName(BuiltinFunction(function=_enumerate_function, builtin=enumerate)),
753
'object': BuiltinName(BuiltinObject()),
754
'type': BuiltinName(BuiltinType()),
755
'iter': BuiltinName(BuiltinFunction(function=_iter_function, builtin=iter)),
756
'raw_input': BuiltinName(BuiltinFunction(function=_input_function, builtin=raw_input)),
757
}
758
759
builtins = BuiltinModule('__builtin__', initial=_initial_builtins)
760
761