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 |
not at google - send to devlin
2012/06/07 03:00:54
I think this would be easier to read like
def Sor
benjhayden
2012/06/08 16:41:52
Done.
|
+ 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( |
not at google - send to devlin
2012/06/07 03:00:54
this isn't json, it's a type. So call this type_
benjhayden
2012/06/08 16:41:52
That makes it difficult to see how it's used becau
|
+ map(StripNamespaceFromType, types), |
+ key=itemgetter(0)): |
not at google - send to devlin
2012/06/07 03:00:54
I've been starting at this code for like 20 minute
benjhayden
2012/06/08 16:41:52
I wanted to avoid running StripSchemaNamespace twi
|
+ 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, |
not at google - send to devlin
2012/06/07 03:00:54
mind fixing up this indentation while you're here?
benjhayden
2012/06/08 16:41:52
Done.
|
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): |