Example #1
0
 def _IsMoveOnlyKind(self, kind):
     if self._IsTypemappedKind(kind):
         if mojom.IsEnumKind(kind):
             return False
         return self.typemap[self._GetFullMojomNameForKind(
             kind)]["move_only"]
     if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
         return True
     if mojom.IsArrayKind(kind):
         return self._IsMoveOnlyKind(kind.kind)
     if mojom.IsMapKind(kind):
         return (self._IsMoveOnlyKind(kind.value_kind)
                 or self._IsMoveOnlyKind(kind.key_kind))
     if mojom.IsAnyHandleOrInterfaceKind(kind):
         return True
     return False
Example #2
0
 def extract_referenced_user_kinds(kind):
   if mojom.IsArrayKind(kind):
     return extract_referenced_user_kinds(kind.kind)
   if mojom.IsMapKind(kind):
     return (extract_referenced_user_kinds(kind.key_kind) +
             extract_referenced_user_kinds(kind.value_kind))
   if (mojom.IsInterfaceRequestKind(kind) or mojom.IsAssociatedKind(kind)
       or mojom.IsPendingRemoteKind(kind)
       or mojom.IsPendingReceiverKind(kind)):
     return [kind.kind]
   if mojom.IsStructKind(kind):
     return [kind]
   if (mojom.IsInterfaceKind(kind) or mojom.IsEnumKind(kind)
       or mojom.IsUnionKind(kind)):
     return [kind]
   return []
 def get_type_name(kind):
     if mojom.IsEnumKind(kind):
         return "number"
     prefix = "" if mojom.IsNullableKind(kind) else "!"
     if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
         return prefix + "Object"
     if mojom.IsArrayKind(kind):
         return prefix + ("Array<%s>" % get_type_name(kind.kind))
     if mojom.IsMapKind(kind):
         return "%sMap<%s, %s>|%sObject<%s, %s>" % (
             prefix, get_type_name(
                 kind.key_kind), get_type_name(kind.value_kind), prefix,
             get_type_name(kind.key_kind), get_type_name(
                 kind.value_kind))
     return prefix + self._GetTypeNameForNewBindings(
         kind, for_module=for_module)
Example #4
0
def GetAllTypes(element):
    if mojom.IsArrayKind(element):
        return GetAllTypes(element.kind)
    if mojom.IsMapKind(element):
        return GetAllTypes(element.key_kind) + GetAllTypes(element.value_kind)
    if isinstance(element, mojom.Parameter):
        return GetAllTypes(element.kind)
    if mojom.IsEnumKind(element):
        return [element.mojom_name]
    if not mojom.IsStructKind(element):
        return [element.spec]
    if len(element.fields) == 0:
        return [element.mojom_name]
    ret = [GetAllTypes(x.kind) for x in element.fields]
    ret = [x for sublist in ret for x in sublist]
    return list(set(ret))
Example #5
0
 def _DecodeMethodName(kind):
   if mojom.IsArrayKind(kind):
     return _DecodeMethodName(kind.kind) + 's'
   if mojom.IsEnumKind(kind):
     return _DecodeMethodName(mojom.INT32)
   if mojom.IsInterfaceRequestKind(kind) or mojom.IsPendingReceiverKind(kind):
     return 'readInterfaceRequest'
   if mojom.IsInterfaceKind(kind) or mojom.IsPendingRemoteKind(kind):
     return 'readServiceInterface'
   if (mojom.IsAssociatedInterfaceRequestKind(kind) or
       mojom.IsPendingAssociatedReceiverKind(kind)):
     return 'readAssociatedInterfaceRequestNotSupported'
   if (mojom.IsAssociatedInterfaceKind(kind) or
       mojom.IsPendingAssociatedRemoteKind(kind)):
     return 'readAssociatedServiceInterfaceNotSupported'
   return _spec_to_decode_method[kind.spec]
