Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: tools/json_schema_compiler/compiler.py

Issue 9774001: Remove dependence on .json files for IDL-specified extensions/apps APIs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add trailing newlines in generated files, and ran docs generation (changes are unrelated to my patc… Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 """Generator for C++ structs from api json files. 5 """Generator for C++ structs from api json files.
6 6
7 The purpose of this tool is to remove the need for hand-written code that 7 The purpose of this tool is to remove the need for hand-written code that
8 converts to and from base::Value types when receiving javascript api calls. 8 converts to and from base::Value types when receiving javascript api calls.
9 Originally written for generating code for extension apis. Reference schemas 9 Originally written for generating code for extension apis. Reference schemas
10 are in chrome/common/extensions/api. 10 are in chrome/common/extensions/api.
11 11
12 Usage example: 12 Usage example:
13 compiler.py --root /home/Work/src --namespace extensions windows.json 13 compiler.py --root /home/Work/src --namespace extensions windows.json
14 tabs.json 14 tabs.json
15 compiler.py --destdir gen --root /home/Work/src 15 compiler.py --destdir gen --root /home/Work/src
16 --namespace extensions windows.json tabs.json 16 --namespace extensions windows.json tabs.json
17 """ 17 """
18 18
19 import cc_generator 19 import cc_generator
20 import cpp_type_generator 20 import cpp_type_generator
21 import h_bundle_generator 21 import h_bundle_generator
22 import h_generator 22 import h_generator
23 import idl_schema 23 import idl_schema
24 import json_schema 24 import json_schema
25 import model 25 import model
26 import schema_bundle_generator
27
26 import optparse 28 import optparse
27 import os.path 29 import os.path
28 import sys 30 import sys
29 31
30 def load_schema(schema): 32 def load_schema(schema):
31 schema_filename, schema_extension = os.path.splitext(schema) 33 schema_filename, schema_extension = os.path.splitext(schema)
32 34
33 if schema_extension == '.json': 35 if schema_extension == '.json':
34 api_defs = json_schema.Load(schema) 36 api_defs = json_schema.Load(schema)
35 elif schema_extension == '.idl': 37 elif schema_extension == '.idl':
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 relpath = os.path.relpath(os.path.normpath(filenames[0]), root) 114 relpath = os.path.relpath(os.path.normpath(filenames[0]), root)
113 for target_namespace in api_defs: 115 for target_namespace in api_defs:
114 api_model.AddNamespace(target_namespace, relpath) 116 api_model.AddNamespace(target_namespace, relpath)
115 117
116 type_generator = cpp_type_generator.CppTypeGenerator(root_namespace) 118 type_generator = cpp_type_generator.CppTypeGenerator(root_namespace)
117 for referenced_namespace in api_model.namespaces.values(): 119 for referenced_namespace in api_model.namespaces.values():
118 type_generator.AddNamespace( 120 type_generator.AddNamespace(
119 referenced_namespace, 121 referenced_namespace,
120 referenced_namespace.unix_name) 122 referenced_namespace.unix_name)
121 123
122 generator = h_bundle_generator.HBundleGenerator(api_model, type_generator) 124 generator = schema_bundle_generator.SchemaBundleGenerator(
123 h_bundle_code = generator.Generate().Render() 125 api_model, api_defs, type_generator)
126 api_h_code = generator.GenerateAPIHeader().Render()
127 schemas_h_code = generator.GenerateSchemasHeader().Render()
128 schemas_cc_code = generator.GenerateSchemasCC().Render()
124 129
125 out_file = 'generated_api'
126 if dest_dir: 130 if dest_dir:
127 with open( 131 basedir = os.path.join(dest_dir, 'chrome/common/extensions/api')
128 os.path.join(dest_dir, 'chrome/common/extensions/api/generated_api.h'), 132 with open(os.path.join(basedir, 'generated_api.h'), 'w') as h_file:
129 'w') as h_file: 133 h_file.write(api_h_code)
130 h_file.write(h_bundle_code) 134 with open(os.path.join(basedir, 'generated_schemas.h'), 'w') as h_file:
135 h_file.write(schemas_h_code)
136 with open(os.path.join(basedir, 'generated_schemas.cc'), 'w') as cc_file:
137 cc_file.write(schemas_cc_code)
131 else: 138 else:
132 print '%s.h' % out_file 139 print 'generated_api.h'
133 print 140 print
134 print h_bundle_code 141 print api_h_code
142 print
143 print 'generated_schemas.h'
144 print
145 print schemas_h_code
146 print
147 print 'generated_schemas.cc'
148 print
149 print schemas_cc_code
135 150
136 if __name__ == '__main__': 151 if __name__ == '__main__':
137 parser = optparse.OptionParser( 152 parser = optparse.OptionParser(
138 description='Generates a C++ model of an API from JSON schema', 153 description='Generates a C++ model of an API from JSON schema',
139 usage='usage: %prog [option]... schema') 154 usage='usage: %prog [option]... schema')
140 parser.add_option('-r', '--root', default='.', 155 parser.add_option('-r', '--root', default='.',
141 help='logical include root directory. Path to schema files from specified' 156 help='logical include root directory. Path to schema files from specified'
142 'dir will be the include path.') 157 'dir will be the include path.')
143 parser.add_option('-d', '--destdir', 158 parser.add_option('-d', '--destdir',
144 help='root directory to output generated files.') 159 help='root directory to output generated files.')
145 parser.add_option('-n', '--namespace', default='generated_api_schemas', 160 parser.add_option('-n', '--namespace', default='generated_api_schemas',
146 help='C++ namespace for generated files. e.g extensions::api.') 161 help='C++ namespace for generated files. e.g extensions::api.')
147 parser.add_option('-b', '--bundle', action="store_true", help= 162 parser.add_option('-b', '--bundle', action="store_true", help=
148 '''if supplied, causes compiler to generate bundle files for the given set of 163 '''if supplied, causes compiler to generate bundle files for the given set of
149 source files.''') 164 source files.''')
150 165
151 (opts, args) = parser.parse_args() 166 (opts, args) = parser.parse_args()
152 167
153 if not args: 168 if not args:
154 sys.exit(0) # This is OK as a no-op 169 sys.exit(0) # This is OK as a no-op
155 dest_dir = opts.destdir 170 dest_dir = opts.destdir
156 root_namespace = opts.namespace 171 root_namespace = opts.namespace
157 172
158 if opts.bundle: 173 if opts.bundle:
159 handle_bundle_schema(args, dest_dir, opts.root, root_namespace) 174 handle_bundle_schema(args, dest_dir, opts.root, root_namespace)
160 else: 175 else:
161 handle_single_schema(args[0], dest_dir, opts.root, root_namespace) 176 handle_single_schema(args[0], dest_dir, opts.root, root_namespace)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698