| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from code import Code | 5 from code import Code |
| 6 from model import PropertyType | 6 from model import PropertyType |
| 7 import cpp_util | 7 import cpp_util |
| 8 import model | |
| 9 import os | |
| 10 import schema_util | 8 import schema_util |
| 11 | 9 |
| 12 class HGenerator(object): | 10 class HGenerator(object): |
| 13 """A .h generator for a namespace. | 11 """A .h generator for a namespace. |
| 14 """ | 12 """ |
| 15 def __init__(self, namespace, cpp_type_generator): | 13 def __init__(self, namespace, cpp_type_generator): |
| 16 self._cpp_type_generator = cpp_type_generator | 14 self._cpp_type_generator = cpp_type_generator |
| 17 self._namespace = namespace | 15 self._namespace = namespace |
| 18 self._target_namespace = ( | 16 self._target_namespace = ( |
| 19 self._cpp_type_generator.GetCppNamespaceName(self._namespace)) | 17 self._cpp_type_generator.GetCppNamespaceName(self._namespace)) |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 """Generates the list of types in the current namespace in an order in which | 102 """Generates the list of types in the current namespace in an order in which |
| 105 depended-upon types appear before types which depend on them. | 103 depended-upon types appear before types which depend on them. |
| 106 """ | 104 """ |
| 107 dependency_order = [] | 105 dependency_order = [] |
| 108 | 106 |
| 109 def ExpandType(path, type_): | 107 def ExpandType(path, type_): |
| 110 if type_ in path: | 108 if type_ in path: |
| 111 raise ValueError("Illegal circular dependency via cycle " + | 109 raise ValueError("Illegal circular dependency via cycle " + |
| 112 ", ".join(map(lambda x: x.name, path + [type_]))) | 110 ", ".join(map(lambda x: x.name, path + [type_]))) |
| 113 for prop in type_.properties.values(): | 111 for prop in type_.properties.values(): |
| 114 if not prop.optional and prop.type_ == PropertyType.REF: | 112 if (prop.type_ == PropertyType.REF and |
| 113 schema_util.GetNamespace(prop.ref_type) == self._namespace.name): |
| 115 ExpandType(path + [type_], self._namespace.types[prop.ref_type]) | 114 ExpandType(path + [type_], self._namespace.types[prop.ref_type]) |
| 116 if not type_ in dependency_order: | 115 if not type_ in dependency_order: |
| 117 dependency_order.append(type_) | 116 dependency_order.append(type_) |
| 118 | 117 |
| 119 for type_ in self._namespace.types.values(): | 118 for type_ in self._namespace.types.values(): |
| 120 ExpandType([], type_) | 119 ExpandType([], type_) |
| 121 return dependency_order | 120 return dependency_order |
| 122 | 121 |
| 123 def _GenerateEnumDeclaration(self, enum_name, prop, values): | 122 def _GenerateEnumDeclaration(self, enum_name, prop, values): |
| 124 """Generate the declaration of a C++ enum for the given property and | 123 """Generate the declaration of a C++ enum for the given property and |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 if type_.description: | 170 if type_.description: |
| 172 c.Comment(type_.description) | 171 c.Comment(type_.description) |
| 173 c.Append('typedef std::vector<%(item_type)s> %(classname)s;') | 172 c.Append('typedef std::vector<%(item_type)s> %(classname)s;') |
| 174 c.Substitute({'classname': classname, 'item_type': | 173 c.Substitute({'classname': classname, 'item_type': |
| 175 self._cpp_type_generator.GetType(type_.item_type, | 174 self._cpp_type_generator.GetType(type_.item_type, |
| 176 wrap_optional=True)}) | 175 wrap_optional=True)}) |
| 177 elif type_.type_ == PropertyType.STRING: | 176 elif type_.type_ == PropertyType.STRING: |
| 178 if type_.description: | 177 if type_.description: |
| 179 c.Comment(type_.description) | 178 c.Comment(type_.description) |
| 180 c.Append('typedef std::string %(classname)s;') | 179 c.Append('typedef std::string %(classname)s;') |
| 181 c.Substitute({'classname': classname}) | |
| 182 else: | 180 else: |
| 183 if type_.description: | 181 if type_.description: |
| 184 c.Comment(type_.description) | 182 c.Comment(type_.description) |
| 185 (c.Sblock('struct %(classname)s {') | 183 (c.Sblock('struct %(classname)s {') |
| 186 .Append('~%(classname)s();') | 184 .Append('~%(classname)s();') |
| 187 .Append('%(classname)s();') | 185 .Append('%(classname)s();') |
| 188 .Append() | 186 .Append() |
| 189 .Concat(self._GeneratePropertyStructures(type_.properties.values())) | 187 .Concat(self._GeneratePropertyStructures(type_.properties.values())) |
| 190 .Concat(self._GenerateFields(type_.properties.values())) | 188 .Concat(self._GenerateFields(type_.properties.values())) |
| 191 ) | 189 ) |
| 192 if type_.from_json: | 190 if type_.from_json: |
| 193 (c.Comment('Populates a %s object from a Value. Returns' | 191 (c.Comment('Populates a %s object from a base::Value. Returns' |
| 194 ' whether |out| was successfully populated.' % classname) | 192 ' whether |out| was successfully populated.' % classname) |
| 195 .Append( | 193 .Append('static bool Populate(const base::Value& value, ' |
| 196 'static bool Populate(const Value& value, %(classname)s* out);') | 194 '%(classname)s* out);') |
| 197 .Append() | 195 .Append() |
| 198 ) | 196 ) |
| 199 | 197 |
| 200 if type_.from_client: | 198 if type_.from_client: |
| 201 (c.Comment('Returns a new DictionaryValue representing the' | 199 (c.Comment('Returns a new base::DictionaryValue representing the' |
| 202 ' serialized form of this %s object. Passes ' | 200 ' serialized form of this %s object. Passes ' |
| 203 'ownership to caller.' % classname) | 201 'ownership to caller.' % classname) |
| 204 .Append('scoped_ptr<DictionaryValue> ToValue() const;') | 202 .Append('scoped_ptr<base::DictionaryValue> ToValue() const;') |
| 205 ) | 203 ) |
| 206 | 204 |
| 207 (c.Eblock() | 205 (c.Eblock() |
| 208 .Sblock(' private:') | 206 .Sblock(' private:') |
| 209 .Append('DISALLOW_COPY_AND_ASSIGN(%(classname)s);') | 207 .Append('DISALLOW_COPY_AND_ASSIGN(%(classname)s);') |
| 210 .Eblock('};') | 208 .Eblock('};') |
| 211 ) | 209 ) |
| 212 c.Substitute({'classname': classname}) | 210 c.Substitute({'classname': classname}) |
| 213 return c | 211 return c |
| 214 | 212 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 232 """Generates the struct for passing parameters into a function. | 230 """Generates the struct for passing parameters into a function. |
| 233 """ | 231 """ |
| 234 c = Code() | 232 c = Code() |
| 235 | 233 |
| 236 if function.params: | 234 if function.params: |
| 237 (c.Sblock('struct Params {') | 235 (c.Sblock('struct Params {') |
| 238 .Concat(self._GeneratePropertyStructures(function.params)) | 236 .Concat(self._GeneratePropertyStructures(function.params)) |
| 239 .Concat(self._GenerateFields(function.params)) | 237 .Concat(self._GenerateFields(function.params)) |
| 240 .Append('~Params();') | 238 .Append('~Params();') |
| 241 .Append() | 239 .Append() |
| 242 .Append('static scoped_ptr<Params> Create(const ListValue& args);') | 240 .Append('static scoped_ptr<Params> Create(' |
| 241 'const base::ListValue& args);') |
| 243 .Eblock() | 242 .Eblock() |
| 244 .Sblock(' private:') | 243 .Sblock(' private:') |
| 245 .Append('Params();') | 244 .Append('Params();') |
| 246 .Append() | 245 .Append() |
| 247 .Append('DISALLOW_COPY_AND_ASSIGN(Params);') | 246 .Append('DISALLOW_COPY_AND_ASSIGN(Params);') |
| 248 .Eblock('};') | 247 .Eblock('};') |
| 249 ) | 248 ) |
| 250 | 249 |
| 251 return c | 250 return c |
| 252 | 251 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 267 self._cpp_type_generator.GetChoicesEnumType(prop), | 266 self._cpp_type_generator.GetChoicesEnumType(prop), |
| 268 prop, | 267 prop, |
| 269 [choice.type_.name for choice in prop.choices.values()])) | 268 [choice.type_.name for choice in prop.choices.values()])) |
| 270 c.Concat(self._GeneratePropertyStructures(prop.choices.values())) | 269 c.Concat(self._GeneratePropertyStructures(prop.choices.values())) |
| 271 elif prop.type_ == PropertyType.ENUM: | 270 elif prop.type_ == PropertyType.ENUM: |
| 272 enum_name = self._cpp_type_generator.GetType(prop) | 271 enum_name = self._cpp_type_generator.GetType(prop) |
| 273 c.Concat(self._GenerateEnumDeclaration( | 272 c.Concat(self._GenerateEnumDeclaration( |
| 274 enum_name, | 273 enum_name, |
| 275 prop, | 274 prop, |
| 276 prop.enum_values)) | 275 prop.enum_values)) |
| 277 c.Append('static scoped_ptr<Value> CreateEnumValue(%s %s);' % | 276 c.Append('static scoped_ptr<base::Value> CreateEnumValue(%s %s);' % |
| 278 (enum_name, prop.unix_name)) | 277 (enum_name, prop.unix_name)) |
| 279 return c | 278 return c |
| 280 | 279 |
| 281 def _GenerateFunctionResult(self, function): | 280 def _GenerateFunctionResult(self, function): |
| 282 """Generates functions for passing a function's result back. | 281 """Generates functions for passing a function's result back. |
| 283 """ | 282 """ |
| 284 c = Code() | 283 c = Code() |
| 285 | 284 |
| 286 c.Sblock('namespace Result {') | 285 c.Sblock('namespace Result {') |
| 287 params = function.callback.params | 286 params = function.callback.params |
| 288 if not params: | 287 if not params: |
| 289 c.Append('Value* Create();') | 288 c.Append('base::Value* Create();') |
| 290 else: | 289 else: |
| 291 c.Concat(self._GeneratePropertyStructures(params)) | 290 c.Concat(self._GeneratePropertyStructures(params)) |
| 292 | 291 |
| 293 # If there is a single parameter, this is straightforward. However, if | 292 # If there is a single parameter, this is straightforward. However, if |
| 294 # the callback parameter is of 'choices', this generates a Create method | 293 # the callback parameter is of 'choices', this generates a Create method |
| 295 # for each choice. This works because only 1 choice can be returned at a | 294 # for each choice. This works because only 1 choice can be returned at a |
| 296 # time. | 295 # time. |
| 297 for param in self._cpp_type_generator.GetExpandedChoicesInParams(params): | 296 for param in self._cpp_type_generator.GetExpandedChoicesInParams(params): |
| 298 if param.description: | 297 if param.description: |
| 299 c.Comment(param.description) | 298 c.Comment(param.description) |
| 300 if param.type_ == PropertyType.ANY: | 299 if param.type_ == PropertyType.ANY: |
| 301 c.Comment("Value* Result::Create(Value*) not generated " | 300 c.Comment("base::Value* Result::Create(base::Value*) not generated " |
| 302 "because it's redundant.") | 301 "because it's redundant.") |
| 303 continue | 302 continue |
| 304 c.Append('Value* Create(const %s);' % cpp_util.GetParameterDeclaration( | 303 c.Append('base::Value* Create(const %s);' % |
| 305 param, self._cpp_type_generator.GetType(param))) | 304 cpp_util.GetParameterDeclaration( |
| 305 param, self._cpp_type_generator.GetType(param))) |
| 306 c.Eblock('};') | 306 c.Eblock('};') |
| 307 | 307 |
| 308 return c | 308 return c |
| OLD | NEW |