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