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