Example #6
0
def GetNonNullableGoType(kind):
  if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
    return '%s' % GetFullName(kind)
  if mojom.IsArrayKind(kind):
    if kind.length:
      return '[%s]%s' % (kind.length, GetGoType(kind.kind))
    return '[]%s' % GetGoType(kind.kind)
  if mojom.IsMapKind(kind):
    return 'map[%s]%s' % (GetGoType(kind.key_kind), GetGoType(kind.value_kind))
  if mojom.IsInterfaceKind(kind):
    return '%s_Pointer' % GetFullName(kind)
  if mojom.IsInterfaceRequestKind(kind):
    return '%s_Request' % GetFullName(kind.kind)
  if mojom.IsEnumKind(kind):
    return GetNameForNestedElement(kind)
  return _kind_infos[kind].go_type
Example #7
0
 def get_type_name(kind):
   if mojom.IsEnumKind(kind):
     return "number"
   prefix = "" if mojom.IsNullableKind(kind) else "!"
   if mojom.IsArrayKind(kind):
     return prefix + ("Array<%s>" % get_type_name(kind.kind))
   if mojom.IsMapKind(kind) and self._IsStringableKind(kind.key_kind):
     return "(%sMap<%s, %s>|%sObject<%s, %s>)" % (
         prefix, get_type_name(kind.key_kind), get_type_name(
             kind.value_kind), prefix, get_type_name(
                 kind.key_kind), get_type_name(kind.value_kind))
   if mojom.IsMapKind(kind):
     return "{}Map<{}, {}>".format(prefix, get_type_name(kind.key_kind),
                                   get_type_name(kind.value_kind))
   return prefix + self._GetTypeNameForNewBindings(kind,
                                                   for_module=for_module)
Example #8
0
def GetCppFieldType(kind):
  if mojom.IsStructKind(kind):
    return ("mojo::internal::StructPointer<%s_Data>" %
        GetNameForKind(kind, internal=True))
  if mojom.IsArrayKind(kind):
    return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind)
  if mojom.IsMapKind(kind):
    return ("mojo::internal::StructPointer<mojo::internal::Map_Data<%s, %s>>" %
            (GetCppType(kind.key_kind), GetCppType(kind.value_kind)))
  if mojom.IsInterfaceKind(kind) or mojom.IsInterfaceRequestKind(kind):
    return "mojo::MessagePipeHandle"
  if mojom.IsEnumKind(kind):
    return GetNameForKind(kind)
  if mojom.IsStringKind(kind):
    return "mojo::internal::StringPointer"
  return _kind_to_cpp_type[kind]
Example #9
0
  def _GetProtoFieldType(self, kind, quantified=True):
    # TODO(markbrand): This will not handle array<array> or array<map>
    # TODO(markbrand): This also will not handle array<x, 10>
    unquantified = ''
    if (mojom.IsEnumKind(kind) or mojom.IsStructKind(kind)
        or mojom.IsUnionKind(kind)):
      unquantified = self._GetProtoNameForKind(kind)
    elif mojom.IsArrayKind(kind):
      return "repeated %sEntry" % self._GetProtoFieldType(kind.kind,
                                                          quantified=False)
    elif mojom.IsMapKind(kind):
      return ("map<%sKey, %sValue>" %
              (self._GetProtoFieldType(kind.key_kind, quantified=False),
               self._GetProtoFieldType(kind.value_kind, quantified=False)))
    elif mojom.IsPendingRemoteKind(kind):
      unquantified = "%s.PendingRemote" % self._GetProtoNameForKind(kind.kind)
    elif mojom.IsPendingReceiverKind(kind):
      unquantified = "%s.PendingReceiver" % self._GetProtoNameForKind(kind.kind)
    elif mojom.IsPendingAssociatedRemoteKind(kind):
      unquantified = ("%s.PendingAssociatedRemote" %
                      self._GetProtoNameForKind(kind.kind))
    elif mojom.IsPendingAssociatedReceiverKind(kind):
      unquantified = ("%s.PendingAssociatedReceiver" %
                      self._GetProtoNameForKind(kind.kind))
    elif mojom.IsStringKind(kind):
      unquantified = "string"
    elif mojom.IsGenericHandleKind(kind):
      unquantified = "mojolpm.Handle"
    elif mojom.IsDataPipeConsumerKind(kind):
      unquantified = "mojolpm.DataPipeConsumerHandle"
    elif mojom.IsDataPipeProducerKind(kind):
      unquantified = "mojolpm.DataPipeProducerHandle"
    elif mojom.IsMessagePipeKind(kind):
      unquantified = "mojolpm.MessagePipeHandle"
    elif mojom.IsSharedBufferKind(kind):
      unquantified = "mojolpm.SharedBufferHandle"
    elif mojom.IsPlatformHandleKind(kind):
      unquantified = "mojolpm.PlatformHandle"
    else:
      unquantified = _kind_to_proto_type[kind]

    if quantified and mojom.IsNullableKind(kind):
      return 'optional %s' % unquantified
    elif quantified:
      return 'required %s' % unquantified
    else:
      return unquantified
