| 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 f15bae86e468a4444367f18ee18b9ed26cde7643..c9c52fbfe713083570b1f360fbdde244cd77b070 100644 | 
| --- a/tools/json_schema_compiler/cpp_type_generator.py | 
| +++ b/tools/json_schema_compiler/cpp_type_generator.py | 
| @@ -25,67 +25,43 @@ class CppTypeGenerator(object): | 
| """Manages the types of properties and provides utilities for getting the | 
| C++ type out of a model.Property | 
| """ | 
| -  def __init__(self, root_namespace, namespace=None, cpp_namespace=None): | 
| +  def __init__(self, model, default_namespace=None): | 
| """Creates a cpp_type_generator. The given root_namespace should be of the | 
| format extensions::api::sub. The generator will generate code suitable for | 
| -    use in the given namespace. | 
| +    use in the given model's namespace. | 
| """ | 
| self._type_namespaces = {} | 
| -    self._root_namespace = root_namespace.split('::') | 
| -    self._cpp_namespaces = {} | 
| -    if namespace and cpp_namespace: | 
| -      self._namespace = namespace | 
| -      self.AddNamespace(namespace, cpp_namespace) | 
| -    else: | 
| -      self._namespace = None | 
| - | 
| -  def AddNamespace(self, namespace, cpp_namespace): | 
| -    """Maps a model.Namespace to its C++ namespace name. All mappings are | 
| -    beneath the root namespace. | 
| -    """ | 
| -    self._cpp_namespaces[namespace] = cpp_namespace | 
| -    for type_name in namespace.types: | 
| -      # Allow $refs to refer to just 'Type' within namespaces. Otherwise they | 
| -      # must be qualified with 'namespace.Type'. | 
| -      type_aliases = ['%s.%s' % (namespace.name, type_name)] | 
| -      if namespace is self._namespace: | 
| -        type_aliases.append(type_name) | 
| -      for alias in type_aliases: | 
| -        self._type_namespaces[alias] = namespace | 
| +    self._default_namespace = default_namespace | 
| + | 
| +    for referenced_namespace in model.namespaces.values(): | 
| +      if self._default_namespace is None: | 
| +        self._default_namespace = referenced_namespace | 
| +      for type_name in referenced_namespace.types: | 
| +        # Allow $refs to refer to just 'Type' within referenced_namespaces. | 
| +        # Otherwise they must be qualified with 'namespace.Type'. | 
| +        type_aliases = ['%s.%s' % (referenced_namespace.name, type_name)] | 
| +        if referenced_namespace is self._default_namespace: | 
| +          type_aliases.append(type_name) | 
| +        for alias in type_aliases: | 
| +          self._type_namespaces[alias] = referenced_namespace | 
|  | 
| def GetCppNamespaceName(self, namespace): | 
| """Gets the mapped C++ namespace name for the given namespace relative to | 
| the root namespace. | 
| """ | 
| -    return self._cpp_namespaces[namespace] | 
| - | 
| -  def GetRootNamespaceStart(self): | 
| -    """Get opening root namespace declarations. | 
| -    """ | 
| -    c = Code() | 
| -    for namespace in self._root_namespace: | 
| -      c.Append('namespace %s {' % namespace) | 
| -    return c | 
| - | 
| -  def GetRootNamespaceEnd(self): | 
| -    """Get closing root namespace declarations. | 
| -    """ | 
| -    c = Code() | 
| -    for namespace in reversed(self._root_namespace): | 
| -      c.Append('}  // %s' % namespace) | 
| -    return c | 
| +    return namespace.unix_name | 
|  | 
| def GetNamespaceStart(self): | 
| -    """Get opening self._namespace namespace declaration. | 
| +    """Get opening self._default_namespace namespace declaration. | 
| """ | 
| return Code().Append('namespace %s {' % | 
| -        self.GetCppNamespaceName(self._namespace)) | 
| +        self.GetCppNamespaceName(self._default_namespace)) | 
|  | 
| def GetNamespaceEnd(self): | 
| -    """Get closing self._namespace namespace declaration. | 
| +    """Get closing self._default_namespace namespace declaration. | 
| """ | 
| return Code().Append('}  // %s' % | 
| -        self.GetCppNamespaceName(self._namespace)) | 
| +        self.GetCppNamespaceName(self._default_namespace)) | 
|  | 
| def GetEnumNoneValue(self, type_): | 
| """Gets the enum value in the given model.Property indicating no value has | 
| @@ -118,7 +94,7 @@ class CppTypeGenerator(object): | 
| ref_type = self._FindType(type_.ref_type) | 
| if ref_type is None: | 
| raise KeyError('Cannot find referenced type: %s' % type_.ref_type) | 
| -      if self._namespace is ref_type.namespace: | 
| +      if self._default_namespace is ref_type.namespace: | 
| cpp_type = ref_type.name | 
| else: | 
| cpp_type = '%s::%s' % (ref_type.namespace.name, ref_type.name) | 
| @@ -170,10 +146,7 @@ class CppTypeGenerator(object): | 
| PropertyType.CHOICES)) | 
|  | 
| def GenerateForwardDeclarations(self): | 
| -    """Returns the forward declarations for self._namespace. | 
| - | 
| -    Use after GetRootNamespaceStart. Assumes all namespaces are relative to | 
| -    self._root_namespace. | 
| +    """Returns the forward declarations for self._default_namespace. | 
| """ | 
| c = Code() | 
|  | 
| @@ -191,7 +164,7 @@ class CppTypeGenerator(object): | 
| return c | 
|  | 
| def GenerateIncludes(self, include_soft=False): | 
| -    """Returns the #include lines for self._namespace. | 
| +    """Returns the #include lines for self._default_namespace. | 
| """ | 
| c = Code() | 
| for namespace, dependencies in self._NamespaceTypeDependencies().items(): | 
| @@ -203,7 +176,7 @@ class CppTypeGenerator(object): | 
|  | 
| def _FindType(self, full_name): | 
| """Finds the model.Type with name |qualified_name|. If it's not from | 
| -    |self._namespace| then it needs to be qualified. | 
| +    |self._default_namespace| then it needs to be qualified. | 
| """ | 
| namespace = self._type_namespaces.get(full_name, None) | 
| if namespace is None: | 
| @@ -223,11 +196,11 @@ class CppTypeGenerator(object): | 
|  | 
| def _NamespaceTypeDependencies(self): | 
| """Returns a dict ordered by namespace name containing a mapping of | 
| -    model.Namespace to every _TypeDependency for |self._namespace|, sorted | 
| -    by the type's name. | 
| +    model.Namespace to every _TypeDependency for |self._default_namespace|, | 
| +    sorted by the type's name. | 
| """ | 
| dependencies = set() | 
| -    for function in self._namespace.functions.values(): | 
| +    for function in self._default_namespace.functions.values(): | 
| for param in function.params: | 
| dependencies |= self._TypeDependencies(param.type_, | 
| hard=not param.optional) | 
| @@ -235,11 +208,11 @@ class CppTypeGenerator(object): | 
| for param in function.callback.params: | 
| dependencies |= self._TypeDependencies(param.type_, | 
| hard=not param.optional) | 
| -    for type_ in self._namespace.types.values(): | 
| +    for type_ in self._default_namespace.types.values(): | 
| for prop in type_.properties.values(): | 
| dependencies |= self._TypeDependencies(prop.type_, | 
| hard=not prop.optional) | 
| -    for event in self._namespace.events.values(): | 
| +    for event in self._default_namespace.events.values(): | 
| for param in event.params: | 
| dependencies |= self._TypeDependencies(param.type_, | 
| hard=not param.optional) | 
| @@ -248,7 +221,7 @@ class CppTypeGenerator(object): | 
| dependency_namespaces = OrderedDict() | 
| for dependency in sorted(dependencies, key=_TypeDependency.GetSortKey): | 
| namespace = dependency.type_.namespace | 
| -      if namespace is self._namespace: | 
| +      if namespace is self._default_namespace: | 
| continue | 
| if namespace not in dependency_namespaces: | 
| dependency_namespaces[namespace] = [] | 
|  |