OLD | NEW |
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 Loading... |
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_descriptor': GetUnionFieldDescriptor, |
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 } |
OLD | NEW |