Example #10
0
def AddImport(imports, mojom_imports, module, element):
  """Adds an import required to use the provided element.

  The required import is stored in the imports parameter.
  The corresponding mojom import is stored in the mojom_imports parameter.
  Each import is also updated to include a 'go_name' entry. The 'go_name' entry
  is the name by which the imported module will be referred to in the generated
  code. Because the import dictionary is accessible from the element's
  imported_from field this allows us to generate the qualified name for the
  element.

  Args:
    imports: {dict<str, str>} The key is the path to the import and the value
      is the go name.
    mojom_imports: {dict<str, str>} The key is the path to the import and the
      value is the go name.
    module: {module.Module} the module being processed.
    element: {module.Kind} the element whose import is to be tracked.
  """
  if not isinstance(element, mojom.Kind):
    return

  if mojom.IsArrayKind(element) or mojom.IsInterfaceRequestKind(element):
    AddImport(imports, mojom_imports, module, element.kind)
    return
  if mojom.IsMapKind(element):
    AddImport(imports, mojom_imports, module, element.key_kind)
    AddImport(imports, mojom_imports, module, element.value_kind)
    return
  if mojom.IsAnyHandleKind(element):
    imports['mojo/public/go/system'] = 'system'
    return

  if not hasattr(element, 'imported_from') or not element.imported_from:
    return
  imported = element.imported_from
  if GetPackagePath(imported['module']) == GetPackagePath(module):
    return
  path = GetPackagePath(imported['module'])
  if path in imports:
    return
  name = GetPackageName(imported['module'])
  while name in imports.values(): # This avoids repeated names.
    name += '_'
  imported['go_name'] = name
  imports[path] = name
  mojom_imports[path] = 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.IsInterfaceKind(field.kind) or \
       mojom.IsInterfaceRequestKind(field.kind):
        return _kind_to_javascript_default_value[mojom.MSGPIPE]
    if mojom.IsEnumKind(field.kind):
        return "0"
