1 """Parser for future statements
5 from compiler
import ast
, walk
8 """Return true if statement is a well-formed future statement"""
9 if not isinstance(stmt
, ast
.From
):
11 if stmt
.modname
== "__future__":
18 features
= ("nested_scopes", "generators", "division")
23 def visitModule(self
, node
):
26 if not self
.check_stmt(s
):
29 def check_stmt(self
, stmt
):
31 for name
, asname
in stmt
.names
:
32 if name
in self
.features
:
36 "future feature %s is not defined" % name
41 def get_features(self
):
42 """Return list of features enabled by future statements"""
43 return self
.found
.keys()
45 class BadFutureParser
:
46 """Check for invalid future statements"""
48 def visitFrom(self
, node
):
49 if hasattr(node
, 'valid_future'):
51 if node
.modname
!= "__future__":
53 raise SyntaxError, "invalid future statement"
55 def find_futures(node
):
57 p2
= BadFutureParser()
60 return p1
.get_features()
62 if __name__
== "__main__":
64 from compiler
import parseFile
, walk
66 for file in sys
.argv
[1:]:
68 tree
= parseFile(file)