Chromium Code Reviews| 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..490c43bb8d14ea0f32a4102043070626d83c40e9 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.HierarchyOf(type_)) + | 
| + '\nCannot generate both functions and properties on a type') | 
| 
 
not at google - send to devlin
2012/03/01 07:09:37
ditto comment on \n.join
 
 | 
| + 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('};') |