Index: mojo/public/tools/bindings/generators/mojom_js_generator.py |
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py |
deleted file mode 100644 |
index 7aaeaa28f02e2a80965112184ee793feb438f88b..0000000000000000000000000000000000000000 |
--- a/mojo/public/tools/bindings/generators/mojom_js_generator.py |
+++ /dev/null |
@@ -1,380 +0,0 @@ |
-# Copyright 2013 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""Generates JavaScript source files from a mojom.Module.""" |
- |
-import mojom.generate.generator as generator |
-import mojom.generate.module as mojom |
-import mojom.generate.pack as pack |
-from mojom.generate.template_expander import UseJinja |
- |
-_kind_to_javascript_default_value = { |
- mojom.BOOL: "false", |
- mojom.INT8: "0", |
- mojom.UINT8: "0", |
- mojom.INT16: "0", |
- mojom.UINT16: "0", |
- mojom.INT32: "0", |
- mojom.UINT32: "0", |
- mojom.FLOAT: "0", |
- mojom.HANDLE: "null", |
- mojom.DCPIPE: "null", |
- mojom.DPPIPE: "null", |
- mojom.MSGPIPE: "null", |
- mojom.SHAREDBUFFER: "null", |
- mojom.NULLABLE_HANDLE: "null", |
- mojom.NULLABLE_DCPIPE: "null", |
- mojom.NULLABLE_DPPIPE: "null", |
- mojom.NULLABLE_MSGPIPE: "null", |
- mojom.NULLABLE_SHAREDBUFFER: "null", |
- mojom.INT64: "0", |
- mojom.UINT64: "0", |
- mojom.DOUBLE: "0", |
- mojom.STRING: "null", |
- mojom.NULLABLE_STRING: "null" |
-} |
- |
- |
-def JavaScriptType(kind): |
- if kind.imported_from: |
- return kind.imported_from["unique_name"] + "." + kind.name |
- return kind.name |
- |
- |
-def JavaScriptDefaultValue(field): |
- if field.default: |
- if mojom.IsStructKind(field.kind): |
- assert field.default == "default" |
- return "new %s()" % JavaScriptType(field.kind) |
- return ExpressionToText(field.default) |
- if field.kind in mojom.PRIMITIVES: |
- return _kind_to_javascript_default_value[field.kind] |
- if mojom.IsStructKind(field.kind): |
- return "null" |
- if mojom.IsArrayKind(field.kind): |
- return "null" |
- if mojom.IsMapKind(field.kind): |
- return "null" |
- if mojom.IsInterfaceKind(field.kind) or \ |
- mojom.IsInterfaceRequestKind(field.kind): |
- return _kind_to_javascript_default_value[mojom.MSGPIPE] |
- if mojom.IsEnumKind(field.kind): |
- return "0" |
- |
- |
-def JavaScriptPayloadSize(packed): |
- packed_fields = packed.packed_fields |
- if not packed_fields: |
- return 0 |
- last_field = packed_fields[-1] |
- offset = last_field.offset + last_field.size |
- pad = pack.GetPad(offset, 8) |
- return offset + pad |
- |
- |
-_kind_to_codec_type = { |
- mojom.BOOL: "codec.Uint8", |
- mojom.INT8: "codec.Int8", |
- mojom.UINT8: "codec.Uint8", |
- mojom.INT16: "codec.Int16", |
- mojom.UINT16: "codec.Uint16", |
- mojom.INT32: "codec.Int32", |
- mojom.UINT32: "codec.Uint32", |
- mojom.FLOAT: "codec.Float", |
- mojom.HANDLE: "codec.Handle", |
- mojom.DCPIPE: "codec.Handle", |
- mojom.DPPIPE: "codec.Handle", |
- mojom.MSGPIPE: "codec.Handle", |
- mojom.SHAREDBUFFER: "codec.Handle", |
- mojom.NULLABLE_HANDLE: "codec.NullableHandle", |
- mojom.NULLABLE_DCPIPE: "codec.NullableHandle", |
- mojom.NULLABLE_DPPIPE: "codec.NullableHandle", |
- mojom.NULLABLE_MSGPIPE: "codec.NullableHandle", |
- mojom.NULLABLE_SHAREDBUFFER: "codec.NullableHandle", |
- mojom.INT64: "codec.Int64", |
- mojom.UINT64: "codec.Uint64", |
- mojom.DOUBLE: "codec.Double", |
- mojom.STRING: "codec.String", |
- mojom.NULLABLE_STRING: "codec.NullableString", |
-} |
- |
- |
-def CodecType(kind): |
- if kind in mojom.PRIMITIVES: |
- return _kind_to_codec_type[kind] |
- if mojom.IsStructKind(kind): |
- pointer_type = "NullablePointerTo" if mojom.IsNullableKind(kind) \ |
- else "PointerTo" |
- return "new codec.%s(%s)" % (pointer_type, JavaScriptType(kind)) |
- if mojom.IsArrayKind(kind): |
- array_type = "NullableArrayOf" if mojom.IsNullableKind(kind) else "ArrayOf" |
- array_length = "" if kind.length is None else ", %d" % kind.length |
- element_type = ElementCodecType(kind.kind) |
- return "new codec.%s(%s%s)" % (array_type, element_type, array_length) |
- if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): |
- return CodecType(mojom.MSGPIPE) |
- if mojom.IsEnumKind(kind): |
- return _kind_to_codec_type[mojom.INT32] |
- if mojom.IsMapKind(kind): |
- map_type = "NullableMapOf" if mojom.IsNullableKind(kind) else "MapOf" |
- key_type = ElementCodecType(kind.key_kind) |
- value_type = ElementCodecType(kind.value_kind) |
- return "new codec.%s(%s, %s)" % (map_type, key_type, value_type) |
- return kind |
- |
-def ElementCodecType(kind): |
- return "codec.PackedBool" if mojom.IsBoolKind(kind) else CodecType(kind) |
- |
-def JavaScriptDecodeSnippet(kind): |
- if kind in mojom.PRIMITIVES: |
- return "decodeStruct(%s)" % CodecType(kind) |
- if mojom.IsStructKind(kind): |
- return "decodeStructPointer(%s)" % JavaScriptType(kind) |
- if mojom.IsMapKind(kind): |
- return "decodeMapPointer(%s, %s)" % \ |
- (ElementCodecType(kind.key_kind), ElementCodecType(kind.value_kind)) |
- if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind): |
- return "decodeArrayPointer(codec.PackedBool)" |
- if mojom.IsArrayKind(kind): |
- return "decodeArrayPointer(%s)" % CodecType(kind.kind) |
- if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): |
- return JavaScriptDecodeSnippet(mojom.MSGPIPE) |
- if mojom.IsEnumKind(kind): |
- return JavaScriptDecodeSnippet(mojom.INT32) |
- |
- |
-def JavaScriptEncodeSnippet(kind): |
- if kind in mojom.PRIMITIVES: |
- return "encodeStruct(%s, " % CodecType(kind) |
- if mojom.IsStructKind(kind): |
- return "encodeStructPointer(%s, " % JavaScriptType(kind) |
- if mojom.IsMapKind(kind): |
- return "encodeMapPointer(%s, %s, " % \ |
- (ElementCodecType(kind.key_kind), ElementCodecType(kind.value_kind)) |
- if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind): |
- return "encodeArrayPointer(codec.PackedBool, "; |
- if mojom.IsArrayKind(kind): |
- return "encodeArrayPointer(%s, " % CodecType(kind.kind) |
- if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind): |
- return JavaScriptEncodeSnippet(mojom.MSGPIPE) |
- if mojom.IsEnumKind(kind): |
- return JavaScriptEncodeSnippet(mojom.INT32) |
- |
- |
-def JavaScriptFieldOffset(packed_field): |
- return "offset + codec.kStructHeaderSize + %s" % packed_field.offset |
- |
- |
-def JavaScriptNullableParam(packed_field): |
- return "true" if mojom.IsNullableKind(packed_field.field.kind) else "false" |
- |
- |
-def GetArrayExpectedDimensionSizes(kind): |
- expected_dimension_sizes = [] |
- while mojom.IsArrayKind(kind): |
- expected_dimension_sizes.append(generator.ExpectedArraySize(kind) or 0) |
- kind = kind.kind |
- # Strings are serialized as variable-length arrays. |
- if (mojom.IsStringKind(kind)): |
- expected_dimension_sizes.append(0) |
- return expected_dimension_sizes |
- |
- |
-def JavaScriptValidateArrayParams(packed_field): |
- nullable = JavaScriptNullableParam(packed_field) |
- field_offset = JavaScriptFieldOffset(packed_field) |
- element_kind = packed_field.field.kind.kind |
- element_size = pack.PackedField.GetSizeForKind(element_kind) |
- expected_dimension_sizes = GetArrayExpectedDimensionSizes( |
- packed_field.field.kind) |
- element_type = ElementCodecType(element_kind) |
- return "%s, %s, %s, %s, %s, 0" % \ |
- (field_offset, element_size, element_type, nullable, |
- expected_dimension_sizes) |
- |
- |
-def JavaScriptValidateStructParams(packed_field): |
- nullable = JavaScriptNullableParam(packed_field) |
- field_offset = JavaScriptFieldOffset(packed_field) |
- struct_type = JavaScriptType(packed_field.field.kind) |
- return "%s, %s, %s" % (field_offset, struct_type, nullable) |
- |
- |
-def JavaScriptValidateMapParams(packed_field): |
- nullable = JavaScriptNullableParam(packed_field) |
- field_offset = JavaScriptFieldOffset(packed_field) |
- keys_type = ElementCodecType(packed_field.field.kind.key_kind) |
- values_kind = packed_field.field.kind.value_kind; |
- values_type = ElementCodecType(values_kind) |
- values_nullable = "true" if mojom.IsNullableKind(values_kind) else "false" |
- return "%s, %s, %s, %s, %s" % \ |
- (field_offset, nullable, keys_type, values_type, values_nullable) |
- |
- |
-def JavaScriptValidateStringParams(packed_field): |
- nullable = JavaScriptNullableParam(packed_field) |
- return "%s, %s" % (JavaScriptFieldOffset(packed_field), nullable) |
- |
- |
-def JavaScriptValidateHandleParams(packed_field): |
- nullable = JavaScriptNullableParam(packed_field) |
- field_offset = JavaScriptFieldOffset(packed_field) |
- return "%s, %s" % (field_offset, nullable) |
- |
- |
- |
- |
-def JavaScriptProxyMethodParameterValue(parameter): |
- name = parameter.name; |
- if (IsInterfaceParameter(parameter)): |
- type = JavaScriptType(parameter.kind) |
- return "core.isHandle(%s) ? %s : connection.bindProxyClient" \ |
- "(%s, %s, %s.client)" % (name, name, name, type, type) |
- if (IsInterfaceRequestParameter(parameter)): |
- type = JavaScriptType(parameter.kind.kind) |
- return "core.isHandle(%s) ? %s : connection.bindProxyClient" \ |
- "(%s, %s.client, %s)" % (name, name, name, type, type) |
- return name; |
- |
-def JavaScriptStubMethodParameterValue(parameter): |
- name = parameter.name; |
- if (IsInterfaceParameter(parameter)): |
- type = JavaScriptType(parameter.kind) |
- return "connection.bindProxyHandle(%s, %s.client, %s)" % (name, type, type) |
- if (IsInterfaceRequestParameter(parameter)): |
- type = JavaScriptType(parameter.kind.kind) |
- return "connection.bindProxyHandle(%s, %s, %s.client)" % (name, type, type) |
- return name; |
- |
-def TranslateConstants(token): |
- if isinstance(token, (mojom.EnumValue, mojom.NamedValue)): |
- # Both variable and enum constants are constructed like: |
- # NamespaceUid.Struct[.Enum].CONSTANT_NAME |
- name = [] |
- if token.imported_from: |
- name.append(token.imported_from["unique_name"]) |
- if token.parent_kind: |
- name.append(token.parent_kind.name) |
- if isinstance(token, mojom.EnumValue): |
- name.append(token.enum.name) |
- name.append(token.name) |
- return ".".join(name) |
- |
- if isinstance(token, mojom.BuiltinValue): |
- if token.value == "double.INFINITY" or token.value == "float.INFINITY": |
- return "Infinity"; |
- if token.value == "double.NEGATIVE_INFINITY" or \ |
- token.value == "float.NEGATIVE_INFINITY": |
- return "-Infinity"; |
- if token.value == "double.NAN" or token.value == "float.NAN": |
- return "NaN"; |
- |
- return token |
- |
- |
-def ExpressionToText(value): |
- return TranslateConstants(value) |
- |
-def IsArrayPointerField(field): |
- return mojom.IsArrayKind(field.kind) |
- |
-def IsStringPointerField(field): |
- return mojom.IsStringKind(field.kind) |
- |
-def IsStructPointerField(field): |
- return mojom.IsStructKind(field.kind) |
- |
-def IsMapPointerField(field): |
- return mojom.IsMapKind(field.kind) |
- |
-def IsHandleField(field): |
- return mojom.IsAnyHandleKind(field.kind) |
- |
-def IsInterfaceRequestParameter(parameter): |
- return mojom.IsInterfaceRequestKind(parameter.kind) |
- |
-def IsInterfaceParameter(parameter): |
- return mojom.IsInterfaceKind(parameter.kind) |
- |
- |
-class Generator(generator.Generator): |
- |
- js_filters = { |
- "default_value": JavaScriptDefaultValue, |
- "payload_size": JavaScriptPayloadSize, |
- "decode_snippet": JavaScriptDecodeSnippet, |
- "encode_snippet": JavaScriptEncodeSnippet, |
- "expression_to_text": ExpressionToText, |
- "field_offset": JavaScriptFieldOffset, |
- "has_callbacks": mojom.HasCallbacks, |
- "is_array_pointer_field": IsArrayPointerField, |
- "is_map_pointer_field": IsMapPointerField, |
- "is_struct_pointer_field": IsStructPointerField, |
- "is_string_pointer_field": IsStringPointerField, |
- "is_handle_field": IsHandleField, |
- "js_type": JavaScriptType, |
- "is_interface_request_parameter": IsInterfaceRequestParameter, |
- "is_interface_parameter": IsInterfaceParameter, |
- "js_proxy_method_parameter_value": JavaScriptProxyMethodParameterValue, |
- "js_stub_method_parameter_value": JavaScriptStubMethodParameterValue, |
- "stylize_method": generator.StudlyCapsToCamel, |
- "validate_array_params": JavaScriptValidateArrayParams, |
- "validate_handle_params": JavaScriptValidateHandleParams, |
- "validate_map_params": JavaScriptValidateMapParams, |
- "validate_string_params": JavaScriptValidateStringParams, |
- "validate_struct_params": JavaScriptValidateStructParams, |
- } |
- |
- def GetParameters(self): |
- return { |
- "namespace": self.module.namespace, |
- "imports": self.GetImports(), |
- "kinds": self.module.kinds, |
- "enums": self.module.enums, |
- "module": self.module, |
- "structs": self.GetStructs() + self.GetStructsFromMethods(), |
- "interfaces": self.module.interfaces, |
- "imported_interfaces": self.GetImportedInterfaces(), |
- } |
- |
- @UseJinja("js_templates/module.amd.tmpl", filters=js_filters) |
- def GenerateAMDModule(self): |
- return self.GetParameters() |
- |
- @UseJinja("js_templates/module.sky.tmpl", filters=js_filters) |
- def GenerateHTMLModule(self): |
- return self.GetParameters() |
- |
- def GenerateFiles(self, args): |
- self.Write(self.GenerateAMDModule(), |
- self.MatchMojomFilePath("%s.js" % self.module.name)) |
- self.Write(self.GenerateHTMLModule(), |
- self.MatchMojomFilePath("%s.sky" % self.module.name)) |
- |
- def GetImports(self): |
- used_names = set() |
- for each_import in self.module.imports: |
- simple_name = each_import["module_name"].split(".")[0] |
- |
- # Since each import is assigned a variable in JS, they need to have unique |
- # names. |
- unique_name = simple_name |
- counter = 0 |
- while unique_name in used_names: |
- counter += 1 |
- unique_name = simple_name + str(counter) |
- |
- used_names.add(unique_name) |
- each_import["unique_name"] = unique_name + "$" |
- counter += 1 |
- return self.module.imports |
- |
- def GetImportedInterfaces(self): |
- interface_to_import = {}; |
- for each_import in self.module.imports: |
- for each_interface in each_import["module"].interfaces: |
- name = each_interface.name |
- interface_to_import[name] = each_import["unique_name"] + "." + name |
- return interface_to_import; |
- |