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

Unified Diff: mojo/public/tools/bindings/generators/mojom_dart_generator.py

Issue 674383002: Initial work on Dart bindings for Mojo. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Merge. Work on templates. Created 6 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/generators/mojom_dart_generator.py
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
similarity index 54%
copy from mojo/public/tools/bindings/generators/mojom_js_generator.py
copy to mojo/public/tools/bindings/generators/mojom_dart_generator.py
index 47fea232a0df698ac78a081bd1943309339c5dc6..5dc826079c974e027b48c06fcf5fdf22108b336e 100644
--- a/mojo/public/tools/bindings/generators/mojom_js_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_dart_generator.py
@@ -2,14 +2,14 @@
# 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."""
+"""Generates Dart 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 = {
+_kind_to_dart_default_value = {
mojom.BOOL: "false",
mojom.INT8: "0",
mojom.UINT8: "0",
@@ -18,16 +18,16 @@ _kind_to_javascript_default_value = {
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.HANDLE: "0",
+ mojom.DCPIPE: "0",
+ mojom.DPPIPE: "0",
+ mojom.MSGPIPE: "0",
+ mojom.SHAREDBUFFER: "0",
+ mojom.NULLABLE_HANDLE: "0",
+ mojom.NULLABLE_DCPIPE: "0",
+ mojom.NULLABLE_DPPIPE: "0",
+ mojom.NULLABLE_MSGPIPE: "0",
+ mojom.NULLABLE_SHAREDBUFFER: "0",
mojom.INT64: "0",
mojom.UINT64: "0",
mojom.DOUBLE: "0",
@@ -36,20 +36,47 @@ _kind_to_javascript_default_value = {
}
-def JavaScriptType(kind):
+_kind_to_dart_decl_type = {
+ mojom.BOOL: "bool",
+ mojom.INT8: "int",
+ mojom.UINT8: "int",
+ mojom.INT16: "int",
+ mojom.UINT16: "int",
+ mojom.INT32: "int",
+ mojom.UINT32: "int",
+ mojom.FLOAT: "double",
+ mojom.HANDLE: "int",
+ mojom.DCPIPE: "int",
+ mojom.DPPIPE: "int",
+ mojom.MSGPIPE: "int",
+ mojom.SHAREDBUFFER: "int",
+ mojom.NULLABLE_HANDLE: "int",
+ mojom.NULLABLE_DCPIPE: "int",
+ mojom.NULLABLE_DPPIPE: "int",
+ mojom.NULLABLE_MSGPIPE: "int",
+ mojom.NULLABLE_SHAREDBUFFER: "int",
+ mojom.INT64: "int",
+ mojom.UINT64: "int",
+ mojom.DOUBLE: "double",
+ mojom.STRING: "String",
+ mojom.NULLABLE_STRING: "String"
+}
+
+
+def DartType(kind):
if kind.imported_from:
return kind.imported_from["unique_name"] + "." + kind.name
return kind.name
-def JavaScriptDefaultValue(field):
+def DartDefaultValue(field):
if field.default:
if mojom.IsStructKind(field.kind):
assert field.default == "default"
- return "new %s()" % JavaScriptType(field.kind)
+ return "new %s()" % DartType(field.kind)
return ExpressionToText(field.default)
if field.kind in mojom.PRIMITIVES:
- return _kind_to_javascript_default_value[field.kind]
+ return _kind_to_dart_default_value[field.kind]
if mojom.IsStructKind(field.kind):
return "null"
if mojom.IsArrayKind(field.kind):
@@ -58,12 +85,30 @@ def JavaScriptDefaultValue(field):
return "null"
if mojom.IsInterfaceKind(field.kind) or \
mojom.IsInterfaceRequestKind(field.kind):
- return _kind_to_javascript_default_value[mojom.MSGPIPE]
+ return _kind_to_dart_default_value[mojom.MSGPIPE]
if mojom.IsEnumKind(field.kind):
return "0"
-def JavaScriptPayloadSize(packed):
+def DartDeclType(kind):
+ if kind in mojom.PRIMITIVES:
+ return _kind_to_dart_decl_type[kind]
+ if mojom.IsStructKind(kind):
+ return DartType(kind)
+ if mojom.IsArrayKind(kind):
+ array_type = DartDeclType(kind.kind)
+ return "List<" + array_type + ">"
+ if mojom.IsMapKind(kind):
+ key_type = DartDeclType(kind.key_kind)
+ value_type = DartDeclType(kind.value_kind)
+ return "Map<"+ key_type + ", " + value_type + ">"
+ if mojom.IsInterfaceKind(kind) or \
+ mojom.IsInterfaceRequestKind(kind):
+ return _kind_to_dart_decl_type[mojom.MSGPIPE]
+ if mojom.IsEnumKind(kind):
+ return "int"
+
+def DartPayloadSize(packed):
packed_fields = packed.packed_fields
if not packed_fields:
return 0
@@ -74,29 +119,29 @@ def JavaScriptPayloadSize(packed):
_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",
+ mojom.BOOL: "bindings.Uint8",
+ mojom.INT8: "bindings.Int8",
+ mojom.UINT8: "bindings.Uint8",
+ mojom.INT16: "bindings.Int16",
+ mojom.UINT16: "bindings.Uint16",
+ mojom.INT32: "bindings.Int32",
+ mojom.UINT32: "bindings.Uint32",
+ mojom.FLOAT: "bindings.Float",
+ mojom.HANDLE: "bindings.Handle",
+ mojom.DCPIPE: "bindings.Handle",
+ mojom.DPPIPE: "bindings.Handle",
+ mojom.MSGPIPE: "bindings.Handle",
+ mojom.SHAREDBUFFER: "bindings.Handle",
+ mojom.NULLABLE_HANDLE: "bindings.NullableHandle",
+ mojom.NULLABLE_DCPIPE: "bindings.NullableHandle",
+ mojom.NULLABLE_DPPIPE: "bindings.NullableHandle",
+ mojom.NULLABLE_MSGPIPE: "bindings.NullableHandle",
+ mojom.NULLABLE_SHAREDBUFFER: "bindings.NullableHandle",
+ mojom.INT64: "bindings.Int64",
+ mojom.UINT64: "bindings.Uint64",
+ mojom.DOUBLE: "bindings.Double",
+ mojom.STRING: "bindings.MojoString",
+ mojom.NULLABLE_STRING: "bindings.NullableMojoString",
}
@@ -106,13 +151,13 @@ def CodecType(kind):
if mojom.IsStructKind(kind):
pointer_type = "NullablePointerTo" if mojom.IsNullableKind(kind) \
else "PointerTo"
- return "new codec.%s(%s)" % (pointer_type, JavaScriptType(kind))
+ return "new bindings.%s(%s)" % (pointer_type, DartType(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 = "codec.PackedBool" if mojom.IsBoolKind(kind.kind) \
+ element_type = "bindings.PackedBool" if mojom.IsBoolKind(kind.kind) \
else CodecType(kind.kind)
- return "new codec.%s(%s%s)" % (array_type, element_type, array_length)
+ return "new bindings.%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):
@@ -120,49 +165,49 @@ def CodecType(kind):
return kind
def MapCodecType(kind):
- return "codec.PackedBool" if mojom.IsBoolKind(kind) else CodecType(kind)
+ return "bindings.PackedBool" if mojom.IsBoolKind(kind) else CodecType(kind)
-def JavaScriptDecodeSnippet(kind):
+def DartDecodeSnippet(kind):
if kind in mojom.PRIMITIVES:
return "decodeStruct(%s)" % CodecType(kind)
if mojom.IsStructKind(kind):
- return "decodeStructPointer(%s)" % JavaScriptType(kind)
+ return "decodeStructPointer(%s)" % DartType(kind)
if mojom.IsMapKind(kind):
return "decodeMapPointer(%s, %s)" % \
(MapCodecType(kind.key_kind), MapCodecType(kind.value_kind))
if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind):
- return "decodeArrayPointer(codec.PackedBool)"
+ return "decodeArrayPointer(bindings.PackedBool)"
if mojom.IsArrayKind(kind):
return "decodeArrayPointer(%s)" % CodecType(kind.kind)
if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
- return JavaScriptDecodeSnippet(mojom.MSGPIPE)
+ return DartDecodeSnippet(mojom.MSGPIPE)
if mojom.IsEnumKind(kind):
- return JavaScriptDecodeSnippet(mojom.INT32)
+ return DartDecodeSnippet(mojom.INT32)
-def JavaScriptEncodeSnippet(kind):
+def DartEncodeSnippet(kind):
if kind in mojom.PRIMITIVES:
return "encodeStruct(%s, " % CodecType(kind)
if mojom.IsStructKind(kind):
- return "encodeStructPointer(%s, " % JavaScriptType(kind)
+ return "encodeStructPointer(%s, " % DartType(kind)
if mojom.IsMapKind(kind):
return "encodeMapPointer(%s, %s, " % \
(MapCodecType(kind.key_kind), MapCodecType(kind.value_kind))
if mojom.IsArrayKind(kind) and mojom.IsBoolKind(kind.kind):
- return "encodeArrayPointer(codec.PackedBool, ";
+ return "encodeArrayPointer(bindings.PackedBool, ";
if mojom.IsArrayKind(kind):
return "encodeArrayPointer(%s, " % CodecType(kind.kind)
if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
- return JavaScriptEncodeSnippet(mojom.MSGPIPE)
+ return DartEncodeSnippet(mojom.MSGPIPE)
if mojom.IsEnumKind(kind):
- return JavaScriptEncodeSnippet(mojom.INT32)
+ return DartEncodeSnippet(mojom.INT32)
-def JavaScriptFieldOffset(packed_field):
- return "offset + codec.kStructHeaderSize + %s" % packed_field.offset
+def DartFieldOffset(packed_field):
+ return "offset + bindings.kStructHeaderSize + %s" % packed_field.offset
-def JavaScriptNullableParam(packed_field):
+def DartNullableParam(packed_field):
return "true" if mojom.IsNullableKind(packed_field.field.kind) else "false"
@@ -177,30 +222,30 @@ def GetArrayExpectedDimensionSizes(kind):
return expected_dimension_sizes
-def JavaScriptValidateArrayParams(packed_field):
- nullable = JavaScriptNullableParam(packed_field)
- field_offset = JavaScriptFieldOffset(packed_field)
+def DartValidateArrayParams(packed_field):
+ nullable = DartNullableParam(packed_field)
+ field_offset = DartFieldOffset(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 = "codec.PackedBool" if mojom.IsBoolKind(element_kind) \
+ element_type = "bindings.PackedBool" if mojom.IsBoolKind(element_kind) \
else CodecType(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)
+def DartValidateStructParams(packed_field):
+ nullable = DartNullableParam(packed_field)
+ field_offset = DartFieldOffset(packed_field)
+ struct_type = DartType(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)
+def DartValidateMapParams(packed_field):
+ nullable = DartNullableParam(packed_field)
+ field_offset = DartFieldOffset(packed_field)
keys_type = MapCodecType(packed_field.field.kind.key_kind)
values_kind = packed_field.field.kind.value_kind;
values_type = MapCodecType(values_kind)
@@ -209,14 +254,14 @@ def JavaScriptValidateMapParams(packed_field):
(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 DartValidateStringParams(packed_field):
+ nullable = DartNullableParam(packed_field)
+ return "%s, %s" % (DartFieldOffset(packed_field), nullable)
-def JavaScriptValidateHandleParams(packed_field):
- nullable = JavaScriptNullableParam(packed_field)
- field_offset = JavaScriptFieldOffset(packed_field)
+def DartValidateHandleParams(packed_field):
+ nullable = DartNullableParam(packed_field)
+ field_offset = DartFieldOffset(packed_field)
return "%s, %s" % (field_offset, nullable)
@@ -224,24 +269,23 @@ def TranslateConstants(token):
if isinstance(token, (mojom.EnumValue, mojom.NamedValue)):
# Both variable and enum constants are constructed like:
# NamespaceUid.Struct[.Enum].CONSTANT_NAME
- name = []
+ name = ""
if token.imported_from:
- name.append(token.imported_from["unique_name"])
+ name = token.imported_from["unique_name"] + "."
if token.parent_kind:
- name.append(token.parent_kind.name)
+ name = name + token.parent_kind.name + "."
if isinstance(token, mojom.EnumValue):
- name.append(token.enum.name)
- name.append(token.name)
- return ".".join(name)
+ name = name + token.enum.name + "_"
+ return name + token.name
if isinstance(token, mojom.BuiltinValue):
if token.value == "double.INFINITY" or token.value == "float.INFINITY":
- return "Infinity";
+ return "double.INFINITY";
if token.value == "double.NEGATIVE_INFINITY" or \
token.value == "float.NEGATIVE_INFINITY":
- return "-Infinity";
+ return "double.NEGATIVE_INFINITY";
if token.value == "double.NAN" or token.value == "float.NAN":
- return "NaN";
+ return "double.NAN";
return token
@@ -249,7 +293,6 @@ def TranslateConstants(token):
def ExpressionToText(value):
return TranslateConstants(value)
-
def IsArrayPointerField(field):
return mojom.IsArrayKind(field.kind)
@@ -268,26 +311,27 @@ def IsHandleField(field):
class Generator(generator.Generator):
- js_filters = {
- "default_value": JavaScriptDefaultValue,
- "payload_size": JavaScriptPayloadSize,
- "decode_snippet": JavaScriptDecodeSnippet,
- "encode_snippet": JavaScriptEncodeSnippet,
+ dart_filters = {
+ "default_value": DartDefaultValue,
+ "payload_size": DartPayloadSize,
+ "decode_snippet": DartDecodeSnippet,
+ "encode_snippet": DartEncodeSnippet,
"expression_to_text": ExpressionToText,
- "field_offset": JavaScriptFieldOffset,
+ "field_offset": DartFieldOffset,
"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,
+ "dart_type": DartType,
+ "dart_decl_type": DartDeclType,
"stylize_method": generator.StudlyCapsToCamel,
- "validate_array_params": JavaScriptValidateArrayParams,
- "validate_handle_params": JavaScriptValidateHandleParams,
- "validate_map_params": JavaScriptValidateMapParams,
- "validate_string_params": JavaScriptValidateStringParams,
- "validate_struct_params": JavaScriptValidateStructParams,
+ "validate_array_params": DartValidateArrayParams,
+ "validate_handle_params": DartValidateHandleParams,
+ "validate_map_params": DartValidateMapParams,
+ "validate_string_params": DartValidateStringParams,
+ "validate_struct_params": DartValidateStructParams,
}
def GetParameters(self):
@@ -302,19 +346,13 @@ class Generator(generator.Generator):
"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):
+ @UseJinja("dart_templates/module.lib.tmpl", filters=dart_filters)
+ def GenerateLibModule(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))
+ self.Write(self.GenerateLibModule(),
+ self.MatchMojomFilePath("%s.dart" % self.module.name))
def GetImports(self):
used_names = set()
« no previous file with comments | « mojo/public/tools/bindings/generators/dart_templates/struct_definition.tmpl ('k') | mojo/public/tools/bindings/mojom.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698