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/ast.py
1415 views
1
import _ast
2
from _ast import *
3
4
from rope.base import fscommands
5
6
7
def parse(source, filename='<string>'):
8
# NOTE: the raw string should be given to `compile` function
9
if isinstance(source, unicode):
10
source = fscommands.unicode_to_file_data(source)
11
if '\r' in source:
12
source = source.replace('\r\n', '\n').replace('\r', '\n')
13
if not source.endswith('\n'):
14
source += '\n'
15
try:
16
return compile(source, filename, 'exec', _ast.PyCF_ONLY_AST)
17
except (TypeError, ValueError), e:
18
error = SyntaxError()
19
error.lineno = 1
20
error.filename = filename
21
error.msg = str(e)
22
raise error
23
24
25
def walk(node, walker):
26
"""Walk the syntax tree"""
27
method_name = '_' + node.__class__.__name__
28
method = getattr(walker, method_name, None)
29
if method is not None:
30
return method(node)
31
for child in get_child_nodes(node):
32
walk(child, walker)
33
34
35
def get_child_nodes(node):
36
if isinstance(node, _ast.Module):
37
return node.body
38
result = []
39
if node._fields is not None:
40
for name in node._fields:
41
child = getattr(node, name)
42
if isinstance(child, list):
43
for entry in child:
44
if isinstance(entry, _ast.AST):
45
result.append(entry)
46
if isinstance(child, _ast.AST):
47
result.append(child)
48
return result
49
50
51
def call_for_nodes(node, callback, recursive=False):
52
"""If callback returns `True` the child nodes are skipped"""
53
result = callback(node)
54
if recursive and not result:
55
for child in get_child_nodes(node):
56
call_for_nodes(child, callback, recursive)
57
58
59
def get_children(node):
60
result = []
61
if node._fields is not None:
62
for name in node._fields:
63
if name in ['lineno', 'col_offset']:
64
continue
65
child = getattr(node, name)
66
result.append(child)
67
return result
68
69