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",)
23 def visitModule(self
, node
):
30 for s
in stmt
.nodes
[off
:]:
31 if not self
.check_stmt(s
):
34 def check_stmt(self
, stmt
):
36 for name
, asname
in stmt
.names
:
37 if name
in self
.features
:
41 "future feature %s is not defined" % name
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'):
56 if node
.modname
!= "__future__":
58 raise SyntaxError, "invalid future statement"
60 def find_futures(node
):
62 p2
= BadFutureParser()
65 return p1
.get_features()
67 if __name__
== "__main__":
69 from compiler
import parseFile
, walk
71 for file in sys
.argv
[1:]:
73 tree
= parseFile(file)