Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / mojo / public / bindings / generators / mojom_cpp_generator.py
index c48e3f1..4420aaf 100644 (file)
@@ -32,27 +32,33 @@ _kind_to_cpp_type = {
 
 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):
@@ -61,9 +67,11 @@ def GetCppWrapperType(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':
@@ -77,12 +85,13 @@ def GetCppConstWrapperType(kind):
   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]
@@ -93,6 +102,18 @@ def IsStructWithHandles(struct):
       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):
@@ -103,6 +124,7 @@ 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,
@@ -112,40 +134,33 @@ class Generator(mojom_generator.Generator):
     "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)