OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |