h_generator.py revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from code import Code 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from model import PropertyType 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import cpp_util 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import schema_util 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HGenerator(object): 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """A .h generator for a namespace. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def __init__(self, namespace, cpp_type_generator): 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cpp_type_generator = cpp_type_generator 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._namespace = namespace 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._target_namespace = ( 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cpp_type_generator.GetCppNamespaceName(self._namespace)) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def Generate(self): 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates a Code object with the .h for a single namespace. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append(cpp_util.CHROMIUM_LICENSE) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(cpp_util.GENERATED_FILE_MESSAGE % self._namespace.source_file) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ifndef_name = cpp_util.GenerateIfndefName(self._namespace.source_file_dir, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._target_namespace) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append('#ifndef %s' % ifndef_name) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#define %s' % ifndef_name) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include <string>') 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include <vector>') 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include "base/basictypes.h"') 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include "base/logging.h"') 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include "base/memory/linked_ptr.h"') 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include "base/memory/scoped_ptr.h"') 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include "base/values.h"') 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#include "tools/json_schema_compiler/any.h"') 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._cpp_type_generator.GetRootNamespaceStart()) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(calamity): These forward declarations should be #includes to allow 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # $ref types from other files to be used as required params. This requires 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # some detangling of windows and tabs which will currently lead to circular 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # #includes. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forward_declarations = ( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cpp_type_generator.GenerateForwardDeclarations()) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not forward_declarations.IsEmpty(): 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append() 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(forward_declarations) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._cpp_type_generator.GetNamespaceStart()) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append() 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self._namespace.properties: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append('//') 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('// Properties') 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('//') 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for property in self._namespace.properties.values(): 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) property_code = self._cpp_type_generator.GeneratePropertyValues( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) property, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'extern const %(type)s %(name)s;') 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if property_code: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(property_code).Append() 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self._namespace.types: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append('//') 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('// Types') 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('//') 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for type_ in self._FieldDependencyOrder(): 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Concat(self._GenerateType(type_)) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self._namespace.functions: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append('//') 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('// Functions') 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('//') 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for function in self._namespace.functions.values(): 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Concat(self._GenerateFunction(function)) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if self._namespace.events: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append('//') 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('// Events') 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('//') 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for event in self._namespace.events.values(): 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Concat(self._GenerateEvent(event)) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Concat(self._cpp_type_generator.GetNamespaceEnd()) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._cpp_type_generator.GetRootNamespaceEnd()) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('#endif // %s' % ifndef_name) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _FieldDependencyOrder(self): 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates the list of types in the current namespace in an order in which 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) depended-upon types appear before types which depend on them. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_order = [] 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def ExpandType(path, type_): 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_ in path: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise ValueError("Illegal circular dependency via cycle " + 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ", ".join(map(lambda x: x.name, path + [type_]))) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for prop in type_.properties.values(): 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prop.type_ == PropertyType.REF and 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_util.GetNamespace(prop.ref_type) == self._namespace.name): 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandType(path + [type_], self._namespace.types[prop.ref_type]) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not type_ in dependency_order: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_order.append(type_) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for type_ in self._namespace.types.values(): 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandType([], type_) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dependency_order 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateEnumDeclaration(self, enum_name, prop, values): 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generate the declaration of a C++ enum for the given property and 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Sblock('enum %s {' % enum_name) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append(self._cpp_type_generator.GetEnumNoneValue(prop) + ',') 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for value in values: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append(self._cpp_type_generator.GetEnumValue(prop, value) + ',') 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Eblock('};') 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateFields(self, props): 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates the field declarations when declaring a type. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Generate the enums needed for any fields with "choices" 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for prop in props: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if prop.type_ == PropertyType.CHOICES: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_name = self._cpp_type_generator.GetChoicesEnumType(prop) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('%s %s_type;' % (enum_name, prop.unix_name)) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append() 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for prop in self._cpp_type_generator.ExpandParams(props): 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if prop.description: 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Comment(prop.description) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append('%s %s;' % ( 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cpp_type_generator.GetCompiledType(prop, wrap_optional=True), 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop.unix_name)) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateType(self, type_): 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates a struct for a type. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classname = cpp_util.Classname(schema_util.StripSchemaNamespace(type_.name)) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.functions: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Sblock('namespace %(classname)s {') 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for function in type_.functions.values(): 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Concat(self._GenerateFunction(function)) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Eblock('}') 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif type_.type_ == PropertyType.ARRAY: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.description: 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Comment(type_.description) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('typedef std::vector<%(item_type)s> %(classname)s;') 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Substitute({'classname': classname, 'item_type': 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cpp_type_generator.GetCompiledType(type_.item_type, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wrap_optional=True)}) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif type_.type_ == PropertyType.STRING: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.description: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Comment(type_.description) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('typedef std::string %(classname)s;') 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif type_.type_ == PropertyType.ENUM: 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.description: 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Comment(type_.description) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Sblock('enum %(classname)s {') 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('%s,' % self._cpp_type_generator.GetEnumNoneValue(type_)) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for value in type_.enum_values: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('%s,' % self._cpp_type_generator.GetEnumValue(type_, value)) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Eblock('};') 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('scoped_ptr<base::Value> CreateEnumValue(%s %s);' % 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (classname, classname.lower())) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('std::string ToString(%s enum_param);' % classname) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('%s From%sString(const std::string& enum_string);' % 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (classname, classname)) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.description: 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Comment(type_.description) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Sblock('struct %(classname)s {') 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('~%(classname)s();') 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('%(classname)s();') 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GeneratePropertyStructures(type_.properties.values())) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GenerateFields(type_.properties.values())) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.from_json: 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Comment('Populates a %s object from a base::Value. Returns' 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ' whether |out| was successfully populated.' % classname) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('static bool Populate(const base::Value& value, ' 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '%(classname)s* out);') 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if type_.from_client: 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Comment('Returns a new base::DictionaryValue representing the' 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ' serialized form of this %s object. Passes ' 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'ownership to caller.' % classname) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('scoped_ptr<base::DictionaryValue> ToValue() const;') 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Eblock() 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Sblock(' private:') 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GeneratePrivatePropertyStructures( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_.properties.values())) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('DISALLOW_COPY_AND_ASSIGN(%(classname)s);') 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Eblock('};') 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Substitute({'classname': classname}) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateEvent(self, event): 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates the namespaces for an event. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Sblock('namespace %s {' % cpp_util.Classname(event.name)) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GenerateCreateCallbackArguments(event, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) generate_to_json=True)) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Eblock('};') 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateFunction(self, function): 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates the namespaces and structs for a function. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Sblock('namespace %s {' % cpp_util.Classname(function.name)) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GenerateFunctionParams(function)) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if function.callback: 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Concat(self._GenerateFunctionResults(function.callback)) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Eblock('};') 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateFunctionParams(self, function): 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates the struct for passing parameters from JSON to a function. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if function.params: 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Sblock('struct Params {') 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GeneratePropertyStructures(function.params)) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GenerateFields(function.params)) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('~Params();') 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('static scoped_ptr<Params> Create(' 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'const base::ListValue& args);') 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Eblock() 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Sblock(' private:') 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('Params();') 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append() 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append('DISALLOW_COPY_AND_ASSIGN(Params);') 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Eblock('};') 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GeneratePropertyStructures(self, props): 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generate the structures required by a property such as OBJECT classes 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) and enums. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for prop in props: 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if prop.type_ == PropertyType.OBJECT: 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GenerateType(prop)) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append() 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif prop.type_ == PropertyType.ARRAY: 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GeneratePropertyStructures([prop.item_type])) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append() 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif prop.type_ == PropertyType.CHOICES: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GenerateEnumDeclaration( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) self._cpp_type_generator.GetChoicesEnumType(prop), 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) [choice.type_.name for choice in prop.choices.values()])) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GeneratePropertyStructures(prop.choices.values())) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif prop.type_ == PropertyType.ENUM: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_name = self._cpp_type_generator.GetCompiledType(prop) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GenerateEnumDeclaration( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_name, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prop.enum_values)) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_enum_value = ('scoped_ptr<base::Value> CreateEnumValue(%s %s);' % 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (enum_name, prop.unix_name)) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_to_string = 'std::string ToString(%s enum_param);' % enum_name 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_from_string = ('%s From%sString(const std::string& enum_string);' % 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (enum_name, enum_name)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # If the property is from the UI then we're in a struct so this function 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # should be static. If it's from the client, then we're just in a 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # namespace so we can't have the static keyword. 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if prop.from_json: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) create_enum_value = 'static %s' % create_enum_value 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_to_string = 'static %s' % enum_to_string 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_from_string = 'static %s' % enum_from_string 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Append(create_enum_value) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(enum_to_string) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Append(enum_from_string)) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GeneratePrivatePropertyStructures(self, props): 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generate the private structures required by a property such as OBJECT 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) classes and enums. 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for prop in props: 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if prop.type_ == PropertyType.ARRAY: 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GeneratePrivatePropertyStructures([prop.item_type])) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append() 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif prop.type_ == PropertyType.CHOICES: 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # We only need GetChoiceValue() if there is a ToValue() method. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if prop.from_client: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('scoped_ptr<base::Value> Get%sChoiceValue() const;' % ( 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cpp_util.Classname(prop.name))) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateCreateCallbackArguments(self, function, generate_to_json=False): 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates functions for passing paramaters to a callback. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params = function.params 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Concat(self._GeneratePropertyStructures(params)) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param_lists = self._cpp_type_generator.GetAllPossibleParameterLists(params) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for param_list in param_lists: 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) declaration_list = [] 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for param in param_list: 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if param.description: 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Comment(param.description) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) declaration_list.append('const %s' % cpp_util.GetParameterDeclaration( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) param, self._cpp_type_generator.GetCompiledType(param))) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('scoped_ptr<base::ListValue> Create(%s);' % 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ', '.join(declaration_list)) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if generate_to_json: 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c.Append('std::string ToJson(%s);' % ', '.join(declaration_list)) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) def _GenerateFunctionResults(self, callback): 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Generates namespace for passing a function's result back. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = Code() 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (c.Sblock('namespace Results {') 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Concat(self._GenerateCreateCallbackArguments(callback)) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Eblock('};') 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return c 379