Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 from model import PropertyType | |
| 6 import code | |
| 7 import cpp_type_manager | |
| 8 import cpp_util | |
| 9 | |
| 10 class HGenerator(object): | |
| 11 """A .h generator for a namespace. | |
| 12 """ | |
| 13 def __init__(self, namespace, model): | |
| 14 self.__cpp_type_manager = cpp_type_manager.CppTypeManager(namespace, model) | |
| 15 self.__namespace = namespace | |
| 16 | |
| 17 def generate(self): | |
| 18 """Generates a code.Code object with the .h for a single namespace. | |
| 19 """ | |
| 20 include_path = self.__namespace.parent_dir | |
| 21 filename = self.__namespace.filename | |
| 22 c = code.Code() | |
| 23 (c.append(cpp_util.CHROMIUM_LICENSE).append() | |
| 24 .append(cpp_util.GENERATED_FILE_MESSAGE % self.__namespace.parent_path) | |
| 25 .append() | |
| 26 ) | |
| 27 | |
| 28 ifndef_name = generate_ifndef_name(include_path, filename) | |
| 29 (c.append('#ifndef %s' % ifndef_name) | |
| 30 .append('#define %s' % ifndef_name) | |
| 31 .append('#pragma once') | |
| 32 .append() | |
| 33 .append('#include <string>') | |
| 34 .append('#include <vector>') | |
| 35 .append() | |
| 36 .append('#include "base/basictypes.h"') | |
| 37 .append('#include "base/memory/scoped_ptr.h"') | |
| 38 .append('#include "base/values.h"') | |
| 39 .append() | |
| 40 .append('using base::Value;') | |
| 41 .append('using base::DictionaryValue;') | |
| 42 .append('using base::ListValue;') | |
| 43 .append() | |
| 44 ) | |
| 45 | |
| 46 includes = self.__cpp_type_manager.generate_cpp_includes() | |
| 47 if includes.render(): | |
|
not at google - send to devlin
2012/01/17 05:42:32
seems weird to render() this here then not use the
calamity
2012/01/18 05:43:08
Done.
| |
| 48 (c.concat(includes) | |
| 49 .append() | |
| 50 ) | |
| 51 | |
| 52 (c.append('namespace %s {' % self.__namespace.root_namespace) | |
| 53 .append('namespace %s {' % filename) | |
| 54 .append() | |
| 55 .append('//') | |
| 56 .append('// Types') | |
| 57 .append('//') | |
| 58 .append() | |
| 59 ) | |
| 60 for tipe in self.__namespace.types.values(): | |
| 61 (c.concat(self.generate_type(tipe)) | |
| 62 .append() | |
| 63 ) | |
| 64 (c.append('//') | |
| 65 .append('// Functions') | |
| 66 .append('//') | |
| 67 .append() | |
| 68 ) | |
| 69 for function in self.__namespace.functions.values(): | |
| 70 (c.concat(self.generate_function(function)) | |
| 71 .append() | |
| 72 ) | |
| 73 (c.append() | |
| 74 .append() | |
| 75 .append('} // namespace %s' % self.__namespace.root_namespace) | |
| 76 .append('} // namespace %s' % filename) | |
| 77 .append() | |
| 78 .append('#endif // %s' % ifndef_name) | |
| 79 ) | |
| 80 return c | |
| 81 | |
| 82 def generate_type(self, tipe, serializable=True): | |
| 83 """Generates a struct for a type. | |
| 84 """ | |
| 85 classname = cpp_util.cpp_name(tipe.name) | |
| 86 c = code.Code() | |
| 87 if tipe.description: | |
| 88 c.comment(tipe.description) | |
| 89 (c.sblock('struct %(classname)s {') | |
| 90 .append('~%(classname)s();') | |
| 91 .append('%(classname)s();') | |
| 92 .append() | |
| 93 ) | |
|
not at google - send to devlin
2012/01/17 05:42:32
blank line here perhaps?
calamity
2012/01/18 05:43:08
Done.
| |
| 94 for prop in tipe.properties.values(): | |
| 95 if prop.description: | |
| 96 c.comment(prop.description) | |
| 97 if prop.optional: | |
| 98 c.append('scoped_ptr<%s> %s;' % | |
| 99 (self.__cpp_type_manager.get_type(prop, pad_for_generics=True), | |
| 100 prop.name)) | |
| 101 else: | |
| 102 c.append('%s %s;' % (self.__cpp_type_manager.get_type(prop), prop.name)) | |
| 103 c.append() | |
| 104 | |
| 105 (c.comment('Populates a %(classname)s object from a Value. Returns' | |
| 106 ' whether |out| was successfully populated.') | |
| 107 .append('static bool Populate(const Value& value, %(classname)s* out);') | |
| 108 .append() | |
| 109 ) | |
| 110 if serializable: | |
| 111 (c.comment('Returns a new DictionaryValue representing the' | |
| 112 ' serialized form of this %(classname)s object.') | |
| 113 .append('DictionaryValue* ToValue() const;') | |
| 114 ) | |
| 115 (c.eblock() | |
|
not at google - send to devlin
2012/01/17 05:42:32
blank line here perhaps?
calamity
2012/01/18 05:43:08
Done.
| |
| 116 .sblock(' private:') | |
| 117 .append('DISALLOW_COPY_AND_ASSIGN(%(classname)s);') | |
| 118 .eblock('};') | |
| 119 ) | |
| 120 c.substitute({'classname': classname}) | |
| 121 return c | |
| 122 | |
| 123 def generate_function(self, function): | |
| 124 """Generates the structs for a function. | |
| 125 """ | |
| 126 c = code.Code() | |
| 127 (c.sblock('struct %s {' % cpp_util.cpp_name(function.name)) | |
| 128 .concat(self.generate_function_params(function)) | |
| 129 .append() | |
| 130 .concat(self.generate_function_result(function)) | |
| 131 .append() | |
| 132 .eblock('};') | |
| 133 ) | |
| 134 return c | |
| 135 | |
| 136 def generate_function_params(self, function): | |
| 137 """Generates the struct for passing parameters into a function. | |
| 138 """ | |
| 139 c = code.Code() | |
| 140 | |
| 141 c.sblock('struct Params {') | |
| 142 for param in function.params: | |
| 143 if param.description: | |
| 144 c.comment(param.description) | |
| 145 if param.type == PropertyType.OBJECT: | |
| 146 c.concat(self.generate_type(param, serializable=False)) | |
| 147 c.append() | |
| 148 for param in function.params: | |
| 149 c.append('%s %s;' % (self.__cpp_type_manager.get_type(param), param.name)) | |
| 150 | |
| 151 if function.params: | |
| 152 (c.append() | |
| 153 .append('Params();') | |
| 154 .append('~Params();') | |
| 155 .append() | |
| 156 .append('static bool Populate(const ListValue& args, Params* out);') | |
| 157 .eblock() | |
| 158 .sblock(' private:') | |
| 159 .append('DISALLOW_COPY_AND_ASSIGN(Params);') | |
| 160 ) | |
| 161 | |
| 162 c.eblock('};') | |
| 163 | |
| 164 return c | |
| 165 | |
| 166 def generate_function_result(self, function): | |
| 167 """Generates the struct for passing a function's result back. | |
| 168 """ | |
| 169 # TODO(calamity): Handle returning an object | |
| 170 c = code.Code() | |
| 171 | |
| 172 param = function.callback.param | |
| 173 # TODO(calamity): Put this description comment in less stupid place | |
| 174 if param.description: | |
| 175 c.comment(param.description) | |
| 176 (c.append('class Result {') | |
| 177 .sblock(' public:') | |
| 178 ) | |
| 179 arg = '' | |
| 180 # TODO(calamity): handle object | |
| 181 if param: | |
| 182 if param.type == PropertyType.REF: | |
| 183 arg = 'const %(type)s& %(name)s' | |
| 184 else: | |
| 185 arg = 'const %(type)s %(name)s' | |
| 186 arg = arg % {'type': self.__cpp_type_manager.get_type(param), | |
| 187 'name': param.name} | |
| 188 (c.append('static Value* Create(%s);' % arg) | |
| 189 .eblock() | |
| 190 .sblock(' private:') | |
| 191 .append('Result() {};') | |
| 192 .append('DISALLOW_COPY_AND_ASSIGN(Result);') | |
| 193 .eblock('};') | |
| 194 ) | |
| 195 | |
| 196 return c | |
| 197 | |
| 198 def generate_ifndef_name(path, filename): | |
| 199 """Formats a path and filename as a #define name. | |
| 200 | |
| 201 e.g chrome/extensions/gen, file.h becomes CHROME_EXTENSIONS_GEN_FILE_H__. | |
| 202 """ | |
| 203 return ('%s/%s_H__' % (path, filename)).upper().replace('/', '_') | |
| 204 | |
| OLD | NEW |