Chromium Code Reviews| 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 |