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",
19 "absolute_import", "with_statement")
24 def visitModule(self
, node
):
27 if not self
.check_stmt(s
):
30 def check_stmt(self
, stmt
):
32 for name
, asname
in stmt
.names
:
33 if name
in self
.features
:
37 "future feature %s is not defined" % name
42 def get_features(self
):
43 """Return list of features enabled by future statements"""
44 return self
.found
.keys()
46 class BadFutureParser
:
47 """Check for invalid future statements"""
49 def visitFrom(self
, node
):
50 if hasattr(node
, 'valid_future'):
52 if node
.modname
!= "__future__":
54 raise SyntaxError, "invalid future statement " + repr(node
)
56 def find_futures(node
):
58 p2
= BadFutureParser()
61 return p1
.get_features()
63 if __name__
== "__main__":
65 from compiler
import parseFile
, walk
67 for file in sys
.argv
[1:]:
69 tree
= parseFile(file)