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 |