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

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: 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
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 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 mojom.INT16: "codec.Int16", 72 mojom.INT16: "codec.Int16",
73 mojom.UINT16: "codec.Uint16", 73 mojom.UINT16: "codec.Uint16",
74 mojom.INT32: "codec.Int32", 74 mojom.INT32: "codec.Int32",
75 mojom.UINT32: "codec.Uint32", 75 mojom.UINT32: "codec.Uint32",
76 mojom.FLOAT: "codec.Float", 76 mojom.FLOAT: "codec.Float",
77 mojom.HANDLE: "codec.Handle", 77 mojom.HANDLE: "codec.Handle",
78 mojom.DCPIPE: "codec.Handle", 78 mojom.DCPIPE: "codec.Handle",
79 mojom.DPPIPE: "codec.Handle", 79 mojom.DPPIPE: "codec.Handle",
80 mojom.MSGPIPE: "codec.Handle", 80 mojom.MSGPIPE: "codec.Handle",
81 mojom.SHAREDBUFFER: "codec.Handle", 81 mojom.SHAREDBUFFER: "codec.Handle",
82 mojom.NULLABLE_HANDLE: "codec.Handle", 82 mojom.NULLABLE_HANDLE: "codec.NullableHandle",
83 mojom.NULLABLE_DCPIPE: "codec.Handle", 83 mojom.NULLABLE_DCPIPE: "codec.NullableHandle",
84 mojom.NULLABLE_DPPIPE: "codec.Handle", 84 mojom.NULLABLE_DPPIPE: "codec.NullableHandle",
85 mojom.NULLABLE_MSGPIPE: "codec.Handle", 85 mojom.NULLABLE_MSGPIPE: "codec.NullableHandle",
86 mojom.NULLABLE_SHAREDBUFFER: "codec.Handle", 86 mojom.NULLABLE_SHAREDBUFFER: "codec.NullableHandle",
87 mojom.INT64: "codec.Int64", 87 mojom.INT64: "codec.Int64",
88 mojom.UINT64: "codec.Uint64", 88 mojom.UINT64: "codec.Uint64",
89 mojom.DOUBLE: "codec.Double", 89 mojom.DOUBLE: "codec.Double",
90 mojom.STRING: "codec.String", 90 mojom.STRING: "codec.String",
91 mojom.NULLABLE_STRING: "codec.String", 91 mojom.NULLABLE_STRING: "codec.NullableString",
92 } 92 }
93 93
94 94
95 def CodecType(kind): 95 def CodecType(kind):
96 if kind in mojom.PRIMITIVES: 96 if kind in mojom.PRIMITIVES:
97 return _kind_to_codec_type[kind] 97 return _kind_to_codec_type[kind]
98 if mojom.IsStructKind(kind): 98 if mojom.IsStructKind(kind):
99 return "new codec.PointerTo(%s)" % CodecType(kind.name) 99 ptrType = "NullablePointerTo" if mojom.IsNullableKind(kind) else "PointerTo"
yzshen1 2014/08/20 17:04:20 please use naming style ptr_type. (here and below)
hansmuller 2014/08/20 17:46:31 Done.
100 return "new codec.%s(%s)" % (ptrType, CodecType(kind.name))
100 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind): 101 if mojom.IsAnyArrayKind(kind) and mojom.IsBoolKind(kind.kind):
yzshen1 2014/08/20 17:04:21 nit: maybe we could merge this if-block into the n
hansmuller 2014/08/20 17:46:31 Done.
101 return "new codec.ArrayOf(codec.PackedBool)" 102 arrayType = "NullableArrayOf" if mojom.IsNullableKind(kind) else "ArrayOf"
103 return "new codec.%s(codec.PackedBool)" % arrayType
102 if mojom.IsAnyArrayKind(kind): 104 if mojom.IsAnyArrayKind(kind):
103 return "new codec.ArrayOf(%s)" % CodecType(kind.kind) 105 arrayType = "NullableArrayOf" if mojom.IsNullableKind(kind) else "ArrayOf"
106 return "new codec.%s(%s)" % (arrayType, CodecType(kind.kind))
104 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 107 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
105 return CodecType(mojom.MSGPIPE) 108 return CodecType(mojom.MSGPIPE)
106 if mojom.IsEnumKind(kind): 109 if mojom.IsEnumKind(kind):
107 return _kind_to_codec_type[mojom.INT32] 110 return _kind_to_codec_type[mojom.INT32]
108 return kind 111 return kind
109 112
110 113
111 def JavaScriptDecodeSnippet(kind): 114 def JavaScriptDecodeSnippet(kind):
112 if kind in mojom.PRIMITIVES: 115 if kind in mojom.PRIMITIVES:
113 return "decodeStruct(%s)" % CodecType(kind) 116 return "decodeStruct(%s)" % CodecType(kind)
(...skipping 20 matching lines...) Expand all
134 return "encodeArrayPointer(%s, " % CodecType(kind.kind) 137 return "encodeArrayPointer(%s, " % CodecType(kind.kind)
135 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): 138 if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
136 return JavaScriptEncodeSnippet(mojom.MSGPIPE) 139 return JavaScriptEncodeSnippet(mojom.MSGPIPE)
137 if mojom.IsEnumKind(kind): 140 if mojom.IsEnumKind(kind):
138 return JavaScriptEncodeSnippet(mojom.INT32) 141 return JavaScriptEncodeSnippet(mojom.INT32)
139 142
140 143
141 def JavaScriptFieldOffset(packed_field): 144 def JavaScriptFieldOffset(packed_field):
142 return "offset + codec.kStructHeaderSize + %s" % packed_field.offset 145 return "offset + codec.kStructHeaderSize + %s" % packed_field.offset
143 146
147
148 def JavaScriptNullableParam(pf):
yzshen1 2014/08/20 17:04:20 packed_field may be a better name than pf. (like l
hansmuller 2014/08/20 17:46:31 Done.
149 return "true" if mojom.IsNullableKind(pf.field.kind) else "false"
150
151
144 def JavaScriptValidateArrayParams(pf): 152 def JavaScriptValidateArrayParams(pf):
145 elementKind = pf.field.kind.kind 153 nullable = JavaScriptNullableParam(pf)
146 elementSize = pack.PackedField.GetSizeForKind(elementKind) 154 eltKind = pf.field.kind.kind
yzshen1 2014/08/20 17:04:20 element_kind is actually better than elt_kind acco
hansmuller 2014/08/20 17:46:31 Done.
147 elementCount = generator.ExpectedArraySize(pf.field.kind) 155 eltSize = pack.PackedField.GetSizeForKind(eltKind)
148 elementType = "codec.PackedBool" if mojom.IsBoolKind(elementKind) \ 156 eltCount = generator.ExpectedArraySize(pf.field.kind)
149 else CodecType(elementKind) 157 eltType = "codec.PackedBool" if mojom.IsBoolKind(eltKind) \
150 return "%s, %s, %s, %s" % \ 158 else CodecType(eltKind)
151 (JavaScriptFieldOffset(pf), elementSize, elementCount, elementType) 159 return "%s, %s, %s, %s, %s" % \
160 (JavaScriptFieldOffset(pf), eltSize, eltCount, eltType, nullable)
yzshen1 2014/08/20 17:04:20 wrong indent.
hansmuller 2014/08/20 17:46:31 Done.
161
152 162
153 def JavaScriptValidateStructParams(pf): 163 def JavaScriptValidateStructParams(pf):
154 return "%s, %s" % (JavaScriptFieldOffset(pf), pf.field.kind.name) 164 nullable = JavaScriptNullableParam(pf)
165 structType = pf.field.kind.name
166 return "%s, %s, %s" % (JavaScriptFieldOffset(pf), structType, nullable)
167
168
169 def JavaScriptValidateStringParams(pf):
170 nullable = JavaScriptNullableParam(pf)
171 return "%s, %s" % (JavaScriptFieldOffset(pf), nullable)
172
173
174 def JavaScriptValidateHandleParams(pf):
175 nullable = JavaScriptNullableParam(pf)
176 return "%s, %s" % (JavaScriptFieldOffset(pf), nullable)
155 177
156 178
157 def TranslateConstants(token): 179 def TranslateConstants(token):
158 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)): 180 if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
159 # Both variable and enum constants are constructed like: 181 # Both variable and enum constants are constructed like:
160 # NamespaceUid.Struct[.Enum].CONSTANT_NAME 182 # NamespaceUid.Struct[.Enum].CONSTANT_NAME
161 name = [] 183 name = []
162 if token.imported_from: 184 if token.imported_from:
163 name.append(token.imported_from["unique_name"]) 185 name.append(token.imported_from["unique_name"])
164 if token.parent_kind: 186 if token.parent_kind:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 "expression_to_text": ExpressionToText, 224 "expression_to_text": ExpressionToText,
203 "field_offset": JavaScriptFieldOffset, 225 "field_offset": JavaScriptFieldOffset,
204 "has_callbacks": mojom.HasCallbacks, 226 "has_callbacks": mojom.HasCallbacks,
205 "is_array_pointer_field": IsArrayPointerField, 227 "is_array_pointer_field": IsArrayPointerField,
206 "is_struct_pointer_field": IsStructPointerField, 228 "is_struct_pointer_field": IsStructPointerField,
207 "is_string_pointer_field": IsStringPointerField, 229 "is_string_pointer_field": IsStringPointerField,
208 "is_handle_field": IsHandleField, 230 "is_handle_field": IsHandleField,
209 "js_type": JavascriptType, 231 "js_type": JavascriptType,
210 "stylize_method": generator.StudlyCapsToCamel, 232 "stylize_method": generator.StudlyCapsToCamel,
211 "validate_array_params": JavaScriptValidateArrayParams, 233 "validate_array_params": JavaScriptValidateArrayParams,
234 "validate_handle_params": JavaScriptValidateHandleParams,
235 "validate_string_params": JavaScriptValidateStringParams,
212 "validate_struct_params": JavaScriptValidateStructParams, 236 "validate_struct_params": JavaScriptValidateStructParams,
213 } 237 }
214 238
215 @UseJinja("js_templates/module.js.tmpl", filters=js_filters) 239 @UseJinja("js_templates/module.js.tmpl", filters=js_filters)
216 def GenerateJsModule(self): 240 def GenerateJsModule(self):
217 return { 241 return {
218 "namespace": self.module.namespace, 242 "namespace": self.module.namespace,
219 "imports": self.GetImports(), 243 "imports": self.GetImports(),
220 "kinds": self.module.kinds, 244 "kinds": self.module.kinds,
221 "enums": self.module.enums, 245 "enums": self.module.enums,
222 "module": self.module, 246 "module": self.module,
223 "structs": self.GetStructs() + self.GetStructsFromMethods(), 247 "structs": self.GetStructs() + self.GetStructsFromMethods(),
224 "interfaces": self.module.interfaces, 248 "interfaces": self.module.interfaces,
225 } 249 }
226 250
227 def GenerateFiles(self, args): 251 def GenerateFiles(self, args):
228 self.Write(self.GenerateJsModule(), "%s.js" % self.module.name) 252 self.Write(self.GenerateJsModule(), "%s.js" % self.module.name)
229 253
230 def GetImports(self): 254 def GetImports(self):
231 # Since each import is assigned a variable in JS, they need to have unique 255 # Since each import is assigned a variable in JS, they need to have unique
232 # names. 256 # names.
233 counter = 1 257 counter = 1
234 for each in self.module.imports: 258 for each in self.module.imports:
235 each["unique_name"] = "import" + str(counter) 259 each["unique_name"] = "import" + str(counter)
236 counter += 1 260 counter += 1
237 return self.module.imports 261 return self.module.imports
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698