| Index: tools/json_schema_compiler/h_generator.py | 
| diff --git a/tools/json_schema_compiler/h_generator.py b/tools/json_schema_compiler/h_generator.py | 
| index 3af7ccf3c1eba6f723653f75896fba339c6ba81f..3c97bc62ef68688162ec1756a4b0bed3a6969471 100644 | 
| --- a/tools/json_schema_compiler/h_generator.py | 
| +++ b/tools/json_schema_compiler/h_generator.py | 
| @@ -5,6 +5,7 @@ | 
| from model import PropertyType | 
| import code | 
| import cpp_util | 
| +import model | 
| import os | 
|  | 
| class HGenerator(object): | 
| @@ -38,6 +39,7 @@ class HGenerator(object): | 
| .Append('#include "base/memory/linked_ptr.h"') | 
| .Append('#include "base/memory/scoped_ptr.h"') | 
| .Append('#include "base/values.h"') | 
| +      .Append('#include "tools/json_schema_compiler/any.h"') | 
| .Append() | 
| ) | 
|  | 
| @@ -76,8 +78,7 @@ class HGenerator(object): | 
| (c.Concat(self._GenerateFunction(function)) | 
| .Append() | 
| ) | 
| -    (c.Append() | 
| -      .Concat(self._cpp_type_generator.GetNamespaceEnd()) | 
| +    (c.Concat(self._cpp_type_generator.GetNamespaceEnd()) | 
| .Concat(self._cpp_type_generator.GetRootNamespaceEnd()) | 
| .Append() | 
| .Append('#endif  // %s' % ifndef_name) | 
| @@ -109,6 +110,7 @@ class HGenerator(object): | 
| if prop.type_ == PropertyType.CHOICES: | 
| enum_name = self._cpp_type_generator.GetChoicesEnumType(prop) | 
| c.Append('%s %s_type;' % (enum_name, prop.unix_name)) | 
| +        c.Append() | 
| for prop in self._cpp_type_generator.GetExpandedChoicesInParams(props): | 
| if prop.description: | 
| c.Comment(prop.description) | 
| @@ -123,33 +125,50 @@ class HGenerator(object): | 
| """ | 
| classname = cpp_util.Classname(type_.name) | 
| c = code.Code() | 
| -    if type_.description: | 
| -      c.Comment(type_.description) | 
| -    (c.Sblock('struct %(classname)s {') | 
| -        .Append('~%(classname)s();') | 
| -        .Append('%(classname)s();') | 
| -        .Append() | 
| -        .Concat(self._GeneratePropertyStructures(type_.properties.values())) | 
| -        .Concat(self._GenerateFields(type_.properties.values())) | 
| -    ) | 
| -    if type_.from_json: | 
| -      (c.Comment('Populates a %s object from a Value. Returns' | 
| -                 ' whether |out| was successfully populated.' % classname) | 
| -        .Append('static bool Populate(const Value& value, %(classname)s* out);') | 
| -        .Append() | 
| + | 
| +    if type_.functions: | 
| +      # Types with functions are not instantiable in C++ because they are | 
| +      # handled in pure Javascript and hence have no properties or | 
| +      # additionalProperties. | 
| +      if type_.properties: | 
| +        raise NotImplementedError('\n'.join(model.GetModelHierarchy(type_)) + | 
| +            '\nCannot generate both functions and properties on a type') | 
| +      c.Sblock('namespace %(classname)s {') | 
| +      for function in type_.functions.values(): | 
| +        (c.Concat(self._GenerateFunction(function)) | 
| +          .Append() | 
| +        ) | 
| +      c.Eblock('}') | 
| +    else: | 
| +      if type_.description: | 
| +        c.Comment(type_.description) | 
| +      (c.Sblock('struct %(classname)s {') | 
| +          .Append('~%(classname)s();') | 
| +          .Append('%(classname)s();') | 
| +          .Append() | 
| +          .Concat(self._GeneratePropertyStructures(type_.properties.values())) | 
| +          .Concat(self._GenerateFields(type_.properties.values())) | 
| ) | 
| +      if type_.from_json: | 
| +        (c.Comment('Populates a %s object from a Value. Returns' | 
| +                   ' whether |out| was successfully populated.' % classname) | 
| +          .Append( | 
| +              'static bool Populate(const Value& value, %(classname)s* out);') | 
| +          .Append() | 
| +        ) | 
| + | 
| +      if type_.from_client: | 
| +        (c.Comment('Returns a new DictionaryValue representing the' | 
| +                   ' serialized form of this %s object. Passes ' | 
| +                   'ownership to caller.' % classname) | 
| +          .Append('scoped_ptr<DictionaryValue> ToValue() const;') | 
| +        ) | 
|  | 
| -    if type_.from_client: | 
| -      (c.Comment('Returns a new DictionaryValue representing the' | 
| -                 ' serialized form of this %s object. Passes ' | 
| -                 'ownership to caller.' % classname) | 
| -        .Append('scoped_ptr<DictionaryValue> ToValue() const;') | 
| +      (c.Eblock() | 
| +        .Sblock(' private:') | 
| +          .Append('DISALLOW_COPY_AND_ASSIGN(%(classname)s);') | 
| +        .Eblock('};') | 
| ) | 
| -    (c.Eblock() | 
| -      .Sblock(' private:') | 
| -        .Append('DISALLOW_COPY_AND_ASSIGN(%(classname)s);') | 
| -      .Eblock('};') | 
| -    ) | 
| c.Substitute({'classname': classname}) | 
| return c | 
|  | 
| @@ -205,6 +224,7 @@ class HGenerator(object): | 
| self._cpp_type_generator.GetChoicesEnumType(prop), | 
| prop, | 
| [choice.type_.name for choice in prop.choices.values()])) | 
| +        c.Concat(self._GeneratePropertyStructures(prop.choices.values())) | 
| elif prop.type_ == PropertyType.ENUM: | 
| enum_name = self._cpp_type_generator.GetType(prop) | 
| c.Concat(self._GenerateEnumDeclaration( | 
| @@ -234,6 +254,10 @@ class HGenerator(object): | 
| for param in self._cpp_type_generator.GetExpandedChoicesInParams(params): | 
| if param.description: | 
| c.Comment(param.description) | 
| +        if param.type_ == PropertyType.ANY: | 
| +          c.Comment("Value* Result::Create(Value*) not generated " | 
| +                    "because it's redundant.") | 
| +          continue | 
| c.Append('Value* Create(const %s);' % cpp_util.GetParameterDeclaration( | 
| param, self._cpp_type_generator.GetType(param))) | 
| c.Eblock('};') | 
|  |