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

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

Issue 851173002: Dart: Encode/Decode handle and interface types. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Fix Interface encode parameters Created 5 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
« no previous file with comments | « mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 dart source files from a mojom.Module.""" 5 """Generates dart source files from a mojom.Module."""
6 6
7 import re 7 import re
8 8
9 import mojom.generate.generator as generator 9 import mojom.generate.generator as generator
10 import mojom.generate.module as mojom 10 import mojom.generate.module as mojom
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 _kind_to_dart_decl_type = { 44 _kind_to_dart_decl_type = {
45 mojom.BOOL: "bool", 45 mojom.BOOL: "bool",
46 mojom.INT8: "int", 46 mojom.INT8: "int",
47 mojom.UINT8: "int", 47 mojom.UINT8: "int",
48 mojom.INT16: "int", 48 mojom.INT16: "int",
49 mojom.UINT16: "int", 49 mojom.UINT16: "int",
50 mojom.INT32: "int", 50 mojom.INT32: "int",
51 mojom.UINT32: "int", 51 mojom.UINT32: "int",
52 mojom.FLOAT: "double", 52 mojom.FLOAT: "double",
53 mojom.HANDLE: "core.MojoHandle", 53 mojom.HANDLE: "core.MojoHandle",
54 mojom.DCPIPE: "core.MojoHandle", 54 mojom.DCPIPE: "core.MojoDataPipeConsumer",
55 mojom.DPPIPE: "core.MojoHandle", 55 mojom.DPPIPE: "core.MojoDataPipeProducer",
56 mojom.MSGPIPE: "core.MojoHandle", 56 mojom.MSGPIPE: "core.MojoMessagePipeEndpoint",
57 mojom.SHAREDBUFFER: "core.MojoHandle", 57 mojom.SHAREDBUFFER: "core.MojoSharedBuffer",
58 mojom.NULLABLE_HANDLE: "core.MojoHandle", 58 mojom.NULLABLE_HANDLE: "core.MojoHandle",
59 mojom.NULLABLE_DCPIPE: "core.MojoHandle", 59 mojom.NULLABLE_DCPIPE: "core.MojoDataPipeConsumer",
60 mojom.NULLABLE_DPPIPE: "core.MojoHandle", 60 mojom.NULLABLE_DPPIPE: "core.MojoDataPipeProducer",
61 mojom.NULLABLE_MSGPIPE: "core.MojoHandle", 61 mojom.NULLABLE_MSGPIPE: "core.MojoMessagePipeEndpoint",
62 mojom.NULLABLE_SHAREDBUFFER: "core.MojoHandle", 62 mojom.NULLABLE_SHAREDBUFFER: "core.MojoSharedBuffer",
63 mojom.INT64: "int", 63 mojom.INT64: "int",
64 mojom.UINT64: "int", 64 mojom.UINT64: "int",
65 mojom.DOUBLE: "double", 65 mojom.DOUBLE: "double",
66 mojom.STRING: "String", 66 mojom.STRING: "String",
67 mojom.NULLABLE_STRING: "String" 67 mojom.NULLABLE_STRING: "String"
68 } 68 }
69 69
70 _spec_to_decode_method = { 70 _spec_to_decode_method = {
71 mojom.BOOL.spec: 'decodeBool', 71 mojom.BOOL.spec: 'decodeBool',
72 mojom.DCPIPE.spec: 'decodeHandle', 72 mojom.DCPIPE.spec: 'decodeHandle',
73 mojom.DOUBLE.spec: 'decodeDouble', 73 mojom.DOUBLE.spec: 'decodeDouble',
74 mojom.DPPIPE.spec: 'decodeHandle', 74 mojom.DPPIPE.spec: 'decodeHandle',
75 mojom.FLOAT.spec: 'decodeFloat', 75 mojom.FLOAT.spec: 'decodeFloat',
76 mojom.HANDLE.spec: 'decodeHandle', 76 mojom.HANDLE.spec: 'decodeHandle',
77 mojom.INT16.spec: 'decodeInt16', 77 mojom.INT16.spec: 'decodeInt16',
78 mojom.INT32.spec: 'decodeInt32', 78 mojom.INT32.spec: 'decodeInt32',
79 mojom.INT64.spec: 'decodeInt64', 79 mojom.INT64.spec: 'decodeInt64',
80 mojom.INT8.spec: 'decodeInt8', 80 mojom.INT8.spec: 'decodeInt8',
81 mojom.MSGPIPE.spec: 'decodeHandle', 81 mojom.MSGPIPE.spec: 'decodeMessagePipeHandle',
82 mojom.NULLABLE_DCPIPE.spec: 'decodeHandle', 82 mojom.NULLABLE_DCPIPE.spec: 'decodeConsumerHandle',
83 mojom.NULLABLE_DPPIPE.spec: 'decodeHandle', 83 mojom.NULLABLE_DPPIPE.spec: 'decodeProducerHandle',
84 mojom.NULLABLE_HANDLE.spec: 'decodeHandle', 84 mojom.NULLABLE_HANDLE.spec: 'decodeHandle',
85 mojom.NULLABLE_MSGPIPE.spec: 'decodeHandle', 85 mojom.NULLABLE_MSGPIPE.spec: 'decodeMessagePipeHandle',
86 mojom.NULLABLE_SHAREDBUFFER.spec: 'decodeHandle', 86 mojom.NULLABLE_SHAREDBUFFER.spec: 'decodeSharedBufferHandle',
87 mojom.NULLABLE_STRING.spec: 'decodeString', 87 mojom.NULLABLE_STRING.spec: 'decodeString',
88 mojom.SHAREDBUFFER.spec: 'decodeHandle', 88 mojom.SHAREDBUFFER.spec: 'decodeSharedBufferHandle',
89 mojom.STRING.spec: 'decodeString', 89 mojom.STRING.spec: 'decodeString',
90 mojom.UINT16.spec: 'decodeUint16', 90 mojom.UINT16.spec: 'decodeUint16',
91 mojom.UINT32.spec: 'decodeUint32', 91 mojom.UINT32.spec: 'decodeUint32',
92 mojom.UINT64.spec: 'decodeUint64', 92 mojom.UINT64.spec: 'decodeUint64',
93 mojom.UINT8.spec: 'decodeUint8', 93 mojom.UINT8.spec: 'decodeUint8',
94 } 94 }
95 95
96 _spec_to_encode_method = { 96 _spec_to_encode_method = {
97 mojom.BOOL.spec: 'encodeBool', 97 mojom.BOOL.spec: 'encodeBool',
98 mojom.DCPIPE.spec: 'encodeHandle', 98 mojom.DCPIPE.spec: 'encodeHandle',
99 mojom.DOUBLE.spec: 'encodeDouble', 99 mojom.DOUBLE.spec: 'encodeDouble',
100 mojom.DPPIPE.spec: 'encodeHandle', 100 mojom.DPPIPE.spec: 'encodeHandle',
101 mojom.FLOAT.spec: 'encodeFloat', 101 mojom.FLOAT.spec: 'encodeFloat',
102 mojom.HANDLE.spec: 'encodeHandle', 102 mojom.HANDLE.spec: 'encodeHandle',
103 mojom.INT16.spec: 'encodeInt16', 103 mojom.INT16.spec: 'encodeInt16',
104 mojom.INT32.spec: 'encodeInt32', 104 mojom.INT32.spec: 'encodeInt32',
105 mojom.INT64.spec: 'encodeInt64', 105 mojom.INT64.spec: 'encodeInt64',
106 mojom.INT8.spec: 'encodeInt8', 106 mojom.INT8.spec: 'encodeInt8',
107 mojom.MSGPIPE.spec: 'encodeHandle', 107 mojom.MSGPIPE.spec: 'encodeMessagePipeHandle',
108 mojom.NULLABLE_DCPIPE.spec: 'encodeHandle', 108 mojom.NULLABLE_DCPIPE.spec: 'encodeConsumerHandle',
109 mojom.NULLABLE_DPPIPE.spec: 'encodeHandle', 109 mojom.NULLABLE_DPPIPE.spec: 'encodeProducerHandle',
110 mojom.NULLABLE_HANDLE.spec: 'encodeHandle', 110 mojom.NULLABLE_HANDLE.spec: 'encodeHandle',
111 mojom.NULLABLE_MSGPIPE.spec: 'encodeHandle', 111 mojom.NULLABLE_MSGPIPE.spec: 'encodeMessagePipeHandle',
112 mojom.NULLABLE_SHAREDBUFFER.spec: 'encodeHandle', 112 mojom.NULLABLE_SHAREDBUFFER.spec: 'encodeSharedBufferHandle',
113 mojom.NULLABLE_STRING.spec: 'encodeString', 113 mojom.NULLABLE_STRING.spec: 'encodeString',
114 mojom.SHAREDBUFFER.spec: 'encodeHandle', 114 mojom.SHAREDBUFFER.spec: 'encodeSharedBufferHandle',
115 mojom.STRING.spec: 'encodeString', 115 mojom.STRING.spec: 'encodeString',
116 mojom.UINT16.spec: 'encodeUint16', 116 mojom.UINT16.spec: 'encodeUint16',
117 mojom.UINT32.spec: 'encodeUint32', 117 mojom.UINT32.spec: 'encodeUint32',
118 mojom.UINT64.spec: 'encodeUint64', 118 mojom.UINT64.spec: 'encodeUint64',
119 mojom.UINT8.spec: 'encodeUint8', 119 mojom.UINT8.spec: 'encodeUint8',
120 } 120 }
121 121
122 def GetDartType(kind): 122 def GetDartType(kind):
123 if kind.imported_from: 123 if kind.imported_from:
124 return kind.imported_from["unique_name"] + "." + kind.name 124 return kind.imported_from["unique_name"] + "." + kind.name
125 return kind.name 125 return kind.name
126 126
127 def DartDefaultValue(field): 127 def DartDefaultValue(field):
128 if field.default: 128 if field.default:
129 if mojom.IsStructKind(field.kind): 129 if mojom.IsStructKind(field.kind):
130 assert field.default == "default" 130 assert field.default == "default"
131 return "new %s()" % GetDartType(field.kind) 131 return "new %s()" % GetDartType(field.kind)
132 return ExpressionToText(field.default) 132 return ExpressionToText(field.default)
133 if field.kind in mojom.PRIMITIVES: 133 if field.kind in mojom.PRIMITIVES:
134 return _kind_to_dart_default_value[field.kind] 134 return _kind_to_dart_default_value[field.kind]
135 if mojom.IsStructKind(field.kind): 135 if mojom.IsStructKind(field.kind):
136 return "null" 136 return "null"
137 if mojom.IsArrayKind(field.kind): 137 if mojom.IsArrayKind(field.kind):
138 return "null" 138 return "null"
139 if mojom.IsMapKind(field.kind): 139 if mojom.IsMapKind(field.kind):
140 return "null" 140 return "null"
141 if mojom.IsInterfaceKind(field.kind) or \ 141 if mojom.IsInterfaceKind(field.kind) or \
142 mojom.IsInterfaceRequestKind(field.kind): 142 mojom.IsInterfaceRequestKind(field.kind):
143 return _kind_to_dart_default_value[mojom.MSGPIPE] 143 return "null"
144 if mojom.IsEnumKind(field.kind): 144 if mojom.IsEnumKind(field.kind):
145 return "0" 145 return "0"
146 146
147 def DartDeclType(kind): 147 def DartDeclType(kind):
148 if kind in mojom.PRIMITIVES: 148 if kind in mojom.PRIMITIVES:
149 return _kind_to_dart_decl_type[kind] 149 return _kind_to_dart_decl_type[kind]
150 if mojom.IsStructKind(kind): 150 if mojom.IsStructKind(kind):
151 return GetDartType(kind) 151 return GetDartType(kind)
152 if mojom.IsArrayKind(kind): 152 if mojom.IsArrayKind(kind):
153 array_type = DartDeclType(kind.kind) 153 array_type = DartDeclType(kind.kind)
154 return "List<" + array_type + ">" 154 return "List<" + array_type + ">"
155 if mojom.IsMapKind(kind): 155 if mojom.IsMapKind(kind):
156 key_type = DartDeclType(kind.key_kind) 156 key_type = DartDeclType(kind.key_kind)
157 value_type = DartDeclType(kind.value_kind) 157 value_type = DartDeclType(kind.value_kind)
158 return "Map<"+ key_type + ", " + value_type + ">" 158 return "Map<"+ key_type + ", " + value_type + ">"
159 if mojom.IsInterfaceKind(kind) or \ 159 if mojom.IsInterfaceKind(kind) or \
160 mojom.IsInterfaceRequestKind(kind): 160 mojom.IsInterfaceRequestKind(kind):
161 return _kind_to_dart_decl_type[mojom.MSGPIPE] 161 return "Object"
162 if mojom.IsEnumKind(kind): 162 if mojom.IsEnumKind(kind):
163 return "int" 163 return "int"
164 164
165 def NameToComponent(name): 165 def NameToComponent(name):
166 # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar -> 166 # insert '_' between anything and a Title name (e.g, HTTPEntry2FooBar ->
167 # HTTP_Entry2_FooBar) 167 # HTTP_Entry2_FooBar)
168 name = re.sub('([^_])([A-Z][^A-Z_]+)', r'\1_\2', name) 168 name = re.sub('([^_])([A-Z][^A-Z_]+)', r'\1_\2', name)
169 # insert '_' between non upper and start of upper blocks (e.g., 169 # insert '_' between non upper and start of upper blocks (e.g.,
170 # HTTP_Entry2_FooBar -> HTTP_Entry2_Foo_Bar) 170 # HTTP_Entry2_FooBar -> HTTP_Entry2_Foo_Bar)
171 name = re.sub('([^A-Z_])([A-Z])', r'\1_\2', name) 171 name = re.sub('([^A-Z_])([A-Z])', r'\1_\2', name)
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 flags_to_set = [] 235 flags_to_set = []
236 if mojom.IsNullableKind(kind): 236 if mojom.IsNullableKind(kind):
237 flags_to_set.append(ARRAY_NULLABLE) 237 flags_to_set.append(ARRAY_NULLABLE)
238 if mojom.IsNullableKind(kind.kind): 238 if mojom.IsNullableKind(kind.kind):
239 flags_to_set.append(ELEMENT_NULLABLE) 239 flags_to_set.append(ELEMENT_NULLABLE)
240 240
241 if not flags_to_set: 241 if not flags_to_set:
242 flags_to_set = [NOTHING_NULLABLE] 242 flags_to_set = [NOTHING_NULLABLE]
243 return ' | '.join(flags_to_set) 243 return ' | '.join(flags_to_set)
244 244
245 def AppendEncodeDecodeParams(initial_params, kind, bit): 245 def AppendDecodeParams(initial_params, kind, bit):
246 """ Appends standard parameters for decode calls. """
247 params = list(initial_params)
248 if (kind == mojom.BOOL):
249 params.append(str(bit))
250 if mojom.IsReferenceKind(kind):
251 if mojom.IsArrayKind(kind):
252 params.append(GetArrayNullabilityFlags(kind))
253 else:
254 params.append(GetDartTrueFalse(mojom.IsNullableKind(kind)))
255 if mojom.IsInterfaceKind(kind):
256 params.append('%sClient.newFromEndpoint' % GetDartType(kind))
257 if mojom.IsArrayKind(kind) and mojom.IsInterfaceKind(kind.kind):
258 params.append('%sClient.newFromEndpoint' % GetDartType(kind.kind))
259 if mojom.IsInterfaceRequestKind(kind):
260 params.append('%sInterface.newFromEndpoint' % GetDartType(kind.kind))
261 if mojom.IsArrayKind(kind) and mojom.IsInterfaceRequestKind(kind.kind):
262 params.append('%sInterface.newFromEndpoint' % GetDartType(kind.kind.kind))
263 if mojom.IsArrayKind(kind):
264 params.append(GetArrayExpectedLength(kind))
265 return params
266
267 def AppendEncodeParams(initial_params, kind, bit):
246 """ Appends standard parameters shared between encode and decode calls. """ 268 """ Appends standard parameters shared between encode and decode calls. """
247 params = list(initial_params) 269 params = list(initial_params)
248 if (kind == mojom.BOOL): 270 if (kind == mojom.BOOL):
249 params.append(str(bit)) 271 params.append(str(bit))
250 if mojom.IsReferenceKind(kind): 272 if mojom.IsReferenceKind(kind):
251 if mojom.IsArrayKind(kind): 273 if mojom.IsArrayKind(kind):
252 params.append(GetArrayNullabilityFlags(kind)) 274 params.append(GetArrayNullabilityFlags(kind))
253 else: 275 else:
254 params.append(GetDartTrueFalse(mojom.IsNullableKind(kind))) 276 params.append(GetDartTrueFalse(mojom.IsNullableKind(kind)))
255 if mojom.IsArrayKind(kind): 277 if mojom.IsArrayKind(kind):
256 params.append(GetArrayExpectedLength(kind)) 278 params.append(GetArrayExpectedLength(kind))
257 return params 279 return params
258 280
259 def DecodeMethod(kind, offset, bit): 281 def DecodeMethod(kind, offset, bit):
260 def _DecodeMethodName(kind): 282 def _DecodeMethodName(kind):
261 if mojom.IsArrayKind(kind): 283 if mojom.IsArrayKind(kind):
262 return _DecodeMethodName(kind.kind) + 'Array' 284 return _DecodeMethodName(kind.kind) + 'Array'
263 if mojom.IsEnumKind(kind): 285 if mojom.IsEnumKind(kind):
264 return _DecodeMethodName(mojom.INT32) 286 return _DecodeMethodName(mojom.INT32)
265 if mojom.IsInterfaceRequestKind(kind): 287 if mojom.IsInterfaceRequestKind(kind):
266 return 'decodeHandle' 288 return 'decodeInterfaceRequest'
267 if mojom.IsInterfaceKind(kind): 289 if mojom.IsInterfaceKind(kind):
268 return 'decodeHandle' 290 return 'decodeServiceInterface'
269 return _spec_to_decode_method[kind.spec] 291 return _spec_to_decode_method[kind.spec]
270 methodName = _DecodeMethodName(kind) 292 methodName = _DecodeMethodName(kind)
271 params = AppendEncodeDecodeParams([ str(offset) ], kind, bit) 293 params = AppendDecodeParams([ str(offset) ], kind, bit)
272 return '%s(%s)' % (methodName, ', '.join(params)) 294 return '%s(%s)' % (methodName, ', '.join(params))
273 295
274 def EncodeMethod(kind, variable, offset, bit): 296 def EncodeMethod(kind, variable, offset, bit):
275 def _EncodeMethodName(kind): 297 def _EncodeMethodName(kind):
276 if mojom.IsStructKind(kind): 298 if mojom.IsStructKind(kind):
277 return 'encodeStruct' 299 return 'encodeStruct'
278 if mojom.IsArrayKind(kind): 300 if mojom.IsArrayKind(kind):
279 return _EncodeMethodName(kind.kind) + 'Array' 301 return _EncodeMethodName(kind.kind) + 'Array'
280 if mojom.IsEnumKind(kind): 302 if mojom.IsEnumKind(kind):
281 return _EncodeMethodName(mojom.INT32) 303 return _EncodeMethodName(mojom.INT32)
282 if mojom.IsInterfaceRequestKind(kind): 304 if mojom.IsInterfaceRequestKind(kind):
283 return 'encodeHandle' 305 return 'encodeInterfaceRequest'
284 if mojom.IsInterfaceKind(kind): 306 if mojom.IsInterfaceKind(kind):
285 return 'encodeHandle' 307 return 'encodeInterface'
286 return _spec_to_encode_method[kind.spec] 308 return _spec_to_encode_method[kind.spec]
287 methodName = _EncodeMethodName(kind) 309 methodName = _EncodeMethodName(kind)
288 params = AppendEncodeDecodeParams([ variable, str(offset) ], kind, bit) 310 params = AppendEncodeParams([ variable, str(offset) ], kind, bit)
289 return '%s(%s)' % (methodName, ', '.join(params)) 311 return '%s(%s)' % (methodName, ', '.join(params))
290 312
291 def TranslateConstants(token): 313 def TranslateConstants(token):
292 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)): 314 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
293 # Both variable and enum constants are constructed like: 315 # Both variable and enum constants are constructed like:
294 # NamespaceUid.Struct.Enum_CONSTANT_NAME 316 # NamespaceUid.Struct.Enum_CONSTANT_NAME
295 name = "" 317 name = ""
296 if token.imported_from: 318 if token.imported_from:
297 name = token.imported_from["unique_name"] + "." 319 name = token.imported_from["unique_name"] + "."
298 if token.parent_kind: 320 if token.parent_kind:
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 interface_to_import[name] = each_import["unique_name"] + "." + name 432 interface_to_import[name] = each_import["unique_name"] + "." + name
411 return interface_to_import 433 return interface_to_import
412 434
413 def ImportedFrom(self): 435 def ImportedFrom(self):
414 interface_to_import = {} 436 interface_to_import = {}
415 for each_import in self.module.imports: 437 for each_import in self.module.imports:
416 for each_interface in each_import["module"].interfaces: 438 for each_interface in each_import["module"].interfaces:
417 name = each_interface.name 439 name = each_interface.name
418 interface_to_import[name] = each_import["unique_name"] + "." 440 interface_to_import[name] = each_import["unique_name"] + "."
419 return interface_to_import 441 return interface_to_import
OLDNEW
« no previous file with comments | « mojo/public/tools/bindings/generators/dart_templates/interface_definition.tmpl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698