Example #12
0
def DartDeclType(kind):
    if kind in mojom.PRIMITIVES:
        return _kind_to_dart_decl_type[kind]
    if mojom.IsStructKind(kind):
        return GetDartType(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 "Object"
    if mojom.IsEnumKind(kind):
        return "int"
Example #13
0
 def _CodecType(self, 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,
                                      self._JavaScriptType(kind))
     if mojom.IsUnionKind(kind):
         return self._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 = self._ElementCodecType(kind.kind)
         return "new codec.%s(%s%s)" % (array_type, element_type,
                                        array_length)
     if mojom.IsInterfaceKind(kind):
         return "new codec.%s(%sPtr)" % (
             "NullableInterface" if mojom.IsNullableKind(kind) else
             "Interface", self._JavaScriptType(kind))
     if mojom.IsPendingRemoteKind(kind):
         return "new codec.%s(%sPtr)" % (
             "NullableInterface" if mojom.IsNullableKind(kind) else
             "Interface", self._JavaScriptType(kind.kind))
     if mojom.IsInterfaceRequestKind(kind) or mojom.IsPendingReceiverKind(
             kind):
         return "codec.%s" % ("NullableInterfaceRequest" if mojom.
                              IsNullableKind(kind) else "InterfaceRequest")
     if mojom.IsAssociatedInterfaceKind(kind):
         return "codec.%s" % ("NullableAssociatedInterfacePtrInfo"
                              if mojom.IsNullableKind(kind) else
                              "AssociatedInterfacePtrInfo")
     if mojom.IsAssociatedInterfaceRequestKind(kind):
         return "codec.%s" % ("NullableAssociatedInterfaceRequest"
                              if mojom.IsNullableKind(kind) else
                              "AssociatedInterfaceRequest")
     if mojom.IsEnumKind(kind):
         return "new codec.Enum(%s)" % self._JavaScriptType(kind)
     if mojom.IsMapKind(kind):
         map_type = "NullableMapOf" if mojom.IsNullableKind(
             kind) else "MapOf"
         key_type = self._ElementCodecType(kind.key_kind)
         value_type = self._ElementCodecType(kind.value_kind)
         return "new codec.%s(%s, %s)" % (map_type, key_type, value_type)
     raise Exception("No codec type for %s" % kind)
Example #14
0
def GetJavaType(context, kind, boxed=False):
    if boxed:
        return GetBoxedJavaType(context, kind)
    if mojom.IsStructKind(kind) or mojom.IsInterfaceKind(kind):
        return GetNameForKind(context, kind)
    if mojom.IsInterfaceRequestKind(kind):
        return ('org.chromium.mojo.bindings.InterfaceRequest<%s>' %
                GetNameForKind(context, kind.kind))
    if mojom.IsMapKind(kind):
        return 'java.util.Map<%s, %s>' % (GetBoxedJavaType(
            context, kind.key_kind), GetBoxedJavaType(context,
                                                      kind.value_kind))
    if mojom.IsArrayKind(kind):
        return '%s[]' % GetJavaType(context, kind.kind)
    if mojom.IsEnumKind(kind):
        return 'int'
    return _spec_to_java_type[kind.spec]
  def _GetCppDataViewType(self, kind, qualified=False):
    def _GetName(input_kind):
      return _NameFormatter(input_kind, None).FormatForCpp(
          omit_namespace_for_module=(None if qualified else self.module),
          flatten_nested_kind=True)

    if mojom.IsEnumKind(kind):
      return _GetName(kind)
    if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
      return "%sDataView" % _GetName(kind)
    if mojom.IsArrayKind(kind):
      return "mojo::ArrayDataView<%s>" % (
          self._GetCppDataViewType(kind.kind, qualified))
    if mojom.IsMapKind(kind):
      return ("mojo::MapDataView<%s, %s>" % (
          self._GetCppDataViewType(kind.key_kind, qualified),
          self._GetCppDataViewType(kind.value_kind, qualified)))
    if mojom.IsStringKind(kind):
      return "mojo::StringDataView"
    if mojom.IsInterfaceKind(kind):
      return "%sPtrDataView" % _GetName(kind)
    if mojom.IsInterfaceRequestKind(kind):
      return "%sRequestDataView" % _GetName(kind.kind)
    if mojom.IsPendingRemoteKind(kind):
      return ("mojo::InterfacePtrDataView<%sInterfaceBase>" %
              _GetName(kind.kind))
    if mojom.IsPendingReceiverKind(kind):
      return ("mojo::InterfaceRequestDataView<%sInterfaceBase>" %
              _GetName(kind.kind))
    if (mojom.IsAssociatedInterfaceKind(kind) or
        mojom.IsPendingAssociatedRemoteKind(kind)):
      return "%sAssociatedPtrInfoDataView" % _GetName(kind.kind)
    if (mojom.IsAssociatedInterfaceRequestKind(kind) or
        mojom.IsPendingAssociatedReceiverKind(kind)):
      return "%sAssociatedRequestDataView" % _GetName(kind.kind)
    if mojom.IsGenericHandleKind(kind):
      return "mojo::ScopedHandle"
    if mojom.IsDataPipeConsumerKind(kind):
      return "mojo::ScopedDataPipeConsumerHandle"
    if mojom.IsDataPipeProducerKind(kind):
      return "mojo::ScopedDataPipeProducerHandle"
    if mojom.IsMessagePipeKind(kind):
      return "mojo::ScopedMessagePipeHandle"
    if mojom.IsSharedBufferKind(kind):
      return "mojo::ScopedSharedBufferHandle"
    return _kind_to_cpp_type[kind]
Example #16
0
    def _LiteClosureParamType(self, kind):
        if mojom.IsEnumKind(kind):
            return "number"
        prefix = "" if mojom.IsNullableKind(kind) else "!"
        if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
            return prefix + "Object"
        if mojom.IsArrayKind(kind):
            return prefix + ("Array<%s>" %
                             self._LiteClosureParamType(kind.kind))
        if mojom.IsMapKind(kind):
            return "%sMap<%s, %s>|%sObject<%s, %s>" % (
                prefix, self._LiteClosureParamType(kind.key_kind),
                self._LiteClosureParamType(kind.value_kind), prefix,
                self._LiteClosureParamType(kind.key_kind),
                self._LiteClosureParamType(kind.value_kind))

        return prefix + self._LiteClosureType(kind)
Example #17
0
    def _LiteJavaScriptType(self, kind):
        if self._IsPrimitiveKind(kind):
            return _kind_to_lite_js_type[kind]
        if mojom.IsArrayKind(kind):
            return "mojo.internal.Array(%s, %s)" % (self._LiteJavaScriptType(
                kind.kind), "true" if mojom.IsNullableKind(kind.kind) else
                                                    "false")
        if mojom.IsMapKind(kind):
            return "mojo.internal.Map(%s, %s, %s)" % (self._LiteJavaScriptType(
                kind.key_kind), self._LiteJavaScriptType(
                    kind.value_kind), "true" if mojom.IsNullableKind(
                        kind.value_kind) else "false")

        if (mojom.IsAssociatedKind(kind) or mojom.IsInterfaceRequestKind(kind)
                or mojom.IsPendingRemoteKind(kind)
                or mojom.IsPendingReceiverKind(kind)):
            named_kind = kind.kind
        else:
            named_kind = kind

        name = []
        if named_kind.module:
            name.append(named_kind.module.namespace)
        if named_kind.parent_kind:
            parent_name = named_kind.parent_kind.name
            if mojom.IsStructKind(named_kind.parent_kind):
                parent_name += "Spec"
            name.append(parent_name)
        name.append(named_kind.name)
        name = ".".join(name)

        if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind)
                or mojom.IsEnumKind(kind)):
            return "%sSpec.$" % name
        if mojom.IsInterfaceKind(kind) or mojom.IsPendingRemoteKind(kind):
            return "mojo.internal.InterfaceProxy(%sProxy)" % name
        if mojom.IsInterfaceRequestKind(kind) or mojom.IsPendingReceiverKind(
                kind):
            return "mojo.internal.InterfaceRequest(%sRequest)" % name
        if mojom.IsAssociatedInterfaceKind(kind):
            # TODO(rockot): Implement associated interfaces.
            return "mojo.internal.AssociatedInterfaceProxy(%sProxy)" % (name)
        if mojom.IsAssociatedInterfaceRequestKind(kind):
            return "mojo.internal.AssociatedInterfaceRequest(%s)" % name

        return name
