Apparently the code to forestall Tk eating events was too aggressive (Tk user input...
[python/dscho.git] / Tools / compiler / compiler / future.py
blobfe25b72a2e87c4cabb86af73664209f47329f2e7
1 """Parser for future statements
3 """
5 from compiler import ast, walk
7 def is_future(stmt):
8 """Return true if statement is a well-formed future statement"""
9 if not isinstance(stmt, ast.From):
10 return 0
11 if stmt.modname == "__future__":
12 return 1
13 else:
14 return 0
16 class FutureParser:
18 features = ("nested_scopes",)
20 def __init__(self):
21 self.found = {} # set
23 def visitModule(self, node):
24 if node.doc is None:
25 off = 0
26 else:
27 off = 1
29 stmt = node.node
30 for s in stmt.nodes[off:]:
31 if not self.check_stmt(s):
32 break
34 def check_stmt(self, stmt):
35 if is_future(stmt):
36 for name, asname in stmt.names:
37 if name in self.features:
38 self.found[name] = 1
39 else:
40 raise SyntaxError, \
41 "future feature %s is not defined" % name
42 stmt.valid_future = 1
43 return 1
44 return 0
46 def get_features(self):
47 """Return list of features enabled by future statements"""
48 return self.found.keys()
50 class BadFutureParser:
51 """Check for invalid future statements"""
53 def visitFrom(self, node):
54 if hasattr(node, 'valid_future'):
55 return
56 if node.modname != "__future__":
57 return
58 raise SyntaxError, "invalid future statement"
60 def find_futures(node):
61 p1 = FutureParser()
62 p2 = BadFutureParser()
63 walk(node, p1)
64 walk(node, p2)
65 return p1.get_features()
67 if __name__ == "__main__":
68 import sys
69 from compiler import parseFile, walk
71 for file in sys.argv[1:]:
72 print file
73 tree = parseFile(file)
74 v = FutureParser()
75 walk(tree, v)
76 print v.found
77 print