Chromium Code Reviews| Index: tools/json_schema_compiler/compiler.py |
| diff --git a/tools/json_schema_compiler/compiler.py b/tools/json_schema_compiler/compiler.py |
| index cac08eea2cca83b1d364716245b1feb084c749d6..f51bcc0f1735081af43818642072c3f496b36dcf 100755 |
| --- a/tools/json_schema_compiler/compiler.py |
| +++ b/tools/json_schema_compiler/compiler.py |
| @@ -48,6 +48,33 @@ def _LoadSchema(schema): |
| return api_defs |
| +class TypeNamespaceResolver(object): |
|
not at google - send to devlin
2013/03/22 22:10:12
pull into separate file?
cduvall
2013/03/22 22:52:29
Done.
|
| + '''Resolves a type name into the namespace the type belongs to. |
| + ''' |
| + def __init__(self, api_path): |
| + self._api_path = api_path |
| + |
| + def Resolve(self, full_name, default_namespace): |
| + name_parts = full_name.rsplit('.', 1) |
| + if len(name_parts) == 1: |
| + if full_name not in default_namespace.types: |
| + return None |
|
not at google - send to devlin
2013/03/22 22:10:12
can this be an assertion?
cduvall
2013/03/22 22:52:29
Still returning None, to be handled in CppTypeGene
|
| + return default_namespace |
| + namespace_name, type_name = name_parts |
| + json_name = '%s.json' % namespace_name |
| + idl_name = '%s.idl' % namespace_name |
| + if os.path.exists(json_name): |
| + real_name = json_name |
| + elif os.path.exists(idl_name): |
| + real_name = idl_name |
| + else: |
| + return None |
|
not at google - send to devlin
2013/03/22 22:10:12
I think a structure like
real_name = None
for ext
cduvall
2013/03/22 22:52:29
Done.
|
| + namespace = Model().AddNamespace(_LoadSchema(real_name)[0], |
| + os.path.join(self._api_path, real_name)) |
| + if type_name not in namespace.types: |
| + return None |
|
not at google - send to devlin
2013/03/22 22:10:12
can this be an assertion?
cduvall
2013/03/22 22:52:29
Same as above.
|
| + return namespace |
| + |
| def GenerateSchema(generator, |
| filenames, |
| root, |
| @@ -68,33 +95,8 @@ def GenerateSchema(generator, |
| api_defs.extend(api_def) |
| api_model = Model() |
| - |
| - # Load type dependencies into the model. |
| - # |
| - # HACK(kalman): bundle mode doesn't work with dependencies, because not all |
| - # schemas work in bundle mode. |
| - # |
| - # TODO(kalman): load dependencies lazily (get rid of the 'dependencies' list) |
| - # and this problem will go away. |
| - if generator != 'cpp-bundle': |
| - for target_namespace in api_defs: |
| - for referenced_schema in target_namespace.get('dependencies', []): |
| - split_schema = referenced_schema.split(':', 1) |
| - if len(split_schema) > 1: |
| - if split_schema[0] != 'api': |
| - continue |
| - else: |
| - referenced_schema = split_schema[1] |
| - |
| - referenced_schema_path = os.path.join( |
| - os.path.dirname(schema), '%s.json' % UnixName(referenced_schema)) |
| - referenced_api_defs = json_schema.Load(referenced_schema_path) |
| - |
| - for namespace in referenced_api_defs: |
| - api_model.AddNamespace( |
| - namespace, |
| - os.path.relpath(referenced_schema_path, root), |
| - include_compiler_options=True) |
| + type_namespace_resolver = TypeNamespaceResolver( |
| + os.path.dirname(os.path.relpath(schema, root))) |
| # For single-schema compilation make sure that the first (i.e. only) schema |
| # is the default one. |
| @@ -125,6 +127,7 @@ def GenerateSchema(generator, |
| # Construct the type generator with all the namespaces in this model. |
| type_generator = CppTypeGenerator(api_model, |
| + type_namespace_resolver, |
| default_namespace=default_namespace) |
| if generator == 'cpp-bundle': |