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

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

Issue 486203003: Mojo JS bindings generator doesn't generate import-qualified struct references (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: resync Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « mojo/public/js/bindings/codec_unittests.js ('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 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 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 JavaScript source files from a mojom.Module.""" 5 """Generates JavaScript source files from a mojom.Module."""
6 6
7 import mojom.generate.generator as generator 7 import mojom.generate.generator as generator
8 import mojom.generate.module as mojom 8 import mojom.generate.module as mojom
9 import mojom.generate.pack as pack 9 import mojom.generate.pack as pack
10 from mojom.generate.template_expander import UseJinja 10 from mojom.generate.template_expander import UseJinja
(...skipping 18 matching lines...) Expand all
29 mojom.NULLABLE_MSGPIPE: "null", 29 mojom.NULLABLE_MSGPIPE: "null",
30 mojom.NULLABLE_SHAREDBUFFER: "null", 30 mojom.NULLABLE_SHAREDBUFFER: "null",
31 mojom.INT64: "0", 31 mojom.INT64: "0",
32 mojom.UINT64: "0", 32 mojom.UINT64: "0",
33 mojom.DOUBLE: "0", 33 mojom.DOUBLE: "0",
34 mojom.STRING: '""', 34 mojom.STRING: '""',
35 mojom.NULLABLE_STRING: '""' 35 mojom.NULLABLE_STRING: '""'
36 } 36 }
37 37
38 38
39 def JavaScriptType(kind):
40 if kind.imported_from:
41 return kind.imported_from["unique_name"] + "." + kind.name
42 return kind.name
43
44
39 def JavaScriptDefaultValue(field): 45 def JavaScriptDefaultValue(field):
40 if field.default: 46 if field.default:
41 if mojom.IsStructKind(field.kind): 47 if mojom.IsStructKind(field.kind):
42 assert field.default == "default" 48 assert field.default == "default"
43 return "new %s()" % JavascriptType(field.kind) 49 return "new %s()" % JavaScriptType(field.kind)
44 return ExpressionToText(field.default) 50 return ExpressionToText(field.default)
45 if field.kind in mojom.PRIMITIVES: 51 if field.kind in mojom.PRIMITIVES:
46 return _kind_to_javascript_default_value[field.kind] 52 return _kind_to_javascript_default_value[field.kind]
47 if mojom.IsStructKind(field.kind): 53 if mojom.IsStructKind(field.kind):
48 return "null" 54 return "null"
49 if mojom.IsAnyArrayKind(field.kind): 55 if mojom.IsAnyArrayKind(field.kind):
50 return "null" 56 return "null"
51 if mojom.IsInterfaceKind(field.kind) or \ 57 if mojom.IsInterfaceKind(field.kind) or \
52 mojom.IsInterfaceRequestKind(field.kind): 58 mojom.IsInterfaceRequestKind(field.kind):
53 return _kind_to_javascript_default_value[mojom.MSGPIPE] 59 return _kind_to_javascript_default_value[mojom.MSGPIPE]
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 mojom.DOUBLE: "codec.Double", 95 mojom.DOUBLE: "codec.Double",
90 mojom.STRING: "codec.String", 96 mojom.STRING: "codec.String",
91 mojom.NULLABLE_STRING: "codec.String", 97 mojom.NULLABLE_STRING: "codec.String",
92 } 98 }
93 99
94 100
95 def CodecType(kind): 101 def CodecType(kind):
96 if kind in mojom.PRIMITIVES: 102 if kind in mojom.PRIMITIVES:
97 return _kind_to_codec_type[kind] 103 return _kind_to_codec_type[kind]
98 if mojom.IsStructKind(kind): 104 if mojom.IsStructKind(kind):
99 return "new codec.PointerTo(%s)" % CodecType(kind.name) 105 return "new codec.PointerTo(%s)" % JavaScriptType(kind)
100 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind): 106 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind):
101 return "new codec.ArrayOf(codec.PackedBool)" 107 return "new codec.ArrayOf(codec.PackedBool)"
102 if mojom.IsAnyArrayKind(kind): 108 if mojom.IsAnyArrayKind(kind):
103 return "new codec.ArrayOf(%s)" % CodecType(kind.kind) 109 return "new codec.ArrayOf(%s)" % CodecType(kind.kind)
104 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 110 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
105 return CodecType(mojom.MSGPIPE) 111 return CodecType(mojom.MSGPIPE)
106 if mojom.IsEnumKind(kind): 112 if mojom.IsEnumKind(kind):
107 return _kind_to_codec_type[mojom.INT32] 113 return _kind_to_codec_type[mojom.INT32]
108 return kind 114 return kind
109 115
110 116
111 def JavaScriptDecodeSnippet(kind): 117 def JavaScriptDecodeSnippet(kind):
112 if kind in mojom.PRIMITIVES: 118 if kind in mojom.PRIMITIVES:
113 return "decodeStruct(%s)" % CodecType(kind) 119 return "decodeStruct(%s)" % CodecType(kind)
114 if mojom.IsStructKind(kind): 120 if mojom.IsStructKind(kind):
115 return "decodeStructPointer(%s)" % CodecType(kind.name) 121 return "decodeStructPointer(%s)" % JavaScriptType(kind)
116 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind): 122 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind):
117 return "decodeArrayPointer(codec.PackedBool)" 123 return "decodeArrayPointer(codec.PackedBool)"
118 if mojom.IsAnyArrayKind(kind): 124 if mojom.IsAnyArrayKind(kind):
119 return "decodeArrayPointer(%s)" % CodecType(kind.kind) 125 return "decodeArrayPointer(%s)" % CodecType(kind.kind)
120 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 126 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
121 return JavaScriptDecodeSnippet(mojom.MSGPIPE) 127 return JavaScriptDecodeSnippet(mojom.MSGPIPE)
122 if mojom.IsEnumKind(kind): 128 if mojom.IsEnumKind(kind):
123 return JavaScriptDecodeSnippet(mojom.INT32) 129 return JavaScriptDecodeSnippet(mojom.INT32)
124 130
125 131
126 def JavaScriptEncodeSnippet(kind): 132 def JavaScriptEncodeSnippet(kind):
127 if kind in mojom.PRIMITIVES: 133 if kind in mojom.PRIMITIVES:
128 return "encodeStruct(%s, " % CodecType(kind) 134 return "encodeStruct(%s, " % CodecType(kind)
129 if mojom.IsStructKind(kind): 135 if mojom.IsStructKind(kind):
130 return "encodeStructPointer(%s, " % CodecType(kind.name) 136 return "encodeStructPointer(%s, " % JavaScriptType(kind)
131 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind): 137 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind):
132 return "encodeArrayPointer(codec.PackedBool, "; 138 return "encodeArrayPointer(codec.PackedBool, ";
133 if mojom.IsAnyArrayKind(kind): 139 if mojom.IsAnyArrayKind(kind):
134 return "encodeArrayPointer(%s, " % CodecType(kind.kind) 140 return "encodeArrayPointer(%s, " % CodecType(kind.kind)
135 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 141 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
136 return JavaScriptEncodeSnippet(mojom.MSGPIPE) 142 return JavaScriptEncodeSnippet(mojom.MSGPIPE)
137 if mojom.IsEnumKind(kind): 143 if mojom.IsEnumKind(kind):
138 return JavaScriptEncodeSnippet(mojom.INT32) 144 return JavaScriptEncodeSnippet(mojom.INT32)
139 145
140 146
141 def JavaScriptFieldOffset(packed_field): 147 def JavaScriptFieldOffset(packed_field):
142 return "offset + codec.kStructHeaderSize + %s" % packed_field.offset 148 return "offset + codec.kStructHeaderSize + %s" % packed_field.offset
143 149
144 def JavaScriptValidateArrayParams(pf): 150 def JavaScriptValidateArrayParams(pf):
145 elementKind = pf.field.kind.kind 151 elementKind = pf.field.kind.kind
146 elementSize = pack.PackedField.GetSizeForKind(elementKind) 152 elementSize = pack.PackedField.GetSizeForKind(elementKind)
147 elementCount = generator.ExpectedArraySize(pf.field.kind) 153 elementCount = generator.ExpectedArraySize(pf.field.kind)
148 elementType = "codec.PackedBool" if mojom.IsBoolKind(elementKind) \ 154 elementType = "codec.PackedBool" if mojom.IsBoolKind(elementKind) \
149 else CodecType(elementKind) 155 else CodecType(elementKind)
150 return "%s, %s, %s, %s" % \ 156 return "%s, %s, %s, %s" % \
151 (JavaScriptFieldOffset(pf), elementSize, elementCount, elementType) 157 (JavaScriptFieldOffset(pf), elementSize, elementCount, elementType)
152 158
153 def JavaScriptValidateStructParams(pf): 159 def JavaScriptValidateStructParams(pf):
154 return "%s, %s" % (JavaScriptFieldOffset(pf), pf.field.kind.name) 160 structType = JavaScriptType(pf.field.kind)
161 return "%s, %s" % (JavaScriptFieldOffset(pf), structType)
155 162
156 163
157 def TranslateConstants(token): 164 def TranslateConstants(token):
158 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)): 165 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
159 # Both variable and enum constants are constructed like: 166 # Both variable and enum constants are constructed like:
160 # NamespaceUid.Struct[.Enum].CONSTANT_NAME 167 # NamespaceUid.Struct[.Enum].CONSTANT_NAME
161 name = [] 168 name = []
162 if token.imported_from: 169 if token.imported_from:
163 name.append(token.imported_from["unique_name"]) 170 name.append(token.imported_from["unique_name"])
164 if token.parent_kind: 171 if token.parent_kind:
165 name.append(token.parent_kind.name) 172 name.append(token.parent_kind.name)
166 if isinstance(token, mojom.EnumValue): 173 if isinstance(token, mojom.EnumValue):
167 name.append(token.enum_name) 174 name.append(token.enum_name)
168 name.append(token.name) 175 name.append(token.name)
169 return ".".join(name) 176 return ".".join(name)
170 return token 177 return token
171 178
172 179
173 def ExpressionToText(value): 180 def ExpressionToText(value):
174 return TranslateConstants(value) 181 return TranslateConstants(value)
175 182
176 183
177 def JavascriptType(kind):
178 if kind.imported_from:
179 return kind.imported_from["unique_name"] + "." + kind.name
180 return kind.name
181
182 def IsArrayPointerField(field): 184 def IsArrayPointerField(field):
183 return mojom.IsAnyArrayKind(field.kind) 185 return mojom.IsAnyArrayKind(field.kind)
184 186
185 def IsStringPointerField(field): 187 def IsStringPointerField(field):
186 return mojom.IsStringKind(field.kind) 188 return mojom.IsStringKind(field.kind)
187 189
188 def IsStructPointerField(field): 190 def IsStructPointerField(field):
189 return mojom.IsStructKind(field.kind) 191 return mojom.IsStructKind(field.kind)
190 192
191 def IsHandleField(field): 193 def IsHandleField(field):
192 return mojom.IsAnyHandleKind(field.kind) 194 return mojom.IsAnyHandleKind(field.kind)
193 195
194 196
195 class Generator(generator.Generator): 197 class Generator(generator.Generator):
196 198
197 js_filters = { 199 js_filters = {
198 "default_value": JavaScriptDefaultValue, 200 "default_value": JavaScriptDefaultValue,
199 "payload_size": JavaScriptPayloadSize, 201 "payload_size": JavaScriptPayloadSize,
200 "decode_snippet": JavaScriptDecodeSnippet, 202 "decode_snippet": JavaScriptDecodeSnippet,
201 "encode_snippet": JavaScriptEncodeSnippet, 203 "encode_snippet": JavaScriptEncodeSnippet,
202 "expression_to_text": ExpressionToText, 204 "expression_to_text": ExpressionToText,
203 "field_offset": JavaScriptFieldOffset, 205 "field_offset": JavaScriptFieldOffset,
204 "has_callbacks": mojom.HasCallbacks, 206 "has_callbacks": mojom.HasCallbacks,
205 "is_array_pointer_field": IsArrayPointerField, 207 "is_array_pointer_field": IsArrayPointerField,
206 "is_struct_pointer_field": IsStructPointerField, 208 "is_struct_pointer_field": IsStructPointerField,
207 "is_string_pointer_field": IsStringPointerField, 209 "is_string_pointer_field": IsStringPointerField,
208 "is_handle_field": IsHandleField, 210 "is_handle_field": IsHandleField,
209 "js_type": JavascriptType, 211 "js_type": JavaScriptType,
210 "stylize_method": generator.StudlyCapsToCamel, 212 "stylize_method": generator.StudlyCapsToCamel,
211 "validate_array_params": JavaScriptValidateArrayParams, 213 "validate_array_params": JavaScriptValidateArrayParams,
212 "validate_struct_params": JavaScriptValidateStructParams, 214 "validate_struct_params": JavaScriptValidateStructParams,
213 } 215 }
214 216
215 @UseJinja("js_templates/module.js.tmpl", filters=js_filters) 217 @UseJinja("js_templates/module.js.tmpl", filters=js_filters)
216 def GenerateJsModule(self): 218 def GenerateJsModule(self):
217 return { 219 return {
218 "namespace": self.module.namespace, 220 "namespace": self.module.namespace,
219 "imports": self.GetImports(), 221 "imports": self.GetImports(),
220 "kinds": self.module.kinds, 222 "kinds": self.module.kinds,
221 "enums": self.module.enums, 223 "enums": self.module.enums,
222 "module": self.module, 224 "module": self.module,
223 "structs": self.GetStructs() + self.GetStructsFromMethods(), 225 "structs": self.GetStructs() + self.GetStructsFromMethods(),
224 "interfaces": self.module.interfaces, 226 "interfaces": self.module.interfaces,
225 } 227 }
226 228
227 def GenerateFiles(self, args): 229 def GenerateFiles(self, args):
228 self.Write(self.GenerateJsModule(), "%s.js" % self.module.name) 230 self.Write(self.GenerateJsModule(), "%s.js" % self.module.name)
229 231
230 def GetImports(self): 232 def GetImports(self):
231 # Since each import is assigned a variable in JS, they need to have unique 233 # Since each import is assigned a variable in JS, they need to have unique
232 # names. 234 # names.
233 counter = 1 235 counter = 1
234 for each in self.module.imports: 236 for each in self.module.imports:
235 each["unique_name"] = "import" + str(counter) 237 each["unique_name"] = "import" + str(counter)
236 counter += 1 238 counter += 1
237 return self.module.imports 239 return self.module.imports
OLDNEW
« no previous file with comments | « mojo/public/js/bindings/codec_unittests.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698