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

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

Issue 490623003: Add JS bindings validation logic for non-nullable types (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync 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/tools/bindings/generators/js_templates/struct_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 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 mojom.INT16: "codec.Int16", 78 mojom.INT16: "codec.Int16",
79 mojom.UINT16: "codec.Uint16", 79 mojom.UINT16: "codec.Uint16",
80 mojom.INT32: "codec.Int32", 80 mojom.INT32: "codec.Int32",
81 mojom.UINT32: "codec.Uint32", 81 mojom.UINT32: "codec.Uint32",
82 mojom.FLOAT: "codec.Float", 82 mojom.FLOAT: "codec.Float",
83 mojom.HANDLE: "codec.Handle", 83 mojom.HANDLE: "codec.Handle",
84 mojom.DCPIPE: "codec.Handle", 84 mojom.DCPIPE: "codec.Handle",
85 mojom.DPPIPE: "codec.Handle", 85 mojom.DPPIPE: "codec.Handle",
86 mojom.MSGPIPE: "codec.Handle", 86 mojom.MSGPIPE: "codec.Handle",
87 mojom.SHAREDBUFFER: "codec.Handle", 87 mojom.SHAREDBUFFER: "codec.Handle",
88 mojom.NULLABLE_HANDLE: "codec.Handle", 88 mojom.NULLABLE_HANDLE: "codec.NullableHandle",
89 mojom.NULLABLE_DCPIPE: "codec.Handle", 89 mojom.NULLABLE_DCPIPE: "codec.NullableHandle",
90 mojom.NULLABLE_DPPIPE: "codec.Handle", 90 mojom.NULLABLE_DPPIPE: "codec.NullableHandle",
91 mojom.NULLABLE_MSGPIPE: "codec.Handle", 91 mojom.NULLABLE_MSGPIPE: "codec.NullableHandle",
92 mojom.NULLABLE_SHAREDBUFFER: "codec.Handle", 92 mojom.NULLABLE_SHAREDBUFFER: "codec.NullableHandle",
93 mojom.INT64: "codec.Int64", 93 mojom.INT64: "codec.Int64",
94 mojom.UINT64: "codec.Uint64", 94 mojom.UINT64: "codec.Uint64",
95 mojom.DOUBLE: "codec.Double", 95 mojom.DOUBLE: "codec.Double",
96 mojom.STRING: "codec.String", 96 mojom.STRING: "codec.String",
97 mojom.NULLABLE_STRING: "codec.String", 97 mojom.NULLABLE_STRING: "codec.NullableString",
98 } 98 }
99 99
100 100
101 def CodecType(kind): 101 def CodecType(kind):
102 if kind in mojom.PRIMITIVES: 102 if kind in mojom.PRIMITIVES:
103 return _kind_to_codec_type[kind] 103 return _kind_to_codec_type[kind]
104 if mojom.IsStructKind(kind): 104 if mojom.IsStructKind(kind):
105 return "new codec.PointerTo(%s)" % JavaScriptType(kind) 105 pointer_type = "NullablePointerTo" if mojom.IsNullableKind(kind) \
106 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind): 106 else "PointerTo"
107 return "new codec.ArrayOf(codec.PackedBool)" 107 return "new codec.%s(%s)" % (pointer_type, JavaScriptType(kind))
108 if mojom.IsAnyArrayKind(kind): 108 if mojom.IsAnyArrayKind(kind):
109 return "new codec.ArrayOf(%s)" % CodecType(kind.kind) 109 array_type = "NullableArrayOf" if mojom.IsNullableKind(kind) else "ArrayOf"
110 element_type = "codec.PackedBool" if mojom.IsBoolKind(kind.kind) \
111 else CodecType(kind.kind)
112 return "new codec.%s(%s)" % (array_type, element_type)
110 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 113 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
111 return CodecType(mojom.MSGPIPE) 114 return CodecType(mojom.MSGPIPE)
112 if mojom.IsEnumKind(kind): 115 if mojom.IsEnumKind(kind):
113 return _kind_to_codec_type[mojom.INT32] 116 return _kind_to_codec_type[mojom.INT32]
114 return kind 117 return kind
115 118
116 119
117 def JavaScriptDecodeSnippet(kind): 120 def JavaScriptDecodeSnippet(kind):
118 if kind in mojom.PRIMITIVES: 121 if kind in mojom.PRIMITIVES:
119 return "decodeStruct(%s)" % CodecType(kind) 122 return "decodeStruct(%s)" % CodecType(kind)
(...skipping 20 matching lines...) Expand all
140 return "encodeArrayPointer(%s, " % CodecType(kind.kind) 143 return "encodeArrayPointer(%s, " % CodecType(kind.kind)
141 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 144 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
142 return JavaScriptEncodeSnippet(mojom.MSGPIPE) 145 return JavaScriptEncodeSnippet(mojom.MSGPIPE)
143 if mojom.IsEnumKind(kind): 146 if mojom.IsEnumKind(kind):
144 return JavaScriptEncodeSnippet(mojom.INT32) 147 return JavaScriptEncodeSnippet(mojom.INT32)
145 148
146 149
147 def JavaScriptFieldOffset(packed_field): 150 def JavaScriptFieldOffset(packed_field):
148 return "offset + codec.kStructHeaderSize + %s" % packed_field.offset 151 return "offset + codec.kStructHeaderSize + %s" % packed_field.offset
149 152
150 def JavaScriptValidateArrayParams(pf):
151 elementKind = pf.field.kind.kind
152 elementSize = pack.PackedField.GetSizeForKind(elementKind)
153 elementCount = generator.ExpectedArraySize(pf.field.kind)
154 elementType = "codec.PackedBool" if mojom.IsBoolKind(elementKind) \
155 else CodecType(elementKind)
156 return "%s, %s, %s, %s" % \
157 (JavaScriptFieldOffset(pf), elementSize, elementCount, elementType)
158 153
159 def JavaScriptValidateStructParams(pf): 154 def JavaScriptNullableParam(packed_field):
160 structType = JavaScriptType(pf.field.kind) 155 return "true" if mojom.IsNullableKind(packed_field.field.kind) else "false"
161 return "%s, %s" % (JavaScriptFieldOffset(pf), structType) 156
157
158 def JavaScriptValidateArrayParams(packed_field):
159 nullable = JavaScriptNullableParam(packed_field)
160 field_offset = JavaScriptFieldOffset(packed_field)
161 element_kind = packed_field.field.kind.kind
162 element_size = pack.PackedField.GetSizeForKind(element_kind)
163 element_count = generator.ExpectedArraySize(packed_field.field.kind)
164 element_type = "codec.PackedBool" if mojom.IsBoolKind(element_kind) \
165 else CodecType(element_kind)
166 return "%s, %s, %s, %s, %s" % \
167 (field_offset, element_size, element_count, element_type, nullable)
168
169
170 def JavaScriptValidateStructParams(packed_field):
171 nullable = JavaScriptNullableParam(packed_field)
172 field_offset = JavaScriptFieldOffset(packed_field)
173 struct_type = JavaScriptType(packed_field.field.kind)
174 return "%s, %s, %s" % (field_offset, struct_type, nullable)
175
176
177 def JavaScriptValidateStringParams(packed_field):
178 nullable = JavaScriptNullableParam(packed_field)
179 return "%s, %s" % (JavaScriptFieldOffset(packed_field), nullable)
180
181
182 def JavaScriptValidateHandleParams(packed_field):
183 nullable = JavaScriptNullableParam(packed_field)
184 field_offset = JavaScriptFieldOffset(packed_field)
185 return "%s, %s" % (field_offset, nullable)
162 186
163 187
164 def TranslateConstants(token): 188 def TranslateConstants(token):
165 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)): 189 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
166 # Both variable and enum constants are constructed like: 190 # Both variable and enum constants are constructed like:
167 # NamespaceUid.Struct[.Enum].CONSTANT_NAME 191 # NamespaceUid.Struct[.Enum].CONSTANT_NAME
168 name = [] 192 name = []
169 if token.imported_from: 193 if token.imported_from:
170 name.append(token.imported_from["unique_name"]) 194 name.append(token.imported_from["unique_name"])
171 if token.parent_kind: 195 if token.parent_kind:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 "expression_to_text": ExpressionToText, 228 "expression_to_text": ExpressionToText,
205 "field_offset": JavaScriptFieldOffset, 229 "field_offset": JavaScriptFieldOffset,
206 "has_callbacks": mojom.HasCallbacks, 230 "has_callbacks": mojom.HasCallbacks,
207 "is_array_pointer_field": IsArrayPointerField, 231 "is_array_pointer_field": IsArrayPointerField,
208 "is_struct_pointer_field": IsStructPointerField, 232 "is_struct_pointer_field": IsStructPointerField,
209 "is_string_pointer_field": IsStringPointerField, 233 "is_string_pointer_field": IsStringPointerField,
210 "is_handle_field": IsHandleField, 234 "is_handle_field": IsHandleField,
211 "js_type": JavaScriptType, 235 "js_type": JavaScriptType,
212 "stylize_method": generator.StudlyCapsToCamel, 236 "stylize_method": generator.StudlyCapsToCamel,
213 "validate_array_params": JavaScriptValidateArrayParams, 237 "validate_array_params": JavaScriptValidateArrayParams,
238 "validate_handle_params": JavaScriptValidateHandleParams,
239 "validate_string_params": JavaScriptValidateStringParams,
214 "validate_struct_params": JavaScriptValidateStructParams, 240 "validate_struct_params": JavaScriptValidateStructParams,
215 } 241 }
216 242
217 @UseJinja("js_templates/module.js.tmpl", filters=js_filters) 243 @UseJinja("js_templates/module.js.tmpl", filters=js_filters)
218 def GenerateJsModule(self): 244 def GenerateJsModule(self):
219 return { 245 return {
220 "namespace": self.module.namespace, 246 "namespace": self.module.namespace,
221 "imports": self.GetImports(), 247 "imports": self.GetImports(),
222 "kinds": self.module.kinds, 248 "kinds": self.module.kinds,
223 "enums": self.module.enums, 249 "enums": self.module.enums,
224 "module": self.module, 250 "module": self.module,
225 "structs": self.GetStructs() + self.GetStructsFromMethods(), 251 "structs": self.GetStructs() + self.GetStructsFromMethods(),
226 "interfaces": self.module.interfaces, 252 "interfaces": self.module.interfaces,
227 } 253 }
228 254
229 def GenerateFiles(self, args): 255 def GenerateFiles(self, args):
230 self.Write(self.GenerateJsModule(), "%s.js" % self.module.name) 256 self.Write(self.GenerateJsModule(), "%s.js" % self.module.name)
231 257
232 def GetImports(self): 258 def GetImports(self):
233 # Since each import is assigned a variable in JS, they need to have unique 259 # Since each import is assigned a variable in JS, they need to have unique
234 # names. 260 # names.
235 counter = 1 261 counter = 1
236 for each in self.module.imports: 262 for each in self.module.imports:
237 each["unique_name"] = "import" + str(counter) 263 each["unique_name"] = "import" + str(counter)
238 counter += 1 264 counter += 1
239 return self.module.imports 265 return self.module.imports
OLDNEW
« no previous file with comments | « mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698