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

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_python_generator.py

Issue 1218023006: Implement python mojo bindings unions. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 5 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
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Generates Python source files from a mojom.Module.""" 5 """Generates Python source files from a mojom.Module."""
6 6
7 import re 7 import re
8 8
9 import mojom.generate.constant_resolver as resolver 9 import mojom.generate.constant_resolver as resolver
10 import mojom.generate.generator as generator 10 import mojom.generate.generator as generator
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 139
140 if mojom.IsMapKind(kind): 140 if mojom.IsMapKind(kind):
141 arguments = [ 141 arguments = [
142 GetFieldType(kind.key_kind), 142 GetFieldType(kind.key_kind),
143 GetFieldType(kind.value_kind), 143 GetFieldType(kind.value_kind),
144 ] 144 ]
145 if mojom.IsNullableKind(kind): 145 if mojom.IsNullableKind(kind):
146 arguments.append('nullable=True') 146 arguments.append('nullable=True')
147 return '_descriptor.MapType(%s)' % ', '.join(arguments) 147 return '_descriptor.MapType(%s)' % ', '.join(arguments)
148 148
149 if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind): 149 if mojom.IsUnionKind(kind):
150 arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ] 150 arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ]
151 if mojom.IsNullableKind(kind): 151 if mojom.IsNullableKind(kind):
152 arguments.append('nullable=True') 152 arguments.append('nullable=True')
153 return '_descriptor.UnionType(%s)' % ', '.join(arguments)
154
155 if mojom.IsStructKind(kind):
156 arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ]
157 if mojom.IsNullableKind(kind):
158 arguments.append('nullable=True')
153 return '_descriptor.StructType(%s)' % ', '.join(arguments) 159 return '_descriptor.StructType(%s)' % ', '.join(arguments)
154 160
155 if mojom.IsEnumKind(kind): 161 if mojom.IsEnumKind(kind):
156 return GetFieldType(mojom.INT32) 162 return GetFieldType(mojom.INT32)
157 163
158 if mojom.IsInterfaceKind(kind): 164 if mojom.IsInterfaceKind(kind):
159 arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ] 165 arguments = [ 'lambda: %s' % GetFullyQualifiedName(kind) ]
160 if mojom.IsNullableKind(kind): 166 if mojom.IsNullableKind(kind):
161 arguments.append('nullable=True') 167 arguments.append('nullable=True')
162 return '_descriptor.InterfaceType(%s)' % ', '.join(arguments) 168 return '_descriptor.InterfaceType(%s)' % ', '.join(arguments)
163 169
164 if mojom.IsInterfaceRequestKind(kind): 170 if mojom.IsInterfaceRequestKind(kind):
165 arguments = [] 171 arguments = []
166 if mojom.IsNullableKind(kind): 172 if mojom.IsNullableKind(kind):
167 arguments.append('nullable=True') 173 arguments.append('nullable=True')
168 return '_descriptor.InterfaceRequestType(%s)' % ', '.join(arguments) 174 return '_descriptor.InterfaceRequestType(%s)' % ', '.join(arguments)
169 175
170 return _kind_to_type[kind] 176 return _kind_to_type[kind]
171 177
172 def GetFieldDescriptor(packed_field): 178 def GetFieldDescriptor(field, index, min_version):
173 field = packed_field.field
174 class_name = 'SingleFieldGroup' 179 class_name = 'SingleFieldGroup'
175 if field.kind == mojom.BOOL: 180 if field.kind == mojom.BOOL:
176 class_name = 'FieldDescriptor' 181 class_name = 'FieldDescriptor'
177 arguments = [ '%r' % GetNameForElement(field) ] 182 arguments = [ '%r' % GetNameForElement(field) ]
178 arguments.append(GetFieldType(field.kind, field)) 183 arguments.append(GetFieldType(field.kind, field))
179 arguments.append(str(packed_field.index)) 184 arguments.append(str(index))
180 arguments.append(str(packed_field.min_version)) 185 arguments.append(str(min_version))
181 if field.default: 186 if field.default:
182 if mojom.IsStructKind(field.kind): 187 if mojom.IsStructKind(field.kind):
183 arguments.append('default_value=True') 188 arguments.append('default_value=True')
184 else: 189 else:
185 arguments.append('default_value=%s' % ExpressionToText(field.default)) 190 arguments.append('default_value=%s' % ExpressionToText(field.default))
186 return '_descriptor.%s(%s)' % (class_name, ', '.join(arguments)) 191 return '_descriptor.%s(%s)' % (class_name, ', '.join(arguments))
187 192
193 def GetStructFieldDescriptor(packed_field):
194 return GetFieldDescriptor(
195 packed_field.field, packed_field.index, packed_field.min_version)
196
197 def GetUnionFieldDescriptor(field):
198 return GetFieldDescriptor(field, field.ordinal, 0)
199
188 def GetFieldGroup(byte): 200 def GetFieldGroup(byte):
189 if byte.packed_fields[0].field.kind == mojom.BOOL: 201 if byte.packed_fields[0].field.kind == mojom.BOOL:
190 descriptors = map(GetFieldDescriptor, byte.packed_fields) 202 descriptors = map(GetStructFieldDescriptor, byte.packed_fields)
191 return '_descriptor.BooleanGroup([%s])' % ', '.join(descriptors) 203 return '_descriptor.BooleanGroup([%s])' % ', '.join(descriptors)
192 assert len(byte.packed_fields) == 1 204 assert len(byte.packed_fields) == 1
193 return GetFieldDescriptor(byte.packed_fields[0]) 205 return GetStructFieldDescriptor(byte.packed_fields[0])
194 206
195 def MojomToPythonImport(mojom): 207 def MojomToPythonImport(mojom):
196 return mojom.replace('.mojom', '_mojom') 208 return mojom.replace('.mojom', '_mojom')
197 209
198 class Generator(generator.Generator): 210 class Generator(generator.Generator):
199 211
200 python_filters = { 212 python_filters = {
201 'expression_to_text': ExpressionToText, 213 'expression_to_text': ExpressionToText,
202 'field_group': GetFieldGroup, 214 'field_group': GetFieldGroup,
215 'union_field_desc': GetUnionFieldDescriptor,
qsr 2015/07/16 09:35:26 union_field_descriptor
azani 2015/07/16 21:57:39 Done.
203 'fully_qualified_name': GetFullyQualifiedName, 216 'fully_qualified_name': GetFullyQualifiedName,
204 'name': GetNameForElement, 217 'name': GetNameForElement,
205 } 218 }
206 219
207 @UseJinja('python_templates/module.py.tmpl', filters=python_filters) 220 @UseJinja('python_templates/module.py.tmpl', filters=python_filters)
208 def GeneratePythonModule(self): 221 def GeneratePythonModule(self):
209 return { 222 return {
210 'enums': self.module.enums, 223 'enums': self.module.enums,
211 'imports': self.GetImports(), 224 'imports': self.GetImports(),
212 'interfaces': self.GetInterfaces(), 225 'interfaces': self.GetInterfaces(),
213 'module': resolver.ResolveConstants(self.module, ExpressionToText), 226 'module': resolver.ResolveConstants(self.module, ExpressionToText),
214 'namespace': self.module.namespace, 227 'namespace': self.module.namespace,
215 'structs': self.GetStructs(), 228 'structs': self.GetStructs(),
229 'unions': self.GetUnions(),
216 } 230 }
217 231
218 def GenerateFiles(self, args): 232 def GenerateFiles(self, args):
219 import_path = MojomToPythonImport(self.module.name) 233 import_path = MojomToPythonImport(self.module.name)
220 self.Write(self.GeneratePythonModule(), 234 self.Write(self.GeneratePythonModule(),
221 self.MatchMojomFilePath('%s.py' % import_path)) 235 self.MatchMojomFilePath('%s.py' % import_path))
222 236
223 def GetImports(self): 237 def GetImports(self):
224 for each in self.module.imports: 238 for each in self.module.imports:
225 each['python_module'] = MojomToPythonImport(each['module_name']) 239 each['python_module'] = MojomToPythonImport(each['module_name'])
226 return self.module.imports 240 return self.module.imports
227 241
228 def GetJinjaParameters(self): 242 def GetJinjaParameters(self):
229 return { 243 return {
230 'lstrip_blocks': True, 244 'lstrip_blocks': True,
231 'trim_blocks': True, 245 'trim_blocks': True,
232 } 246 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698