def GetCppType(kind):
if isinstance(kind, mojom.Struct):
- return "%s_Data*" % kind.name
+ return "%s_Data*" % kind.GetFullNameInternal("::")
if isinstance(kind, mojom.Array):
return "mojo::internal::Array_Data<%s>*" % GetCppType(kind.kind)
+ if isinstance(kind, mojom.Interface):
+ return "mojo::Interface<%s>::Handle" % kind.name
if kind.spec == 's':
return "mojo::internal::String_Data*"
return _kind_to_cpp_type[kind]
def GetCppArrayArgWrapperType(kind):
if isinstance(kind, mojom.Struct):
- return kind.name
+ return kind.GetFullName("::")
if isinstance(kind, mojom.Array):
return "mojo::Array<%s >" % GetCppArrayArgWrapperType(kind.kind)
+ if isinstance(kind, mojom.Interface):
+ return "mojo::Interface<%s>::Handle" % kind.name
if kind.spec == 's':
return "mojo::String"
return _kind_to_cpp_type[kind]
def GetCppWrapperType(kind):
if isinstance(kind, mojom.Struct):
- return kind.name
+ return kind.GetFullName("::")
if isinstance(kind, mojom.Array):
return "mojo::Array<%s >" % GetCppArrayArgWrapperType(kind.kind)
+ if isinstance(kind, mojom.Interface):
+ return "mojo::Passable<typename mojo::Interface<%s>::Handle>" % kind.name
if kind.spec == 's':
return "mojo::String"
if mojom_generator.IsHandleKind(kind):
def GetCppConstWrapperType(kind):
if isinstance(kind, mojom.Struct):
- return "const %s&" % kind.name
+ return "const %s&" % kind.GetFullName("::")
if isinstance(kind, mojom.Array):
return "const mojo::Array<%s >&" % GetCppArrayArgWrapperType(kind.kind)
+ if isinstance(kind, mojom.Interface):
+ return "mojo::Interface<%s>::ScopedHandle" % kind.name
if kind.spec == 's':
return "const mojo::String&"
if kind.spec == 'h':
return _kind_to_cpp_type[kind]
def GetCppFieldType(kind):
- if mojom_generator.IsHandleKind(kind):
- return _kind_to_cpp_type[kind]
if isinstance(kind, mojom.Struct):
- return "mojo::internal::StructPointer<%s_Data>" % kind.name
+ return ("mojo::internal::StructPointer<%s_Data>" %
+ kind.GetFullNameInternal("::"))
if isinstance(kind, mojom.Array):
return "mojo::internal::ArrayPointer<%s>" % GetCppType(kind.kind)
+ if isinstance(kind, mojom.Interface):
+ return "mojo::Interface<%s>::Handle" % kind.name
if kind.spec == 's':
return "mojo::internal::StringPointer"
return _kind_to_cpp_type[kind]
return True
return False
+def SubstituteNamespace(token, module):
+ for import_item in module.imports:
+ token = token.replace(import_item["namespace"] + ".",
+ import_item["namespace"] + "::")
+ return token
+
+def ExpressionToText(value, module):
+ if value[0] != "EXPRESSION":
+ raise Exception("Expected EXPRESSION, got" + value)
+ return "".join(mojom_generator.ExpressionMapper(value,
+ lambda token: SubstituteNamespace(token, module)))
+
_HEADER_SIZE = 8
class Generator(mojom_generator.Generator):
"cpp_field_type": GetCppFieldType,
"cpp_type": GetCppType,
"cpp_wrapper_type": GetCppWrapperType,
+ "expression_to_text": ExpressionToText,
"get_pad": mojom_pack.GetPad,
"is_handle_kind": mojom_generator.IsHandleKind,
"is_object_kind": mojom_generator.IsObjectKind,
"struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE,
"struct_from_method": mojom_generator.GetStructFromMethod,
"stylize_method": mojom_generator.StudlyCapsToCamel,
+ "verify_token_type": mojom_generator.VerifyTokenType,
}
- @UseJinja("cpp_templates/module.h.tmpl", filters=cpp_filters)
- def GenerateModuleHeader(self):
+ def GetJinjaExports(self):
return {
+ "module": self.module,
"module_name": self.module.name,
"namespace": self.module.namespace,
+ "imports": self.module.imports,
+ "kinds": self.module.kinds,
"enums": self.module.enums,
"structs": self.GetStructs(),
"interfaces": self.module.interfaces,
"include_prefix": self.GetIncludePrefix(),
}
+ @UseJinja("cpp_templates/module.h.tmpl", filters=cpp_filters)
+ def GenerateModuleHeader(self):
+ return self.GetJinjaExports()
+
@UseJinja("cpp_templates/module_internal.h.tmpl", filters=cpp_filters)
def GenerateModuleInternalHeader(self):
- return {
- "module_name": self.module.name,
- "namespace": self.module.namespace,
- "enums": self.module.enums,
- "structs": self.GetStructs(),
- "interfaces": self.module.interfaces,
- "include_prefix": self.GetIncludePrefix(),
- }
+ return self.GetJinjaExports()
@UseJinja("cpp_templates/module.cc.tmpl", filters=cpp_filters)
def GenerateModuleSource(self):
- return {
- "module_name": self.module.name,
- "namespace": self.module.namespace,
- "enums": self.module.enums,
- "structs": self.GetStructs(),
- "interfaces": self.module.interfaces,
- "include_prefix": self.GetIncludePrefix(),
- }
+ return self.GetJinjaExports()
def GenerateFiles(self):
self.Write(self.GenerateModuleHeader(), "%s.h" % self.module.name)