Example #18
0
 def _GetObjCPropertyDefaultValue(self, field):
   kind = field.kind
   if mojom.IsNullableKind(kind) and not field.default:
     return 'nil'
   if self._IsObjCNumberKind(kind):
     return '0' if not field.default else field.default
   if mojom.IsEnumKind(kind):
     value = '0' if not field.default else field.default.field.value
     return 'static_cast<%s%s>(%s)' % (self.class_prefix, kind.name, value)
   if mojom.IsStringKind(kind):
     return '@""' if not field.default else '@%s' % field.default
   if mojom.IsArrayKind(kind):
     return '@[]'
   if mojom.IsMapKind(kind):
     return '@{}'
   if kind in self.module.structs:
     return "[[%s%s alloc] init]" % (self.class_prefix, kind.name)
   raise Exception("Unrecognized kind %s" % kind.spec)
Example #19
0
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 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 = "bindings.PackedBool" if mojom.IsBoolKind(kind.kind) \
        else CodecType(kind.kind)
    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):
    return _kind_to_codec_type[mojom.INT32]
  return kind
Example #20
0
def GetCppArrayArgWrapperType(kind):
    if mojom.IsStructKind(kind) and kind.native_only:
        if IsTypemappedKind(kind):
            return GetNativeTypeName(kind)
        else:
            # Without a relevant typemap to apply, a native-only struct can only be
            # exposed as a blob of bytes.
            return "mojo::Array<uint8_t>"
    if IsTypemappedKind(kind):
        raise Exception(
            "Cannot serialize containers of non-native typemapped structs yet!"
        )
    if mojom.IsEnumKind(kind):
        return GetNameForKind(kind)
    if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
        return "%sPtr" % GetNameForKind(kind)
    if mojom.IsArrayKind(kind):
        pattern = "mojo::WTFArray<%s>" if _for_blink else "mojo::Array<%s>"
        return pattern % GetCppArrayArgWrapperType(kind.kind)
    if mojom.IsMapKind(kind):
        return "mojo::Map<%s, %s> " % (GetCppArrayArgWrapperType(
            kind.key_kind), GetCppArrayArgWrapperType(kind.value_kind))
    if mojom.IsInterfaceKind(kind):
        raise Exception("Arrays of interfaces not yet supported!")
    if mojom.IsInterfaceRequestKind(kind):
        raise Exception("Arrays of interface requests not yet supported!")
    if mojom.IsAssociatedInterfaceKind(kind):
        raise Exception("Arrays of associated interfaces not yet supported!")
    if mojom.IsAssociatedInterfaceRequestKind(kind):
        raise Exception("Arrays of associated interface requests not yet "
                        "supported!")
    if mojom.IsStringKind(kind):
        return "WTF::String" if _for_blink else "mojo::String"
    if mojom.IsGenericHandleKind(kind):
        return "mojo::ScopedHandle"
    if mojom.IsDataPipeConsumerKind(kind):
        return "mojo::ScopedDataPipeConsumerHandle"
    if mojom.IsDataPipeProducerKind(kind):
        return "mojo::ScopedDataPipeProducerHandle"
    if mojom.IsMessagePipeKind(kind):
        return "mojo::ScopedMessagePipeHandle"
    if mojom.IsSharedBufferKind(kind):
        return "mojo::ScopedSharedBufferHandle"
    return _kind_to_cpp_type[kind]
