from generate.template_expander import UseJinja
-
_kind_to_javascript_default_value = {
mojom.BOOL: "false",
mojom.INT8: "0",
def JavaScriptDefaultValue(field):
if field.default:
- if isinstance(field.default, list):
- # TODO(mpcomplete): This will need to be more sophisticated to support
- # arrays of objects/arrays.
- return "[" + ", ".join(field.default) + "]"
- else:
- return field.default
+ raise Exception("Default values should've been handled in jinja.")
if field.kind in mojom.PRIMITIVES:
return _kind_to_javascript_default_value[field.kind]
if isinstance(field.kind, mojom.Struct):
return "null";
if isinstance(field.kind, mojom.Array):
return "[]";
+ if isinstance(field.kind, mojom.Interface):
+ return _kind_to_javascript_default_value[mojom.MSGPIPE]
def JavaScriptPayloadSize(packed):
return "new codec.PointerTo(%s)" % GetJavaScriptType(kind.name)
if isinstance(kind, mojom.Array):
return "new codec.ArrayOf(%s)" % GetJavaScriptType(kind.kind)
+ if isinstance(kind, mojom.Interface):
+ return GetJavaScriptType(mojom.MSGPIPE)
return kind
return "decodeStructPointer(%s)" % GetJavaScriptType(kind.name);
if isinstance(kind, mojom.Array):
return "decodeArrayPointer(%s)" % GetJavaScriptType(kind.kind);
+ if isinstance(kind, mojom.Interface):
+ return JavaScriptDecodeSnippet(mojom.MSGPIPE)
_kind_to_javascript_encode_snippet = {
return "encodeStructPointer(%s, " % GetJavaScriptType(kind.name);
if isinstance(kind, mojom.Array):
return "encodeArrayPointer(%s, " % GetJavaScriptType(kind.kind);
+ if isinstance(kind, mojom.Interface):
+ return JavaScriptEncodeSnippet(mojom.MSGPIPE)
+
+
+def GetConstants(module):
+ """Returns a generator that enumerates all constants that can be referenced
+ from this module."""
+ class Constant:
+ pass
+
+ for enum in module.enums:
+ for field in enum.fields:
+ constant = Constant()
+ constant.namespace = module.namespace
+ constant.is_current_namespace = True
+ constant.import_item = None
+ constant.name = (enum.name, field.name)
+ yield constant
+
+ for each in module.imports:
+ for enum in each["module"].enums:
+ for field in enum.fields:
+ constant = Constant()
+ constant.namespace = each["namespace"]
+ constant.is_current_namespace = constant.namespace == module.namespace
+ constant.import_item = each
+ constant.name = (enum.name, field.name)
+ yield constant
+
+
+def TranslateConstants(value, module):
+ # We're assuming we're dealing with an identifier, but that may not be
+ # the case. If we're not, we just won't find any matches.
+ if value.find(".") != -1:
+ namespace, identifier = value.split(".")
+ else:
+ namespace, identifier = "", value
+
+ for constant in GetConstants(module):
+ if namespace == constant.namespace or (
+ namespace == "" and constant.is_current_namespace):
+ if constant.name[1] == identifier:
+ if constant.import_item:
+ return "%s.%s.%s" % (constant.import_item["unique_name"],
+ constant.name[0], constant.name[1])
+ else:
+ return "%s.%s" % (constant.name[0], constant.name[1])
+ return value
+
+
+def ExpressionToText(value, module):
+ if value[0] != "EXPRESSION":
+ raise Exception("Expected EXPRESSION, got" + value)
+ return "".join(mojom_generator.ExpressionMapper(value,
+ lambda token: TranslateConstants(token, module)))
+
+
+def JavascriptType(kind):
+ if kind.imported_from:
+ return kind.imported_from["unique_name"] + "." + kind.name
+ return kind.name
class Generator(mojom_generator.Generator):
js_filters = {
+ "camel_to_underscores": mojom_generator.CamelToUnderscores,
"default_value": JavaScriptDefaultValue,
"payload_size": JavaScriptPayloadSize,
"decode_snippet": JavaScriptDecodeSnippet,
"encode_snippet": JavaScriptEncodeSnippet,
+ "expression_to_text": ExpressionToText,
+ "is_object_kind": mojom_generator.IsObjectKind,
+ "is_string_kind": mojom_generator.IsStringKind,
+ "is_array_kind": lambda kind: isinstance(kind, mojom.Array),
+ "js_type": JavascriptType,
"stylize_method": mojom_generator.StudlyCapsToCamel,
+ "verify_token_type": mojom_generator.VerifyTokenType,
}
@UseJinja("js_templates/module.js.tmpl", filters=js_filters)
def GenerateJsModule(self):
return {
+ "imports": self.GetImports(),
+ "kinds": self.module.kinds,
"enums": self.module.enums,
+ "module": self.module,
"structs": self.GetStructs() + self.GetStructsFromMethods(),
"interfaces": self.module.interfaces,
}
def GenerateFiles(self):
self.Write(self.GenerateJsModule(), "%s.js" % self.module.name)
+
+ def GetImports(self):
+ # Since each import is assigned a variable in JS, they need to have unique
+ # names.
+ counter = 1
+ for each in self.module.imports:
+ each["unique_name"] = "import" + str(counter)
+ counter += 1
+ return self.module.imports