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

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

Powered by Google App Engine
This is Rietveld 408576698