Example #21
0
  def _LiteClosureType(self, kind):
    if kind in mojom.PRIMITIVES:
      return _kind_to_closure_type[kind]
    if mojom.IsArrayKind(kind):
      return "Array<%s>" % self._LiteClosureTypeWithNullability(kind.kind)
    if mojom.IsMapKind(kind) and self._IsStringableKind(kind.key_kind):
      return "(Map<%s, %s>|Object<%s, %s>)" % (
          self._LiteClosureTypeWithNullability(kind.key_kind),
          self._LiteClosureTypeWithNullability(kind.value_kind),
          self._LiteClosureTypeWithNullability(kind.key_kind),
          self._LiteClosureTypeWithNullability(kind.value_kind))
    if mojom.IsMapKind(kind):
      return "Map<%s, %s>" % (
          self._LiteClosureTypeWithNullability(kind.key_kind),
          self._LiteClosureTypeWithNullability(kind.value_kind))

    if mojom.IsAssociatedKind(kind) or mojom.IsInterfaceRequestKind(kind):
      named_kind = kind.kind
    else:
      named_kind = kind

    name = []
    if named_kind.module:
      name.append(named_kind.module.namespace)
    if named_kind.parent_kind:
      name.append(named_kind.parent_kind.name)
    name.append("" + named_kind.name)
    name = ".".join(name)

    if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or
        mojom.IsEnumKind(kind)):
      return name
    if mojom.IsInterfaceKind(kind):
      return name + "Proxy"
    if mojom.IsInterfaceRequestKind(kind):
      return name + "Request"
    # TODO(calamity): Support associated interfaces properly.
    if mojom.IsAssociatedInterfaceKind(kind):
      return "Object"
    # TODO(calamity): Support associated interface requests properly.
    if mojom.IsAssociatedInterfaceRequestKind(kind):
      return "Object"

    raise Exception("No valid closure type: %s" % kind)
Example #22
0
def DartDefaultValue(field):
    if field.default:
        if mojom.IsStructKind(field.kind):
            assert field.default == "default"
            return "new %s()" % GetDartType(field.kind)
        return ExpressionToText(field.default)
    if field.kind in mojom.PRIMITIVES:
        return _kind_to_dart_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 "null"
    if mojom.IsEnumKind(field.kind):
        return "0"
