| Index: mojo/public/tools/bindings/generators/mojom_java_generator.py
|
| diff --git a/mojo/public/tools/bindings/generators/mojom_java_generator.py b/mojo/public/tools/bindings/generators/mojom_java_generator.py
|
| index ca43b8456304a85a6b161f1afe6cfef75cac77a5..4755b0db6fc292d21fdd71184e410cf91c6e246e 100644
|
| --- a/mojo/public/tools/bindings/generators/mojom_java_generator.py
|
| +++ b/mojo/public/tools/bindings/generators/mojom_java_generator.py
|
| @@ -8,6 +8,8 @@ import argparse
|
| import os
|
| import re
|
|
|
| +from jinja2 import contextfilter
|
| +
|
| import mojom.generate.generator as generator
|
| import mojom.generate.module as mojom
|
| from mojom.generate.template_expander import UseJinja
|
| @@ -62,19 +64,21 @@ def ConstantStyle(name):
|
| return '_'.join([x.upper() for x in components])
|
|
|
| def GetNameForElement(element):
|
| - if (isinstance(element, mojom.Enum) or
|
| - isinstance(element, mojom.Interface) or
|
| - isinstance(element, mojom.Struct)):
|
| + if isinstance(element, (mojom.Enum,
|
| + mojom.Interface,
|
| + mojom.Struct)):
|
| return UpperCamelCase(element.name)
|
| - if (isinstance(element, mojom.Method) or
|
| - isinstance(element, mojom.Parameter) or
|
| - isinstance(element, mojom.Field)):
|
| + if isinstance(element, mojom.InterfaceRequest):
|
| + return GetNameForElement(element.kind)
|
| + if isinstance(element, (mojom.Method,
|
| + mojom.Parameter,
|
| + mojom.Field)):
|
| return CamelCase(element.name)
|
| if isinstance(element, mojom.EnumValue):
|
| return (UpperCamelCase(element.enum_name) + '.' +
|
| ConstantStyle(element.name))
|
| - if (isinstance(element, mojom.NamedValue) or
|
| - isinstance(element, mojom.Constant)):
|
| + if isinstance(element, (mojom.NamedValue,
|
| + mojom.Constant)):
|
| return ConstantStyle(element.name)
|
| raise Exception("Unexpected element: " % element)
|
|
|
| @@ -88,36 +92,57 @@ def GetPackage(module):
|
| # Default package.
|
| return "org.chromium.mojom." + module.namespace
|
|
|
| -def GetNameForKind(kind):
|
| +def GetNameForKind(context, kind):
|
| def _GetNameHierachy(kind):
|
| hierachy = []
|
| if kind.parent_kind:
|
| hierachy = _GetNameHierachy(kind.parent_kind)
|
| - hierachy.append(kind.name)
|
| + hierachy.append(GetNameForElement(kind))
|
| return hierachy
|
|
|
| - elements = [GetPackage(kind.module)]
|
| + module = context.resolve('module')
|
| + elements = []
|
| + if GetPackage(module) != GetPackage(kind.module):
|
| + elements += [GetPackage(kind.module)]
|
| elements += _GetNameHierachy(kind)
|
| return '.'.join(elements)
|
|
|
| -def GetJavaType(kind):
|
| +@contextfilter
|
| +def GetJavaType(context, kind):
|
| if isinstance(kind, (mojom.Struct, mojom.Interface)):
|
| - return GetNameForKind(kind)
|
| - if isinstance(kind, mojom.Array):
|
| - return "%s[]" % GetJavaType(kind.kind)
|
| + return GetNameForKind(context, kind)
|
| + if isinstance(kind, mojom.InterfaceRequest):
|
| + return GetNameForKind(context, kind.kind)
|
| + if isinstance(kind, (mojom.Array, mojom.FixedArray)):
|
| + return "%s[]" % GetJavaType(context, kind.kind)
|
| if isinstance(kind, mojom.Enum):
|
| return "int"
|
| return _spec_to_java_type[kind.spec]
|
|
|
| -def ExpressionToText(token):
|
| +def IsHandle(kind):
|
| + return kind.spec[0] == 'h'
|
| +
|
| +@contextfilter
|
| +def DefaultValue(context, field):
|
| + assert field.default
|
| + if isinstance(field.kind, mojom.Struct):
|
| + assert field.default == "default"
|
| + return "new %s()" % GetJavaType(context, field.kind)
|
| + return "(%s) %s" % (GetJavaType(context, field.kind),
|
| + ExpressionToText(context, field.default))
|
| +
|
| +@contextfilter
|
| +def ExpressionToText(context, token):
|
| def _TranslateNamedValue(named_value):
|
| entity_name = GetNameForElement(named_value)
|
| if named_value.parent_kind:
|
| - return GetJavaType(named_value.parent_kind) + '.' + entity_name
|
| + return GetJavaType(context, named_value.parent_kind) + '.' + entity_name
|
| # Handle the case where named_value is a module level constant:
|
| if not isinstance(named_value, mojom.EnumValue):
|
| entity_name = (GetConstantsMainEntityName(named_value.module) + '.' +
|
| entity_name)
|
| + if GetPackage(named_value.module) == GetPackage(context.resolve('module')):
|
| + return entity_name
|
| return GetPackage(named_value.module) + '.' + entity_name
|
|
|
| if isinstance(token, mojom.NamedValue):
|
| @@ -138,7 +163,9 @@ def GetConstantsMainEntityName(module):
|
| class Generator(generator.Generator):
|
|
|
| java_filters = {
|
| + "default_value": DefaultValue,
|
| "expression_to_text": ExpressionToText,
|
| + "is_handle": IsHandle,
|
| "java_type": GetJavaType,
|
| "name": GetNameForElement,
|
| }
|
| @@ -149,15 +176,19 @@ class Generator(generator.Generator):
|
| "package": GetPackage(self.module),
|
| }
|
|
|
| - @UseJinja("java_templates/enum.java.tmpl", filters=java_filters,
|
| - lstrip_blocks=True, trim_blocks=True)
|
| + @UseJinja("java_templates/enum.java.tmpl", filters=java_filters)
|
| def GenerateEnumSource(self, enum):
|
| exports = self.GetJinjaExports()
|
| exports.update({"enum": enum})
|
| return exports
|
|
|
| - @UseJinja("java_templates/constants.java.tmpl", filters=java_filters,
|
| - lstrip_blocks=True, trim_blocks=True)
|
| + @UseJinja("java_templates/struct.java.tmpl", filters=java_filters)
|
| + def GenerateStructSource(self, struct):
|
| + exports = self.GetJinjaExports()
|
| + exports.update({"struct": struct})
|
| + return exports
|
| +
|
| + @UseJinja("java_templates/constants.java.tmpl", filters=java_filters)
|
| def GenerateConstantsSource(self, module):
|
| exports = self.GetJinjaExports()
|
| exports.update({"main_entity": GetConstantsMainEntityName(module),
|
| @@ -182,6 +213,21 @@ class Generator(generator.Generator):
|
| self.Write(self.GenerateEnumSource(enum),
|
| "%s.java" % GetNameForElement(enum))
|
|
|
| + for struct in self.module.structs:
|
| + self.Write(self.GenerateStructSource(struct),
|
| + "%s.java" % GetNameForElement(struct))
|
| +
|
| if self.module.constants:
|
| self.Write(self.GenerateConstantsSource(self.module),
|
| "%s.java" % GetConstantsMainEntityName(self.module))
|
| +
|
| + def GetJinjaParameters(self):
|
| + return {
|
| + 'lstrip_blocks': True,
|
| + 'trim_blocks': True,
|
| + }
|
| +
|
| + def GetGlobals(self):
|
| + return {
|
| + 'module': self.module,
|
| + }
|
|
|