BOOL_ARG_TYPES = {} # type: Dict[int, bool_arg_type_t] # Used by builtin_bracket.py TEST_UNARY_LOOKUP = {} # type: Dict[str, int] TEST_BINARY_LOOKUP = {} # type: Dict[str, int] TEST_OTHER_LOOKUP = {} # type: Dict[str, int] # # Add attributes to Id and Kind # ID_SPEC = id_kind.IdSpec(_ID_TO_KIND_INTEGERS, BOOL_ARG_TYPES) id_kind.AddKinds(ID_SPEC) id_kind.AddBoolKinds(ID_SPEC) # must come second id_kind.SetupTestBuiltin(ID_SPEC, TEST_UNARY_LOOKUP, TEST_BINARY_LOOKUP, TEST_OTHER_LOOKUP) # Debug _kind_sizes = ID_SPEC.kind_sizes # # Instantiate osh/osh.asdl # from _devbuild.gen import syntax_asdl # other modules import this unused1 = syntax_asdl # shut up lint
def main(argv): try: action = argv[1] except IndexError: raise RuntimeError('Action required') # NOTE: This initialization must be identical to the one in core/meta.py. We # do it here to avoid circular dependencies. ID_SPEC = id_kind.IdSpec({}, {}) id_kind.AddKinds(ID_SPEC) id_kind.AddBoolKinds(ID_SPEC) # must come second id_kind.SetupTestBuiltin(ID_SPEC, {}, {}, {}) ids = ID_SPEC.id_str2int.items() ids.sort(key=lambda pair: pair[1]) # Sort by ID if action == 'c': for name, id_int in ids: print('#define id__%s %s' % (name, id_int)) elif action == 'cpp': from asdl import gen_cpp schema_ast = _CreateModule(ID_SPEC, ids) out_prefix = argv[2] with open(out_prefix + '.h', 'w') as f: f.write(""" #ifndef ID_KIND_ASDL_H #define ID_KIND_ASDL_H namespace id_kind_asdl { """) v = gen_cpp.ClassDefVisitor(f, {}, e_suffix=False) v.VisitModule(schema_ast) f.write(""" } // namespace id_kind_asdl #endif // ID_KIND_ASDL_H """) with open(out_prefix + '.cc', 'w') as f: f.write("""\ #include <assert.h> #include "id_kind_asdl.h" namespace id_kind_asdl { """) v = gen_cpp.MethodDefVisitor(f, {}, e_suffix=False) v.VisitModule(schema_ast) f.write('} // namespace id_kind_asdl\n') elif action == 'mypy': from asdl import gen_python schema_ast = _CreateModule(ID_SPEC, ids) #print(schema_ast) f = sys.stdout f.write("""\ from asdl import pybase from typing import List """) # Minor style issue: we want Id and Kind, not Id_e and Kind_e v = gen_python.GenMyPyVisitor(f, None, e_suffix=False) v.VisitModule(schema_ast) f.write(""" ID_INSTANCES = [ None, # unused index 0 """) for name, _ in ids: f.write(' Id.%s,\n' % name) f.write('] # type: List[Id_t]\n') f.write(""" KIND_INSTANCES = [ None, # unused index 0 """) for name in ID_SPEC.kind_name_list: f.write(' Kind.%s,\n' % name) f.write('] # type: List[Kind_t]\n') else: raise RuntimeError('Invalid action %r' % action)