| OLD | NEW |
| 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 if field.default: | 54 if field.default: |
| 55 if mojom.IsStructKind(field.kind): | 55 if mojom.IsStructKind(field.kind): |
| 56 assert field.default == "default" | 56 assert field.default == "default" |
| 57 return "%s::New()" % GetNameForKind(field.kind) | 57 return "%s::New()" % GetNameForKind(field.kind) |
| 58 return ExpressionToText(field.default, kind=field.kind) | 58 return ExpressionToText(field.default, kind=field.kind) |
| 59 return "" | 59 return "" |
| 60 | 60 |
| 61 def NamespaceToArray(namespace): | 61 def NamespaceToArray(namespace): |
| 62 return namespace.split(".") if namespace else [] | 62 return namespace.split(".") if namespace else [] |
| 63 | 63 |
| 64 def GetNameForKind(kind, internal = False): | 64 def GetNamePartsForKind(kind, add_same_module_namespaces, internal): |
| 65 def MapKindName_(kind): |
| 66 if not internal: |
| 67 return kind.name |
| 68 if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or |
| 69 mojom.IsInterfaceKind(kind) or mojom.IsEnumKind(kind)): |
| 70 return kind.name + "_Data" |
| 71 return kind.name |
| 72 |
| 65 parts = [] | 73 parts = [] |
| 66 if kind.imported_from: | 74 if kind.imported_from: |
| 67 parts.extend(NamespaceToArray(kind.imported_from["namespace"])) | 75 parts.extend(NamespaceToArray(kind.imported_from["namespace"])) |
| 76 elif hasattr(kind, "module") and add_same_module_namespaces: |
| 77 parts.extend(NamespaceToArray(kind.module.namespace)) |
| 68 if internal: | 78 if internal: |
| 69 parts.append("internal") | 79 parts.append("internal") |
| 70 if kind.parent_kind: | 80 if kind.parent_kind: |
| 71 parts.append(kind.parent_kind.name) | 81 parts.append(MapKindName_(kind.parent_kind)) |
| 72 parts.append(kind.name) | 82 parts.append(MapKindName_(kind)) |
| 83 return parts |
| 84 |
| 85 def GetNameForKind(kind, internal=False): |
| 86 parts = GetNamePartsForKind(kind, False, internal) |
| 87 return "::".join(parts) |
| 88 |
| 89 def GetQualifiedNameForKind(kind, internal=False): |
| 90 # Always start with an empty part to force a leading "::" on output. |
| 91 parts = [""] |
| 92 parts.extend(GetNamePartsForKind(kind, True, internal)) |
| 73 return "::".join(parts) | 93 return "::".join(parts) |
| 74 | 94 |
| 75 def GetFullMojomNameForKind(kind): | 95 def GetFullMojomNameForKind(kind): |
| 76 parts = [] | 96 parts = GetNamePartsForKind(kind, True, False) |
| 77 if kind.imported_from: | |
| 78 parts.extend(NamespaceToArray(kind.imported_from["namespace"])) | |
| 79 elif hasattr(kind, "module"): | |
| 80 parts.extend(NamespaceToArray(kind.module.namespace)) | |
| 81 parts.append(kind.name) | |
| 82 return ".".join(parts) | 97 return ".".join(parts) |
| 83 | 98 |
| 84 def IsTypemappedKind(kind): | 99 def IsTypemappedKind(kind): |
| 85 return hasattr(kind, "name") and \ | 100 return hasattr(kind, "name") and \ |
| 86 GetFullMojomNameForKind(kind) in _current_typemap | 101 GetFullMojomNameForKind(kind) in _current_typemap |
| 87 | 102 |
| 88 def IsNativeOnlyKind(kind): | 103 def IsNativeOnlyKind(kind): |
| 89 return IsTypemappedKind(kind) and kind.native_only | 104 return IsTypemappedKind(kind) and kind.native_only |
| 90 | 105 |
| 91 def GetNativeTypeName(typemapped_kind): | 106 def GetNativeTypeName(typemapped_kind): |
| 92 return _current_typemap[GetFullMojomNameForKind(typemapped_kind)]["typename"] | 107 return _current_typemap[GetFullMojomNameForKind(typemapped_kind)]["typename"] |
| 93 | 108 |
| 94 def GetQualifiedNameForKind(kind): | |
| 95 # Always start with an empty part to force a leading "::" on output. | |
| 96 parts = [""] | |
| 97 parts.extend(NamespaceToArray(kind.module.namespace)) | |
| 98 parts.append(kind.name) | |
| 99 return "::".join(parts) | |
| 100 | |
| 101 def GetCppType(kind): | 109 def GetCppType(kind): |
| 102 if mojom.IsStructKind(kind) and kind.native_only: | 110 if mojom.IsStructKind(kind) and kind.native_only: |
| 103 raise Exception("Should not be reached!") | 111 raise Exception("Should not be reached!") |
| 104 if mojom.IsArrayKind(kind): | 112 if mojom.IsArrayKind(kind): |
| 105 return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) | 113 return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind) |
| 106 if mojom.IsMapKind(kind): | 114 if mojom.IsMapKind(kind): |
| 107 return "mojo::internal::Map_Data<%s, %s>*" % ( | 115 return "mojo::internal::Map_Data<%s, %s>*" % ( |
| 108 GetCppType(kind.key_kind), GetCppType(kind.value_kind)) | 116 GetCppType(kind.key_kind), GetCppType(kind.value_kind)) |
| 109 if mojom.IsStructKind(kind): | 117 if mojom.IsStructKind(kind): |
| 110 return "%s_Data*" % GetNameForKind(kind, internal=True) | 118 return "%s*" % GetNameForKind(kind, internal=True) |
| 111 if mojom.IsUnionKind(kind): | 119 if mojom.IsUnionKind(kind): |
| 112 return "%s_Data" % GetNameForKind(kind, internal=True) | 120 return "%s" % GetNameForKind(kind, internal=True) |
| 113 if mojom.IsInterfaceKind(kind): | 121 if mojom.IsInterfaceKind(kind): |
| 114 return "mojo::internal::Interface_Data" | 122 return "mojo::internal::Interface_Data" |
| 115 if mojom.IsInterfaceRequestKind(kind): | 123 if mojom.IsInterfaceRequestKind(kind): |
| 116 return "mojo::MessagePipeHandle" | 124 return "mojo::MessagePipeHandle" |
| 117 if mojom.IsAssociatedInterfaceKind(kind): | 125 if mojom.IsAssociatedInterfaceKind(kind): |
| 118 return "mojo::internal::AssociatedInterface_Data" | 126 return "mojo::internal::AssociatedInterface_Data" |
| 119 if mojom.IsAssociatedInterfaceRequestKind(kind): | 127 if mojom.IsAssociatedInterfaceRequestKind(kind): |
| 120 return "mojo::internal::AssociatedInterfaceRequest_Data" | 128 return "mojo::internal::AssociatedInterfaceRequest_Data" |
| 121 if mojom.IsEnumKind(kind): | 129 if mojom.IsEnumKind(kind): |
| 122 return "int32_t" | 130 return GetNameForKind(kind, internal=True) |
| 123 if mojom.IsStringKind(kind): | 131 if mojom.IsStringKind(kind): |
| 124 return "mojo::internal::String_Data*" | 132 return "mojo::internal::String_Data*" |
| 125 return _kind_to_cpp_type[kind] | 133 return _kind_to_cpp_type[kind] |
| 126 | 134 |
| 127 def GetCppPodType(kind): | 135 def GetCppPodType(kind): |
| 128 if mojom.IsStringKind(kind): | 136 if mojom.IsStringKind(kind): |
| 129 return "char*" | 137 return "char*" |
| 130 return _kind_to_cpp_type[kind] | 138 return _kind_to_cpp_type[kind] |
| 131 | 139 |
| 132 def GetCppArrayArgWrapperType(kind): | 140 def GetCppArrayArgWrapperType(kind): |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 if mojom.IsSharedBufferKind(kind): | 281 if mojom.IsSharedBufferKind(kind): |
| 274 return "mojo::ScopedSharedBufferHandle" | 282 return "mojo::ScopedSharedBufferHandle" |
| 275 if not kind in _kind_to_cpp_type: | 283 if not kind in _kind_to_cpp_type: |
| 276 print "missing:", kind.spec | 284 print "missing:", kind.spec |
| 277 return _kind_to_cpp_type[kind] | 285 return _kind_to_cpp_type[kind] |
| 278 | 286 |
| 279 def GetCppFieldType(kind): | 287 def GetCppFieldType(kind): |
| 280 if IsNativeOnlyKind(kind): | 288 if IsNativeOnlyKind(kind): |
| 281 return "mojo::internal::ArrayPointer<uint8_t>" | 289 return "mojo::internal::ArrayPointer<uint8_t>" |
| 282 if mojom.IsStructKind(kind): | 290 if mojom.IsStructKind(kind): |
| 283 return ("mojo::internal::StructPointer<%s_Data>" % | 291 return ("mojo::internal::StructPointer<%s>" % |
| 284 GetNameForKind(kind, internal=True)) | 292 GetNameForKind(kind, internal=True)) |
| 285 if mojom.IsUnionKind(kind): | 293 if mojom.IsUnionKind(kind): |
| 286 return "%s_Data" % GetNameForKind(kind, internal=True) | 294 return "%s" % GetNameForKind(kind, internal=True) |
| 287 if mojom.IsArrayKind(kind): | 295 if mojom.IsArrayKind(kind): |
| 288 return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind) | 296 return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind) |
| 289 if mojom.IsMapKind(kind): | 297 if mojom.IsMapKind(kind): |
| 290 return ("mojo::internal::StructPointer<mojo::internal::Map_Data<%s, %s>>" % | 298 return ("mojo::internal::StructPointer<mojo::internal::Map_Data<%s, %s>>" % |
| 291 (GetCppType(kind.key_kind), GetCppType(kind.value_kind))) | 299 (GetCppType(kind.key_kind), GetCppType(kind.value_kind))) |
| 292 if mojom.IsInterfaceKind(kind): | 300 if mojom.IsInterfaceKind(kind): |
| 293 return "mojo::internal::Interface_Data" | 301 return "mojo::internal::Interface_Data" |
| 294 if mojom.IsInterfaceRequestKind(kind): | 302 if mojom.IsInterfaceRequestKind(kind): |
| 295 return "mojo::MessagePipeHandle" | 303 return "mojo::MessagePipeHandle" |
| 296 if mojom.IsAssociatedInterfaceKind(kind): | 304 if mojom.IsAssociatedInterfaceKind(kind): |
| 297 return "mojo::internal::AssociatedInterface_Data" | 305 return "mojo::internal::AssociatedInterface_Data" |
| 298 if mojom.IsAssociatedInterfaceRequestKind(kind): | 306 if mojom.IsAssociatedInterfaceRequestKind(kind): |
| 299 return "mojo::internal::AssociatedInterfaceRequest_Data" | 307 return "mojo::internal::AssociatedInterfaceRequest_Data" |
| 300 if mojom.IsEnumKind(kind): | 308 if mojom.IsEnumKind(kind): |
| 301 return GetNameForKind(kind) | 309 return GetNameForKind(kind, internal=True) |
| 302 if mojom.IsStringKind(kind): | 310 if mojom.IsStringKind(kind): |
| 303 return "mojo::internal::StringPointer" | 311 return "mojo::internal::StringPointer" |
| 304 return _kind_to_cpp_type[kind] | 312 return _kind_to_cpp_type[kind] |
| 305 | 313 |
| 306 def GetCppUnionFieldType(kind): | 314 def GetCppUnionFieldType(kind): |
| 307 if mojom.IsAnyHandleKind(kind): | 315 if mojom.IsAnyHandleKind(kind): |
| 308 return "MojoHandle" | 316 return "MojoHandle" |
| 309 if mojom.IsInterfaceKind(kind): | 317 if mojom.IsInterfaceKind(kind): |
| 310 return "uint64_t" | 318 return "uint64_t" |
| 311 if mojom.IsEnumKind(kind): | |
| 312 return "int32_t" | |
| 313 if mojom.IsUnionKind(kind): | 319 if mojom.IsUnionKind(kind): |
| 314 return ("mojo::internal::UnionPointer<%s_Data>" % | 320 return ("mojo::internal::UnionPointer<%s>" % |
| 315 GetNameForKind(kind, internal=True)) | 321 GetNameForKind(kind, internal=True)) |
| 316 return GetCppFieldType(kind) | 322 return GetCppFieldType(kind) |
| 317 | 323 |
| 318 def GetUnionGetterReturnType(kind): | 324 def GetUnionGetterReturnType(kind): |
| 319 if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or | 325 if (mojom.IsStructKind(kind) or mojom.IsUnionKind(kind) or |
| 320 mojom.IsArrayKind(kind) or mojom.IsMapKind(kind) or | 326 mojom.IsArrayKind(kind) or mojom.IsMapKind(kind) or |
| 321 mojom.IsAnyHandleKind(kind) or mojom.IsInterfaceKind(kind) | 327 mojom.IsAnyHandleKind(kind) or mojom.IsInterfaceKind(kind) |
| 322 or mojom.IsAssociatedKind(kind)): | 328 or mojom.IsAssociatedKind(kind)): |
| 323 return "%s&" % GetCppWrapperType(kind) | 329 return "%s&" % GetCppWrapperType(kind) |
| 324 return GetCppResultWrapperType(kind) | 330 return GetCppResultWrapperType(kind) |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 def GenerateFiles(self, args): | 515 def GenerateFiles(self, args): |
| 510 global _current_typemap | 516 global _current_typemap |
| 511 _current_typemap = self.typemap | 517 _current_typemap = self.typemap |
| 512 suffix = "-%s" % self.variant if self.variant else "" | 518 suffix = "-%s" % self.variant if self.variant else "" |
| 513 self.Write(self.GenerateModuleHeader(), | 519 self.Write(self.GenerateModuleHeader(), |
| 514 self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix))) | 520 self.MatchMojomFilePath("%s%s.h" % (self.module.name, suffix))) |
| 515 self.Write(self.GenerateModuleInternalHeader(), | 521 self.Write(self.GenerateModuleInternalHeader(), |
| 516 self.MatchMojomFilePath("%s%s-internal.h" % (self.module.name, suffix))) | 522 self.MatchMojomFilePath("%s%s-internal.h" % (self.module.name, suffix))) |
| 517 self.Write(self.GenerateModuleSource(), | 523 self.Write(self.GenerateModuleSource(), |
| 518 self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix))) | 524 self.MatchMojomFilePath("%s%s.cc" % (self.module.name, suffix))) |
| OLD | NEW |