1 | #!/usr/bin/env python2
|
2 | """Option_gen.py."""
|
3 | from __future__ import print_function
|
4 |
|
5 | import sys
|
6 |
|
7 | from asdl import ast
|
8 | from frontend import builtin_def
|
9 | from frontend import option_def
|
10 |
|
11 |
|
12 | def _CreateSum(sum_name, variant_names):
|
13 | """Similar to frontend/id_kind_gen.py Usage of SYNTHETIC ASDL module:
|
14 |
|
15 | C++:
|
16 |
|
17 | using option_asdl::opt_num
|
18 | opt_num::nounset
|
19 |
|
20 | Python:
|
21 | from _devbuild.gen.option_asdl import opt_num
|
22 | opt_num.nounset
|
23 | """
|
24 | sum_ = ast.SimpleSum([ast.Constructor(name) for name in variant_names],
|
25 | generate=['integers'])
|
26 | typ = ast.TypeDecl(sum_name, sum_)
|
27 | return typ
|
28 |
|
29 |
|
30 | def main(argv):
|
31 | try:
|
32 | action = argv[1]
|
33 | except IndexError:
|
34 | raise RuntimeError('Action required')
|
35 |
|
36 | # generate builtin::echo, etc.
|
37 | # This relies on the assigned option numbers matching ASDL's numbering!
|
38 | # TODO: Allow controlling the integer values in ASDL enums?
|
39 |
|
40 | option = _CreateSum('option', [opt.name for opt in option_def.All()])
|
41 | builtin = _CreateSum('builtin', [b.enum_name for b in builtin_def.All()])
|
42 | # TODO: could shrink array later.
|
43 | # [opt.name for opt in option_def.All() if opt.implemented])
|
44 |
|
45 | schema_ast = ast.Module('option', [], [option, builtin])
|
46 |
|
47 | if action == 'cpp':
|
48 | from asdl import gen_cpp
|
49 |
|
50 | out_prefix = argv[2]
|
51 |
|
52 | with open(out_prefix + '.h', 'w') as f:
|
53 | f.write("""\
|
54 | #ifndef OPTION_ASDL_H
|
55 | #define OPTION_ASDL_H
|
56 |
|
57 | namespace option_asdl {
|
58 |
|
59 | #define ASDL_NAMES struct
|
60 | """)
|
61 |
|
62 | # Don't need option_str()
|
63 | v = gen_cpp.ClassDefVisitor(f, pretty_print_methods=False)
|
64 | v.VisitModule(schema_ast)
|
65 |
|
66 | f.write("""
|
67 | } // namespace option_asdl
|
68 |
|
69 | #endif // OPTION_ASDL_H
|
70 | """)
|
71 |
|
72 | elif action == 'mypy':
|
73 | from asdl import gen_python
|
74 |
|
75 | f = sys.stdout
|
76 |
|
77 | f.write("""\
|
78 | from asdl import pybase
|
79 |
|
80 | """)
|
81 | # option_i type
|
82 | v = gen_python.GenMyPyVisitor(f, None)
|
83 | v.VisitModule(schema_ast)
|
84 |
|
85 | else:
|
86 | raise RuntimeError('Invalid action %r' % action)
|
87 |
|
88 |
|
89 | if __name__ == '__main__':
|
90 | try:
|
91 | main(sys.argv)
|
92 | except RuntimeError as e:
|
93 | print('FATAL: %s' % e, file=sys.stderr)
|
94 | sys.exit(1)
|