Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(348)

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_cpp_generator.py

Issue 272323003: Mojo: Implement support for |Foo&| mojom syntax (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright 2013 The Chromium Authors. All rights reserved. 1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Generates C++ source files from a mojom.Module.""" 5 """Generates C++ source files from a mojom.Module."""
6 6
7 import mojom.generate.generator as generator 7 import mojom.generate.generator as generator
8 import mojom.generate.module as mojom 8 import mojom.generate.module as mojom
9 import mojom.generate.pack as pack 9 import mojom.generate.pack as pack
10 from mojom.generate.template_expander import UseJinja 10 from mojom.generate.template_expander import UseJinja
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 if kind.parent_kind: 42 if kind.parent_kind:
43 parts.append(kind.parent_kind.name) 43 parts.append(kind.parent_kind.name)
44 parts.append(kind.name) 44 parts.append(kind.name)
45 return "::".join(parts) 45 return "::".join(parts)
46 46
47 def GetCppType(kind): 47 def GetCppType(kind):
48 if isinstance(kind, mojom.Struct): 48 if isinstance(kind, mojom.Struct):
49 return "%s_Data*" % GetNameForKind(kind, internal=True) 49 return "%s_Data*" % GetNameForKind(kind, internal=True)
50 if isinstance(kind, mojom.Array): 50 if isinstance(kind, mojom.Array):
51 return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) 51 return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind)
52 if isinstance(kind, mojom.Interface): 52 if isinstance(kind, mojom.Interface) or \
53 isinstance(kind, mojom.InterfaceRequest):
53 return "mojo::MessagePipeHandle" 54 return "mojo::MessagePipeHandle"
54 if isinstance(kind, mojom.Enum): 55 if isinstance(kind, mojom.Enum):
55 return "int32_t" 56 return "int32_t"
56 if kind.spec == 's': 57 if kind.spec == 's':
57 return "mojo::internal::String_Data*" 58 return "mojo::internal::String_Data*"
58 return _kind_to_cpp_type[kind] 59 return _kind_to_cpp_type[kind]
59 60
60 def GetCppPodType(kind): 61 def GetCppPodType(kind):
61 if kind.spec == 's': 62 if kind.spec == 's':
62 return "char*" 63 return "char*"
63 return _kind_to_cpp_type[kind] 64 return _kind_to_cpp_type[kind]
64 65
65 def GetCppArrayArgWrapperType(kind): 66 def GetCppArrayArgWrapperType(kind):
66 if isinstance(kind, mojom.Enum): 67 if isinstance(kind, mojom.Enum):
67 return GetNameForKind(kind) 68 return GetNameForKind(kind)
68 if isinstance(kind, mojom.Struct): 69 if isinstance(kind, mojom.Struct):
69 return "%sPtr" % GetNameForKind(kind) 70 return "%sPtr" % GetNameForKind(kind)
70 if isinstance(kind, mojom.Array): 71 if isinstance(kind, mojom.Array):
71 return "mojo::Array<%s> " % GetCppArrayArgWrapperType(kind.kind) 72 return "mojo::Array<%s> " % GetCppArrayArgWrapperType(kind.kind)
72 if isinstance(kind, mojom.Interface): 73 if isinstance(kind, mojom.Interface):
73 raise Exception("Arrays of interfaces not yet supported!") 74 raise Exception("Arrays of interfaces not yet supported!")
75 if isinstance(kind, mojom.InterfaceRequest):
76 raise Exception("Arrays of interface requests not yet supported!")
74 if kind.spec == 's': 77 if kind.spec == 's':
75 return "mojo::String" 78 return "mojo::String"
76 if kind.spec == 'h': 79 if kind.spec == 'h':
77 return "mojo::ScopedHandle" 80 return "mojo::ScopedHandle"
78 if kind.spec == 'h:d:c': 81 if kind.spec == 'h:d:c':
79 return "mojo::ScopedDataPipeConsumerHandle" 82 return "mojo::ScopedDataPipeConsumerHandle"
80 if kind.spec == 'h:d:p': 83 if kind.spec == 'h:d:p':
81 return "mojo::ScopedDataPipeProducerHandle" 84 return "mojo::ScopedDataPipeProducerHandle"
82 if kind.spec == 'h:m': 85 if kind.spec == 'h:m':
83 return "mojo::ScopedMessagePipeHandle" 86 return "mojo::ScopedMessagePipeHandle"
84 if kind.spec == 'h:s': 87 if kind.spec == 'h:s':
85 return "mojo::ScopedSharedBufferHandle" 88 return "mojo::ScopedSharedBufferHandle"
86 return _kind_to_cpp_type[kind] 89 return _kind_to_cpp_type[kind]
87 90
88 def GetCppResultWrapperType(kind): 91 def GetCppResultWrapperType(kind):
89 if isinstance(kind, mojom.Enum): 92 if isinstance(kind, mojom.Enum):
90 return GetNameForKind(kind) 93 return GetNameForKind(kind)
91 if isinstance(kind, mojom.Struct): 94 if isinstance(kind, mojom.Struct):
92 return "%sPtr" % GetNameForKind(kind) 95 return "%sPtr" % GetNameForKind(kind)
93 if isinstance(kind, mojom.Array): 96 if isinstance(kind, mojom.Array):
94 return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) 97 return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
95 if isinstance(kind, mojom.Interface): 98 if isinstance(kind, mojom.Interface):
96 return "%sPtr" % kind.name 99 return "%sPtr" % kind.name
100 if isinstance(kind, mojom.InterfaceRequest):
101 return "mojo::InterfaceRequest<%s>" % kind.kind.name
97 if kind.spec == 's': 102 if kind.spec == 's':
98 return "mojo::String" 103 return "mojo::String"
99 if kind.spec == 'h': 104 if kind.spec == 'h':
100 return "mojo::ScopedHandle" 105 return "mojo::ScopedHandle"
101 if kind.spec == 'h:d:c': 106 if kind.spec == 'h:d:c':
102 return "mojo::ScopedDataPipeConsumerHandle" 107 return "mojo::ScopedDataPipeConsumerHandle"
103 if kind.spec == 'h:d:p': 108 if kind.spec == 'h:d:p':
104 return "mojo::ScopedDataPipeProducerHandle" 109 return "mojo::ScopedDataPipeProducerHandle"
105 if kind.spec == 'h:m': 110 if kind.spec == 'h:m':
106 return "mojo::ScopedMessagePipeHandle" 111 return "mojo::ScopedMessagePipeHandle"
107 if kind.spec == 'h:s': 112 if kind.spec == 'h:s':
108 return "mojo::ScopedSharedBufferHandle" 113 return "mojo::ScopedSharedBufferHandle"
109 return _kind_to_cpp_type[kind] 114 return _kind_to_cpp_type[kind]
110 115
111 def GetCppWrapperType(kind): 116 def GetCppWrapperType(kind):
112 if isinstance(kind, mojom.Enum): 117 if isinstance(kind, mojom.Enum):
113 return GetNameForKind(kind) 118 return GetNameForKind(kind)
114 if isinstance(kind, mojom.Struct): 119 if isinstance(kind, mojom.Struct):
115 return "%sPtr" % GetNameForKind(kind) 120 return "%sPtr" % GetNameForKind(kind)
116 if isinstance(kind, mojom.Array): 121 if isinstance(kind, mojom.Array):
117 return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) 122 return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
118 if isinstance(kind, mojom.Interface): 123 if isinstance(kind, mojom.Interface):
119 return "mojo::ScopedMessagePipeHandle" 124 return "mojo::ScopedMessagePipeHandle"
125 if isinstance(kind, mojom.InterfaceRequest):
126 raise Exception("InterfaceRequest fields not supported!")
120 if kind.spec == 's': 127 if kind.spec == 's':
121 return "mojo::String" 128 return "mojo::String"
122 if kind.spec == 'h': 129 if kind.spec == 'h':
123 return "mojo::ScopedHandle" 130 return "mojo::ScopedHandle"
124 if kind.spec == 'h:d:c': 131 if kind.spec == 'h:d:c':
125 return "mojo::ScopedDataPipeConsumerHandle" 132 return "mojo::ScopedDataPipeConsumerHandle"
126 if kind.spec == 'h:d:p': 133 if kind.spec == 'h:d:p':
127 return "mojo::ScopedDataPipeProducerHandle" 134 return "mojo::ScopedDataPipeProducerHandle"
128 if kind.spec == 'h:m': 135 if kind.spec == 'h:m':
129 return "mojo::ScopedMessagePipeHandle" 136 return "mojo::ScopedMessagePipeHandle"
130 if kind.spec == 'h:s': 137 if kind.spec == 'h:s':
131 return "mojo::ScopedSharedBufferHandle" 138 return "mojo::ScopedSharedBufferHandle"
132 return _kind_to_cpp_type[kind] 139 return _kind_to_cpp_type[kind]
133 140
134 def GetCppConstWrapperType(kind): 141 def GetCppConstWrapperType(kind):
135 if isinstance(kind, mojom.Struct): 142 if isinstance(kind, mojom.Struct):
136 return "%sPtr" % GetNameForKind(kind) 143 return "%sPtr" % GetNameForKind(kind)
137 if isinstance(kind, mojom.Array): 144 if isinstance(kind, mojom.Array):
138 return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind) 145 return "mojo::Array<%s>" % GetCppArrayArgWrapperType(kind.kind)
139 if isinstance(kind, mojom.Interface): 146 if isinstance(kind, mojom.Interface):
140 return "%sPtr" % kind.name 147 return "%sPtr" % kind.name
148 if isinstance(kind, mojom.InterfaceRequest):
149 return "mojo::InterfaceRequest<%s>" % kind.kind.name
141 if isinstance(kind, mojom.Enum): 150 if isinstance(kind, mojom.Enum):
142 return GetNameForKind(kind) 151 return GetNameForKind(kind)
143 if kind.spec == 's': 152 if kind.spec == 's':
144 return "const mojo::String&" 153 return "const mojo::String&"
145 if kind.spec == 'h': 154 if kind.spec == 'h':
146 return "mojo::ScopedHandle" 155 return "mojo::ScopedHandle"
147 if kind.spec == 'h:d:c': 156 if kind.spec == 'h:d:c':
148 return "mojo::ScopedDataPipeConsumerHandle" 157 return "mojo::ScopedDataPipeConsumerHandle"
149 if kind.spec == 'h:d:p': 158 if kind.spec == 'h:d:p':
150 return "mojo::ScopedDataPipeProducerHandle" 159 return "mojo::ScopedDataPipeProducerHandle"
151 if kind.spec == 'h:m': 160 if kind.spec == 'h:m':
152 return "mojo::ScopedMessagePipeHandle" 161 return "mojo::ScopedMessagePipeHandle"
153 if kind.spec == 'h:s': 162 if kind.spec == 'h:s':
154 return "mojo::ScopedSharedBufferHandle" 163 return "mojo::ScopedSharedBufferHandle"
155 if not kind in _kind_to_cpp_type: 164 if not kind in _kind_to_cpp_type:
156 print "missing:", kind.spec 165 print "missing:", kind.spec
157 return _kind_to_cpp_type[kind] 166 return _kind_to_cpp_type[kind]
158 167
159 def GetCppFieldType(kind): 168 def GetCppFieldType(kind):
160 if isinstance(kind, mojom.Struct): 169 if isinstance(kind, mojom.Struct):
161 return ("mojo::internal::StructPointer<%s_Data>" % 170 return ("mojo::internal::StructPointer<%s_Data>" %
162 GetNameForKind(kind, internal=True)) 171 GetNameForKind(kind, internal=True))
163 if isinstance(kind, mojom.Array): 172 if isinstance(kind, mojom.Array):
164 return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind) 173 return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind)
165 if isinstance(kind, mojom.Interface): 174 if isinstance(kind, mojom.Interface) or \
175 isinstance(kind, mojom.InterfaceRequest):
166 return "mojo::MessagePipeHandle" 176 return "mojo::MessagePipeHandle"
167 if isinstance(kind, mojom.Enum): 177 if isinstance(kind, mojom.Enum):
168 return GetNameForKind(kind) 178 return GetNameForKind(kind)
169 if kind.spec == 's': 179 if kind.spec == 's':
170 return "mojo::internal::StringPointer" 180 return "mojo::internal::StringPointer"
171 return _kind_to_cpp_type[kind] 181 return _kind_to_cpp_type[kind]
172 182
173 def IsStructWithHandles(struct): 183 def IsStructWithHandles(struct):
174 for pf in struct.packed.packed_fields: 184 for pf in struct.packed.packed_fields:
175 if generator.IsHandleKind(pf.field.kind): 185 if generator.IsHandleKind(pf.field.kind):
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 "cpp_type": GetCppType, 232 "cpp_type": GetCppType,
223 "cpp_wrapper_type": GetCppWrapperType, 233 "cpp_wrapper_type": GetCppWrapperType,
224 "expression_to_text": ExpressionToText, 234 "expression_to_text": ExpressionToText,
225 "get_pad": pack.GetPad, 235 "get_pad": pack.GetPad,
226 "has_callbacks": HasCallbacks, 236 "has_callbacks": HasCallbacks,
227 "should_inline": ShouldInlineStruct, 237 "should_inline": ShouldInlineStruct,
228 "is_enum_kind": generator.IsEnumKind, 238 "is_enum_kind": generator.IsEnumKind,
229 "is_move_only_kind": generator.IsMoveOnlyKind, 239 "is_move_only_kind": generator.IsMoveOnlyKind,
230 "is_handle_kind": generator.IsHandleKind, 240 "is_handle_kind": generator.IsHandleKind,
231 "is_interface_kind": generator.IsInterfaceKind, 241 "is_interface_kind": generator.IsInterfaceKind,
242 "is_interface_request_kind": generator.IsInterfaceRequestKind,
232 "is_object_kind": generator.IsObjectKind, 243 "is_object_kind": generator.IsObjectKind,
233 "is_string_kind": generator.IsStringKind, 244 "is_string_kind": generator.IsStringKind,
234 "is_array_kind": lambda kind: isinstance(kind, mojom.Array), 245 "is_array_kind": lambda kind: isinstance(kind, mojom.Array),
235 "is_struct_with_handles": IsStructWithHandles, 246 "is_struct_with_handles": IsStructWithHandles,
236 "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE, 247 "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE,
237 "struct_from_method": generator.GetStructFromMethod, 248 "struct_from_method": generator.GetStructFromMethod,
238 "response_struct_from_method": generator.GetResponseStructFromMethod, 249 "response_struct_from_method": generator.GetResponseStructFromMethod,
239 "stylize_method": generator.StudlyCapsToCamel, 250 "stylize_method": generator.StudlyCapsToCamel,
240 "verify_token_type": generator.VerifyTokenType, 251 "verify_token_type": generator.VerifyTokenType,
241 } 252 }
(...skipping 20 matching lines...) Expand all
262 273
263 @UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters) 274 @UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters)
264 def GenerateModuleSource(self): 275 def GenerateModuleSource(self):
265 return self.GetJinjaExports() 276 return self.GetJinjaExports()
266 277
267 def GenerateFiles(self, args): 278 def GenerateFiles(self, args):
268 self.Write(self.GenerateModuleHeader(), "%s.h" % self.module.name) 279 self.Write(self.GenerateModuleHeader(), "%s.h" % self.module.name)
269 self.Write(self.GenerateModuleInternalHeader(), 280 self.Write(self.GenerateModuleInternalHeader(),
270 "%s-internal.h" % self.module.name) 281 "%s-internal.h" % self.module.name)
271 self.Write(self.GenerateModuleSource(), "%s.cc" % self.module.name) 282 self.Write(self.GenerateModuleSource(), "%s.cc" % self.module.name)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698