| Index: tools/json_schema_compiler/cpp_type_generator.py
|
| diff --git a/tools/json_schema_compiler/cpp_type_generator.py b/tools/json_schema_compiler/cpp_type_generator.py
|
| index 8a9960ea99df0c18e3269645cdd878289c920270..9383d35f90b5605540ece40504455a9c97d9b320 100644
|
| --- a/tools/json_schema_compiler/cpp_type_generator.py
|
| +++ b/tools/json_schema_compiler/cpp_type_generator.py
|
| @@ -4,10 +4,10 @@
|
|
|
| from code import Code
|
| from model import PropertyType
|
| +from operator import itemgetter
|
| import any_helper
|
| import cpp_util
|
| import schema_util
|
| -import string
|
|
|
| class CppTypeGenerator(object):
|
| """Manages the types of properties and provides utilities for getting the
|
| @@ -175,19 +175,27 @@ class CppTypeGenerator(object):
|
| self._root_namespace.
|
| """
|
| c = Code()
|
| - for namespace, types in sorted(self._NamespaceTypeDependencies().items()):
|
| + def NamespaceSortKey(namespace_types):
|
| + return namespace_types[0].name
|
| + for namespace, types in sorted(self._NamespaceTypeDependencies().items(),
|
| + key=NamespaceSortKey):
|
| c.Append('namespace %s {' % namespace.name)
|
| - for type_ in types:
|
| - type_name = schema_util.StripSchemaNamespace(type_)
|
| - if namespace.types[type_].type_ == PropertyType.STRING:
|
| - c.Append('typedef std::string %s;' % type_name)
|
| - elif namespace.types[type_].type_ == PropertyType.ARRAY:
|
| + def StripNamespaceFromType(type_name):
|
| + return (schema_util.StripSchemaNamespace(type_name),
|
| + namespace.types[type_name])
|
| + # Sort by stripped_type_name.
|
| + for stripped_type_name, type_json in sorted(
|
| + map(StripNamespaceFromType, types),
|
| + key=itemgetter(0)):
|
| + if type_json.type_ == PropertyType.STRING:
|
| + c.Append('typedef std::string %s;' % stripped_type_name)
|
| + elif type_json.type_ == PropertyType.ARRAY:
|
| c.Append('typedef std::vector<%(item_type)s> %(name)s;')
|
| - c.Substitute({'name': type_name, 'item_type':
|
| - self.GetType(namespace.types[type_].item_type,
|
| + c.Substitute({'name': stripped_type_name, 'item_type':
|
| + self.GetType(type_json.item_type,
|
| wrap_optional=True)})
|
| else:
|
| - c.Append('struct %s;' % type_name)
|
| + c.Append('struct %s;' % stripped_type_name)
|
| c.Append('}')
|
| c.Concat(self.GetNamespaceStart())
|
| for (name, type_) in self._namespace.types.items():
|
| @@ -200,10 +208,13 @@ class CppTypeGenerator(object):
|
| """Returns the #include lines for self._namespace.
|
| """
|
| c = Code()
|
| - for dependency in sorted(self._NamespaceTypeDependencies().keys()):
|
| - c.Append('#include "%s/%s.h"' % (
|
| + filenames = []
|
| + for dependency in self._NamespaceTypeDependencies().keys():
|
| + filenames.append('%s/%s.h' % (
|
| dependency.source_file_dir,
|
| self._cpp_namespaces[dependency]))
|
| + for filename in sorted(filenames):
|
| + c.Append('#include "%s"' % filename)
|
| return c
|
|
|
| def _ResolveTypeNamespace(self, ref_type):
|
|
|