Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(480)

Side by Side Diff: tools/json_schema_compiler/generate_h.py

Issue 9114036: Code generation for extensions api (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: some rework Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698