mojom_cpp_generator.py revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)# found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)"""Generates C++ source files from a mojom.Module.""" 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport mojom.generate.generator as generator 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport mojom.generate.module as mojom 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport mojom.generate.pack as pack 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochfrom mojom.generate.template_expander import UseJinja 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)_kind_to_cpp_type = { 14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.BOOL: "bool", 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.INT8: "int8_t", 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.UINT8: "uint8_t", 17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.INT16: "int16_t", 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.UINT16: "uint16_t", 19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.INT32: "int32_t", 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.UINT32: "uint32_t", 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.FLOAT: "float", 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.HANDLE: "mojo::Handle", 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.DCPIPE: "mojo::DataPipeConsumerHandle", 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.DPPIPE: "mojo::DataPipeProducerHandle", 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.MSGPIPE: "mojo::MessagePipeHandle", 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.SHAREDBUFFER: "mojo::SharedBufferHandle", 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.INT64: "int64_t", 28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.UINT64: "uint64_t", 29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch mojom.DOUBLE: "double", 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def DefaultValue(field): 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if field.default: 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if isinstance(field.kind, mojom.Struct): 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) assert field.default == "default" 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return "%s::New()" % GetNameForKind(field.kind) 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return ExpressionToText(field.default) 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return "" 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef NamespaceToArray(namespace): 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return namespace.split('.') if namespace else [] 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def GetNameForKind(kind, internal = False): 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parts = [] 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.imported_from: 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch parts.extend(NamespaceToArray(kind.imported_from["namespace"])) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if internal: 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) parts.append("internal") 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.parent_kind: 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parts.append(kind.parent_kind.name) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) parts.append(kind.name) 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "::".join(parts) 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def GetCppType(kind): 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Struct): 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "%s_Data*" % GetNameForKind(kind, internal=True) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Array): 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Interface) or \ 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) isinstance(kind, mojom.InterfaceRequest): 610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return "mojo::MessagePipeHandle" 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if isinstance(kind, mojom.Enum): 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "int32_t" 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 's': 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::internal::String_Data*" 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return _kind_to_cpp_type[kind] 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def GetCppPodType(kind): 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 's': 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "char*" 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return _kind_to_cpp_type[kind] 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def GetCppArrayArgWrapperType(kind): 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Enum): 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetNameForKind(kind) 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Struct): 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "%sPtr" % GetNameForKind(kind) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Array): 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::Array<%s> " % GetCppArrayArgWrapperType(kind.kind) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Interface): 810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) raise Exception("Arrays of interfaces not yet supported!") 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.InterfaceRequest): 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) raise Exception("Arrays of interface requests not yet supported!") 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 's': 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::String" 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h': 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedHandle" 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:d:c': 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedDataPipeConsumerHandle" 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:d:p': 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedDataPipeProducerHandle" 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:m': 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedMessagePipeHandle" 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:s': 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedSharedBufferHandle" 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return _kind_to_cpp_type[kind] 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def GetCppResultWrapperType(kind): 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Enum): 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetNameForKind(kind) 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Struct): 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "%sPtr" % GetNameForKind(kind) 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if isinstance(kind, mojom.Array): 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if isinstance(kind, mojom.Interface): 1060de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return "%sPtr" % kind.name 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.InterfaceRequest): 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::InterfaceRequest<%s>" % kind.kind.name 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.spec == 's': 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "mojo::String" 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.spec == 'h': 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "mojo::ScopedHandle" 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.spec == 'h:d:c': 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "mojo::ScopedDataPipeConsumerHandle" 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.spec == 'h:d:p': 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "mojo::ScopedDataPipeProducerHandle" 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if kind.spec == 'h:m': 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "mojo::ScopedMessagePipeHandle" 119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if kind.spec == 'h:s': 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return "mojo::ScopedSharedBufferHandle" 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return _kind_to_cpp_type[kind] 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def GetCppWrapperType(kind): 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Enum): 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetNameForKind(kind) 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Struct): 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "%sPtr" % GetNameForKind(kind) 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Array): 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Interface): 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedMessagePipeHandle" 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.InterfaceRequest): 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) raise Exception("InterfaceRequest fields not supported!") 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 's': 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::String" 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h': 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedHandle" 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:d:c': 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedDataPipeConsumerHandle" 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:d:p': 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedDataPipeProducerHandle" 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:m': 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedMessagePipeHandle" 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if kind.spec == 'h:s': 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::ScopedSharedBufferHandle" 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return _kind_to_cpp_type[kind] 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def GetCppConstWrapperType(kind): 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Struct): 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "%sPtr" % GetNameForKind(kind) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Array): 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Interface): 1540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return "%sPtr" % kind.name 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.InterfaceRequest): 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return "mojo::InterfaceRequest<%s>" % kind.kind.name 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if isinstance(kind, mojom.Enum): 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetNameForKind(kind) 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 's': 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "const mojo::String&" 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 'h': 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::ScopedHandle" 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 'h:d:c': 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::ScopedDataPipeConsumerHandle" 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 'h:d:p': 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::ScopedDataPipeProducerHandle" 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 'h:m': 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::ScopedMessagePipeHandle" 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if kind.spec == 'h:s': 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return "mojo::ScopedSharedBufferHandle" 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if not kind in _kind_to_cpp_type: 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) print "missing:", kind.spec 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return _kind_to_cpp_type[kind] 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def GetCppFieldType(kind): 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Struct): 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ("mojo::internal::StructPointer<%s_Data>" % 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetNameForKind(kind, internal=True)) 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if isinstance(kind, mojom.Array): 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind) 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(kind, mojom.Interface) or \ 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) isinstance(kind, mojom.InterfaceRequest): 1830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return "mojo::MessagePipeHandle" 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if isinstance(kind, mojom.Enum): 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return GetNameForKind(kind) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if kind.spec == 's': 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return "mojo::internal::StringPointer" 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return _kind_to_cpp_type[kind] 1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)def IsStructWithHandles(struct): 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for pf in struct.packed.packed_fields: 1920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if generator.IsHandleKind(pf.field.kind): 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return True 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return False 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def TranslateConstants(token): 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if isinstance(token, (mojom.NamedValue, mojom.EnumValue)): 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # Both variable and enum constants are constructed like: 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # Namespace::Struct::CONSTANT_NAME 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name = [] 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if token.imported_from: 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch name.extend(NamespaceToArray(token.namespace)) 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if token.parent_kind: 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) name.append(token.parent_kind.name) 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name.append(token.name) 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "::".join(name) 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return token 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)def ExpressionToText(value): 21046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return TranslateConstants(value) 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def HasCallbacks(interface): 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for method in interface.methods: 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if method.response_parameters != None: 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return True 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return False 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def ShouldInlineStruct(struct): 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # TODO(darin): Base this on the size of the wrapper class. 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if len(struct.fields) > 4: 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return False 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for field in struct.fields: 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if generator.IsHandleKind(field.kind) or generator.IsObjectKind(field.kind): 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return False 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return True 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)_HEADER_SIZE = 8 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass Generator(generator.Generator): 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cpp_filters = { 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "cpp_const_wrapper_type": GetCppConstWrapperType, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "cpp_field_type": GetCppFieldType, 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "cpp_pod_type": GetCppPodType, 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "cpp_result_type": GetCppResultWrapperType, 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "cpp_type": GetCppType, 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "cpp_wrapper_type": GetCppWrapperType, 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "default_value": DefaultValue, 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "expression_to_text": ExpressionToText, 2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "get_pad": pack.GetPad, 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "has_callbacks": HasCallbacks, 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "should_inline": ShouldInlineStruct, 2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "is_enum_kind": generator.IsEnumKind, 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "is_move_only_kind": generator.IsMoveOnlyKind, 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "is_handle_kind": generator.IsHandleKind, 2460de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) "is_interface_kind": generator.IsInterfaceKind, 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "is_interface_request_kind": generator.IsInterfaceRequestKind, 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "is_object_kind": generator.IsObjectKind, 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "is_string_kind": generator.IsStringKind, 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "is_struct_with_handles": IsStructWithHandles, 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE, 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "struct_from_method": generator.GetStructFromMethod, 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "response_struct_from_method": generator.GetResponseStructFromMethod, 2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "stylize_method": generator.StudlyCapsToCamel, 2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def GetJinjaExports(self): 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return { 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "module": self.module, 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "namespace": self.module.namespace, 2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "namespaces_as_array": NamespaceToArray(self.module.namespace), 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "imports": self.module.imports, 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "kinds": self.module.kinds, 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "enums": self.module.enums, 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "structs": self.GetStructs(), 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "interfaces": self.module.interfaces, 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @UseJinja("cpp_templates/module.h.tmpl", filters=cpp_filters) 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def GenerateModuleHeader(self): 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return self.GetJinjaExports() 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @UseJinja("cpp_templates/module-internal.h.tmpl", filters=cpp_filters) 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) def GenerateModuleInternalHeader(self): 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return self.GetJinjaExports() 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters) 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) def GenerateModuleSource(self): 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return self.GetJinjaExports() 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) def GenerateFiles(self, args): 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.Write(self.GenerateModuleHeader(), "%s.h" % self.module.name) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.Write(self.GenerateModuleInternalHeader(), 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "%s-internal.h" % self.module.name) 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) self.Write(self.GenerateModuleSource(), "%s.cc" % self.module.name) 286