Index: mojo/public/tools/bindings/pylib/mojom/generate/module.py |
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/module.py b/mojo/public/tools/bindings/pylib/mojom/generate/module.py |
deleted file mode 100644 |
index 8e52924f27d22cd2615559c29542691301384950..0000000000000000000000000000000000000000 |
--- a/mojo/public/tools/bindings/pylib/mojom/generate/module.py |
+++ /dev/null |
@@ -1,500 +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. |
- |
-# This module's classes provide an interface to mojo modules. Modules are |
-# collections of interfaces and structs to be used by mojo ipc clients and |
-# servers. |
-# |
-# A simple interface would be created this way: |
-# module = mojom.generate.module.Module('Foo') |
-# interface = module.AddInterface('Bar') |
-# method = interface.AddMethod('Tat', 0) |
-# method.AddParameter('baz', 0, mojom.INT32) |
- |
- |
-class Kind(object): |
- def __init__(self, spec=None): |
- self.spec = spec |
- self.parent_kind = None |
- |
- |
-class ReferenceKind(Kind): |
- """ReferenceKind represents pointer types and handle types. |
- A type is nullable if null (for pointer types) or invalid handle (for handle |
- types) is a legal value for the type. |
- """ |
- |
- def __init__(self, spec=None, is_nullable=False): |
- assert spec is None or is_nullable == spec.startswith('?') |
- Kind.__init__(self, spec) |
- self.is_nullable = is_nullable |
- self.shared_definition = {} |
- |
- def MakeNullableKind(self): |
- assert not self.is_nullable |
- |
- if self == STRING: |
- return NULLABLE_STRING |
- if self == HANDLE: |
- return NULLABLE_HANDLE |
- if self == DCPIPE: |
- return NULLABLE_DCPIPE |
- if self == DPPIPE: |
- return NULLABLE_DPPIPE |
- if self == MSGPIPE: |
- return NULLABLE_MSGPIPE |
- if self == SHAREDBUFFER: |
- return NULLABLE_SHAREDBUFFER |
- |
- nullable_kind = type(self)() |
- nullable_kind.shared_definition = self.shared_definition |
- if self.spec is not None: |
- nullable_kind.spec = '?' + self.spec |
- nullable_kind.is_nullable = True |
- |
- return nullable_kind |
- |
- @classmethod |
- def AddSharedProperty(cls, name): |
- """Adds a property |name| to |cls|, which accesses the corresponding item in |
- |shared_definition|. |
- |
- The reason of adding such indirection is to enable sharing definition |
- between a reference kind and its nullable variation. For example: |
- a = Struct('test_struct_1') |
- b = a.MakeNullableKind() |
- a.name = 'test_struct_2' |
- print b.name # Outputs 'test_struct_2'. |
- """ |
- def Get(self): |
- return self.shared_definition[name] |
- |
- def Set(self, value): |
- self.shared_definition[name] = value |
- |
- setattr(cls, name, property(Get, Set)) |
- |
- |
-# Initialize the set of primitive types. These can be accessed by clients. |
-BOOL = Kind('b') |
-INT8 = Kind('i8') |
-INT16 = Kind('i16') |
-INT32 = Kind('i32') |
-INT64 = Kind('i64') |
-UINT8 = Kind('u8') |
-UINT16 = Kind('u16') |
-UINT32 = Kind('u32') |
-UINT64 = Kind('u64') |
-FLOAT = Kind('f') |
-DOUBLE = Kind('d') |
-STRING = ReferenceKind('s') |
-HANDLE = ReferenceKind('h') |
-DCPIPE = ReferenceKind('h:d:c') |
-DPPIPE = ReferenceKind('h:d:p') |
-MSGPIPE = ReferenceKind('h:m') |
-SHAREDBUFFER = ReferenceKind('h:s') |
-NULLABLE_STRING = ReferenceKind('?s', True) |
-NULLABLE_HANDLE = ReferenceKind('?h', True) |
-NULLABLE_DCPIPE = ReferenceKind('?h:d:c', True) |
-NULLABLE_DPPIPE = ReferenceKind('?h:d:p', True) |
-NULLABLE_MSGPIPE = ReferenceKind('?h:m', True) |
-NULLABLE_SHAREDBUFFER = ReferenceKind('?h:s', True) |
- |
- |
-# Collection of all Primitive types |
-PRIMITIVES = ( |
- BOOL, |
- INT8, |
- INT16, |
- INT32, |
- INT64, |
- UINT8, |
- UINT16, |
- UINT32, |
- UINT64, |
- FLOAT, |
- DOUBLE, |
- STRING, |
- HANDLE, |
- DCPIPE, |
- DPPIPE, |
- MSGPIPE, |
- SHAREDBUFFER, |
- NULLABLE_STRING, |
- NULLABLE_HANDLE, |
- NULLABLE_DCPIPE, |
- NULLABLE_DPPIPE, |
- NULLABLE_MSGPIPE, |
- NULLABLE_SHAREDBUFFER |
-) |
- |
- |
-class NamedValue(object): |
- def __init__(self, module, parent_kind, name): |
- self.module = module |
- self.namespace = module.namespace |
- self.parent_kind = parent_kind |
- self.name = name |
- self.imported_from = None |
- |
- def GetSpec(self): |
- return (self.namespace + '.' + |
- (self.parent_kind and (self.parent_kind.name + '.') or "") + |
- self.name) |
- |
- |
-class BuiltinValue(object): |
- def __init__(self, value): |
- self.value = value |
- |
- |
-class ConstantValue(NamedValue): |
- def __init__(self, module, parent_kind, constant): |
- NamedValue.__init__(self, module, parent_kind, constant.name) |
- self.constant = constant |
- |
- |
-class EnumValue(NamedValue): |
- def __init__(self, module, enum, field): |
- NamedValue.__init__(self, module, enum.parent_kind, field.name) |
- self.enum = enum |
- |
- def GetSpec(self): |
- return (self.namespace + '.' + |
- (self.parent_kind and (self.parent_kind.name + '.') or "") + |
- self.enum.name + '.' + self.name) |
- |
- |
-class Constant(object): |
- def __init__(self, name=None, kind=None, value=None): |
- self.name = name |
- self.kind = kind |
- self.value = value |
- |
- |
-class Field(object): |
- def __init__(self, name=None, kind=None, ordinal=None, default=None): |
- self.name = name |
- self.kind = kind |
- self.ordinal = ordinal |
- self.default = default |
- |
- |
-class Struct(ReferenceKind): |
- ReferenceKind.AddSharedProperty('name') |
- ReferenceKind.AddSharedProperty('module') |
- ReferenceKind.AddSharedProperty('imported_from') |
- ReferenceKind.AddSharedProperty('fields') |
- |
- def __init__(self, name=None, module=None): |
- if name is not None: |
- spec = 'x:' + name |
- else: |
- spec = None |
- ReferenceKind.__init__(self, spec) |
- self.name = name |
- self.module = module |
- self.imported_from = None |
- self.fields = [] |
- |
- def AddField(self, name, kind, ordinal=None, default=None): |
- field = Field(name, kind, ordinal, default) |
- self.fields.append(field) |
- return field |
- |
- |
-class Union(ReferenceKind): |
- ReferenceKind.AddSharedProperty('name') |
- ReferenceKind.AddSharedProperty('module') |
- ReferenceKind.AddSharedProperty('imported_from') |
- ReferenceKind.AddSharedProperty('fields') |
- |
- def __init__(self, name=None, module=None): |
- if name is not None: |
- spec = 'x:' + name |
- else: |
- spec = None |
- ReferenceKind.__init__(self, spec) |
- self.name = name |
- self.module = module |
- self.imported_from = None |
- self.fields = [] |
- |
- def AddField(self, name, kind, ordinal=None): |
- field = Field(name, kind, ordinal, default=None) |
- self.fields.append(field) |
- return field |
- |
- |
-class Array(ReferenceKind): |
- ReferenceKind.AddSharedProperty('kind') |
- ReferenceKind.AddSharedProperty('length') |
- |
- def __init__(self, kind=None, length=None): |
- if kind is not None: |
- if length is not None: |
- spec = 'a%d:%s' % (length, kind.spec) |
- else: |
- spec = 'a:%s' % kind.spec |
- |
- ReferenceKind.__init__(self, spec) |
- else: |
- ReferenceKind.__init__(self) |
- self.kind = kind |
- self.length = length |
- |
- |
-class Map(ReferenceKind): |
- ReferenceKind.AddSharedProperty('key_kind') |
- ReferenceKind.AddSharedProperty('value_kind') |
- |
- def __init__(self, key_kind=None, value_kind=None): |
- if (key_kind is not None and value_kind is not None): |
- ReferenceKind.__init__(self, |
- 'm[' + key_kind.spec + '][' + value_kind.spec + |
- ']') |
- if IsNullableKind(key_kind): |
- raise Exception("Nullable kinds can not be keys in maps.") |
- if IsStructKind(key_kind): |
- # TODO(erg): It would sometimes be nice if we could key on struct |
- # values. However, what happens if the struct has a handle in it? Or |
- # non-copyable data like an array? |
- raise Exception("Structs can not be keys in maps.") |
- if IsAnyHandleKind(key_kind): |
- raise Exception("Handles can not be keys in maps.") |
- if IsArrayKind(key_kind): |
- raise Exception("Arrays can not be keys in maps.") |
- else: |
- ReferenceKind.__init__(self) |
- |
- self.key_kind = key_kind |
- self.value_kind = value_kind |
- |
- |
-class InterfaceRequest(ReferenceKind): |
- ReferenceKind.AddSharedProperty('kind') |
- |
- def __init__(self, kind=None): |
- if kind is not None: |
- if not isinstance(kind, Interface): |
- raise Exception( |
- "Interface request requires %r to be an interface." % kind.spec) |
- ReferenceKind.__init__(self, 'r:' + kind.spec) |
- else: |
- ReferenceKind.__init__(self) |
- self.kind = kind |
- |
- |
-class Parameter(object): |
- def __init__(self, name=None, kind=None, ordinal=None, default=None): |
- self.name = name |
- self.ordinal = ordinal |
- self.kind = kind |
- self.default = default |
- |
- |
-class Method(object): |
- def __init__(self, interface, name, ordinal=None): |
- self.interface = interface |
- self.name = name |
- self.ordinal = ordinal |
- self.parameters = [] |
- self.response_parameters = None |
- |
- def AddParameter(self, name, kind, ordinal=None, default=None): |
- parameter = Parameter(name, kind, ordinal, default) |
- self.parameters.append(parameter) |
- return parameter |
- |
- def AddResponseParameter(self, name, kind, ordinal=None, default=None): |
- if self.response_parameters == None: |
- self.response_parameters = [] |
- parameter = Parameter(name, kind, ordinal, default) |
- self.response_parameters.append(parameter) |
- return parameter |
- |
- |
-class Interface(ReferenceKind): |
- ReferenceKind.AddSharedProperty('module') |
- ReferenceKind.AddSharedProperty('name') |
- ReferenceKind.AddSharedProperty('imported_from') |
- ReferenceKind.AddSharedProperty('client') |
- ReferenceKind.AddSharedProperty('methods') |
- |
- def __init__(self, name=None, client=None, module=None): |
- if name is not None: |
- spec = 'x:' + name |
- else: |
- spec = None |
- ReferenceKind.__init__(self, spec) |
- self.module = module |
- self.name = name |
- self.imported_from = None |
- self.client = client |
- self.methods = [] |
- |
- def AddMethod(self, name, ordinal=None): |
- method = Method(self, name, ordinal=ordinal) |
- self.methods.append(method) |
- return method |
- |
- |
-class EnumField(object): |
- def __init__(self, name=None, value=None): |
- self.name = name |
- self.value = value |
- |
- |
-class Enum(Kind): |
- def __init__(self, name=None, module=None): |
- self.module = module |
- self.name = name |
- self.imported_from = None |
- if name is not None: |
- spec = 'x:' + name |
- else: |
- spec = None |
- Kind.__init__(self, spec) |
- self.fields = [] |
- |
- |
-class Module(object): |
- def __init__(self, name=None, namespace=None): |
- self.name = name |
- self.path = name |
- self.namespace = namespace |
- self.structs = [] |
- self.unions = [] |
- self.interfaces = [] |
- self.kinds = {} |
- |
- def AddInterface(self, name): |
- interface = Interface(name, module=self) |
- self.interfaces.append(interface) |
- return interface |
- |
- def AddStruct(self, name): |
- struct = Struct(name, module=self) |
- self.structs.append(struct) |
- return struct |
- |
- def AddUnion(self, name): |
- union = Union(name, module=self) |
- self.unions.append(union) |
- return union |
- |
- |
-def IsBoolKind(kind): |
- return kind.spec == BOOL.spec |
- |
- |
-def IsFloatKind(kind): |
- return kind.spec == FLOAT.spec |
- |
- |
-def IsStringKind(kind): |
- return kind.spec == STRING.spec or kind.spec == NULLABLE_STRING.spec |
- |
- |
-def IsHandleKind(kind): |
- return kind.spec == HANDLE.spec or kind.spec == NULLABLE_HANDLE.spec |
- |
- |
-def IsDataPipeConsumerKind(kind): |
- return kind.spec == DCPIPE.spec or kind.spec == NULLABLE_DCPIPE.spec |
- |
- |
-def IsDataPipeProducerKind(kind): |
- return kind.spec == DPPIPE.spec or kind.spec == NULLABLE_DPPIPE.spec |
- |
- |
-def IsMessagePipeKind(kind): |
- return kind.spec == MSGPIPE.spec or kind.spec == NULLABLE_MSGPIPE.spec |
- |
- |
-def IsSharedBufferKind(kind): |
- return (kind.spec == SHAREDBUFFER.spec or |
- kind.spec == NULLABLE_SHAREDBUFFER.spec) |
- |
- |
-def IsStructKind(kind): |
- return isinstance(kind, Struct) |
- |
- |
-def IsArrayKind(kind): |
- return isinstance(kind, Array) |
- |
- |
-def IsInterfaceKind(kind): |
- return isinstance(kind, Interface) |
- |
- |
-def IsInterfaceRequestKind(kind): |
- return isinstance(kind, InterfaceRequest) |
- |
- |
-def IsEnumKind(kind): |
- return isinstance(kind, Enum) |
- |
- |
-def IsReferenceKind(kind): |
- return isinstance(kind, ReferenceKind) |
- |
- |
-def IsNullableKind(kind): |
- return IsReferenceKind(kind) and kind.is_nullable |
- |
- |
-def IsMapKind(kind): |
- return isinstance(kind, Map) |
- |
- |
-def IsObjectKind(kind): |
- return (IsStructKind(kind) or IsArrayKind(kind) or IsStringKind(kind) or |
- IsMapKind(kind)) |
- |
- |
-def IsNonInterfaceHandleKind(kind): |
- return (IsHandleKind(kind) or |
- IsDataPipeConsumerKind(kind) or |
- IsDataPipeProducerKind(kind) or |
- IsMessagePipeKind(kind) or |
- IsSharedBufferKind(kind)) |
- |
- |
-def IsAnyHandleKind(kind): |
- return (IsNonInterfaceHandleKind(kind) or |
- IsInterfaceKind(kind) or |
- IsInterfaceRequestKind(kind)) |
- |
- |
-def IsMoveOnlyKind(kind): |
- return IsObjectKind(kind) or IsAnyHandleKind(kind) |
- |
- |
-def IsCloneableKind(kind): |
- def ContainsHandles(kind, visited_kinds): |
- if kind in visited_kinds: |
- # No need to examine the kind again. |
- return False |
- visited_kinds.add(kind) |
- if IsAnyHandleKind(kind): |
- return True |
- if IsArrayKind(kind): |
- return ContainsHandles(kind.kind, visited_kinds) |
- if IsStructKind(kind): |
- for field in kind.fields: |
- if ContainsHandles(field.kind, visited_kinds): |
- return True |
- return False |
- |
- return not ContainsHandles(kind, set()) |
- |
- |
-def HasCallbacks(interface): |
- for method in interface.methods: |
- if method.response_parameters != None: |
- return True |
- return False |
- |