def GetCppType(kind):
    if mojom.IsArrayKind(kind):
        return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind)
    if mojom.IsMapKind(kind):
        return "mojo::internal::Map_Data<%s, %s>*" % (GetCppType(
            kind.key_kind), GetCppType(kind.value_kind))
    if mojom.IsStructKind(kind):
        return "%s_Data*" % GetNameForKind(kind, internal=True)
    if mojom.IsUnionKind(kind):
        return "%s_Data" % GetNameForKind(kind, internal=True)
    if mojom.IsInterfaceKind(kind):
        return "mojo::internal::Interface_Data"
    if mojom.IsInterfaceRequestKind(kind):
        return "mojo::MessagePipeHandle"
    if mojom.IsEnumKind(kind):
        return "int32_t"
    if mojom.IsStringKind(kind):
        return "mojo::internal::String_Data*"
    return _kind_to_cpp_type[kind]
Example #24
0
def GetCppType(kind):
  if mojom.IsArrayKind(kind):
    return "::fidl::internal::Array_Data<%s>*" % GetCppType(kind.kind)
  if mojom.IsMapKind(kind):
    return "::fidl::internal::Map_Data<%s, %s>*" % (
      GetCppType(kind.key_kind), GetCppType(kind.value_kind))
  if mojom.IsStructKind(kind):
    return "%s_Data*" % GetNameForKind(kind, internal=True)
  if mojom.IsUnionKind(kind):
    return "%s_Data" % GetNameForKind(kind, internal=True)
  if mojom.IsInterfaceKind(kind):
    return "::fidl::internal::Interface_Data"
  if mojom.IsInterfaceRequestKind(kind):
    return "::fidl::internal::WrappedHandle"
  if mojom.IsEnumKind(kind):
    return "int32_t"
  if mojom.IsStringKind(kind):
    return "::fidl::internal::String_Data*"
  return GetCppTypeForKind(kind)
Example #25
0
    def _IsFullHeaderRequiredForImport(self, imported_module):
        """Determines whether a given import module requires a full header include,
    or if the forward header is sufficient."""

        # Type-mapped kinds may not have forward declarations, and nested kinds
        # cannot be forward declared.
        if any(kind.module == imported_module and ((self._IsTypemappedKind(
                kind) and not self._GetTypemappedForwardDeclaration(kind))
                                                   or kind.parent_kind != None)
               for kind in self.module.imported_kinds.values()):
            return True

        # For most kinds, whether or not a full definition is needed depends on how
        # the kind is used.
        for kind in self.module.structs + self.module.unions:
            for field in kind.fields:

                # Peel array kinds.
                kind = field.kind
                while mojom.IsArrayKind(kind):
                    kind = kind.kind

                if kind.module == imported_module:
                    # Need full def for struct/union fields, even when not inlined.
                    if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
                        return True

        for kind in self.module.kinds.values():
            if mojom.IsMapKind(kind):
                if kind.key_kind.module == imported_module:
                    # Map keys need the full definition.
                    return True
                if self.for_blink and kind.value_kind.module == imported_module:
                    # For Blink, map values need the full definition for tracing.
                    return True

        for constant in self.module.constants:
            # Constants referencing enums need the full definition.
            if mojom.IsEnumKind(constant.kind
                                ) and constant.value.module == imported_module:
                return True

        return False
Example #26
0
def GetCppResultWrapperType(kind):
    if IsTypemappedKind(kind):
        return "const %s&" % GetNativeTypeName(kind)
    if mojom.IsStructKind(kind) and kind.native_only:
        return "mojo::Array<uint8_t>"
    if mojom.IsEnumKind(kind):
        return GetNameForKind(kind)
    if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
        return "%sPtr" % GetNameForKind(kind)
    if mojom.IsArrayKind(kind):
        pattern = "mojo::WTFArray<%s>" if _for_blink else "mojo::Array<%s>"
        return pattern % GetCppArrayArgWrapperType(kind.kind)
    if mojom.IsMapKind(kind):
        return "mojo::Map<%s, %s>" % (GetCppArrayArgWrapperType(
            kind.key_kind), GetCppArrayArgWrapperType(kind.value_kind))
    if mojom.IsInterfaceKind(kind):
        return "%sPtr" % GetNameForKind(kind)
    if mojom.IsInterfaceRequestKind(kind):
        return "%sRequest" % GetNameForKind(kind.kind)
    if mojom.IsAssociatedInterfaceKind(kind):
        return "%sAssociatedPtrInfo" % GetNameForKind(kind.kind)
    if mojom.IsAssociatedInterfaceRequestKind(kind):
        return "%sAssociatedRequest" % GetNameForKind(kind.kind)
    if mojom.IsStringKind(kind):
        return "WTF::String" if _for_blink else "mojo::String"
    if mojom.IsGenericHandleKind(kind):
        return "mojo::ScopedHandle"
    if mojom.IsDataPipeConsumerKind(kind):
        return "mojo::ScopedDataPipeConsumerHandle"
    if mojom.IsDataPipeProducerKind(kind):
        return "mojo::ScopedDataPipeProducerHandle"
    if mojom.IsMessagePipeKind(kind):
        return "mojo::ScopedMessagePipeHandle"
    if mojom.IsSharedBufferKind(kind):
        return "mojo::ScopedSharedBufferHandle"
    # TODO(rudominer) After improvements to compiler front end have landed,
    # revisit strategy used below for emitting a useful error message when an
    # undefined identifier is referenced.
    val = _kind_to_cpp_type.get(kind)
    if (val is not None):
        return val
    raise Exception("Unrecognized kind %s" % kind.spec)
Example #27
0
        def AddKind(kind):
            if IsBasicKind(kind):
                pass
            elif mojom.IsArrayKind(kind):
                AddKind(kind.kind)
            elif mojom.IsMapKind(kind):
                AddKind(kind.key_kind)
                AddKind(kind.value_kind)
            else:
                name = self._GetFullMojomNameForKind(kind)
                if name in seen_types:
                    return
                seen_types.add(name)

                typemap = self.typemap.get(name, None)
                if typemap:
                    used_typemaps.append(typemap)
                if mojom.IsStructKind(kind) or mojom.IsUnionKind(kind):
                    for field in kind.fields:
                        AddKind(field.kind)
Example #28
0
def DartDeclType(kind):
    if kind in mojom.PRIMITIVES:
        return _kind_to_dart_decl_type[kind]
    if mojom.IsStructKind(kind):
        return GetDartType(kind)
    if mojom.IsUnionKind(kind):
        return GetDartType(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):
        return ("bindings.InterfaceHandle<%s>" % GetDartType(kind))
    if mojom.IsInterfaceRequestKind(kind):
        return ("bindings.InterfaceRequest<%s>" % GetDartType(kind.kind))
    if mojom.IsEnumKind(kind):
        return GetDartType(kind)
Example #29
0
def GetArrayNullabilityFlags(kind):
    """Returns nullability flags for an array type, see codec.dart.

    As we have dedicated decoding functions for arrays, we have to pass
    nullability information about both the array itself, as well as the array
    element type there.
    """
    assert mojom.IsArrayKind(kind)
    ARRAY_NULLABLE = 'bindings.kArrayNullable'
    ELEMENT_NULLABLE = 'bindings.kElementNullable'
    NOTHING_NULLABLE = 'bindings.kNothingNullable'

    flags_to_set = []
    if mojom.IsNullableKind(kind):
        flags_to_set.append(ARRAY_NULLABLE)
    if mojom.IsNullableKind(kind.kind):
        flags_to_set.append(ELEMENT_NULLABLE)

    if not flags_to_set:
        flags_to_set = [NOTHING_NULLABLE]
    return ' | '.join(flags_to_set)
Example #30
0
def GetArrayValidateParams(kind):
    if (not mojom.IsArrayKind(kind) and not mojom.IsMapKind(kind)
            and not mojom.IsStringKind(kind)):
        return "mojo::internal::NoValidateParams"

    if mojom.IsStringKind(kind):
        expected_num_elements = 0
        element_is_nullable = False
        element_validate_params = "mojo::internal::NoValidateParams"
    elif mojom.IsMapKind(kind):
        expected_num_elements = 0
        element_is_nullable = mojom.IsNullableKind(kind.value_kind)
        element_validate_params = GetArrayValidateParams(kind.value_kind)
    else:
        expected_num_elements = generator.ExpectedArraySize(kind) or 0
        element_is_nullable = mojom.IsNullableKind(kind.kind)
        element_validate_params = GetArrayValidateParams(kind.kind)

    return "mojo::internal::ArrayValidateParams<%d, %s,\n%s> " % (
        expected_num_elements, 'true' if element_is_nullable else 'false',
        element_validate_params)