Steve Lhomme : widl: Precompute qualified type names, and use them for C++ interfaces.

Alexandre Julliard julliard at winehq.org
Fri Feb 19 17:20:10 CST 2021


Module: wine
Branch: master
Commit: fc533ddf32a8408db3f204dcb449f795bdbd3ce2
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=fc533ddf32a8408db3f204dcb449f795bdbd3ce2

Author: Steve Lhomme <robux4 at ycbcr.xyz>
Date:   Fri Feb 19 12:03:58 2021 +0100

widl: Precompute qualified type names, and use them for C++ interfaces.

This is what MIDL does and avoid mismatching and even fixes some compiling issues.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/widl/header.c    |  4 ++--
 tools/widl/parser.y    |  6 ++++++
 tools/widl/typetree.c  | 15 +++++++++++++++
 tools/widl/typetree.h  |  1 +
 tools/widl/widltypes.h |  1 +
 5 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index 3c8ad09bd63..5ab8a3cc26f 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -465,13 +465,13 @@ void write_type_left(FILE *h, const decl_spec_t *ds, enum name_type name_type, i
       case TYPE_INTERFACE:
       case TYPE_MODULE:
       case TYPE_COCLASS:
-        fprintf(h, "%s", name);
+        fprintf(h, "%s", type_get_qualified_name(t, name_type));
         break;
       case TYPE_RUNTIMECLASS:
         fprintf(h, "%s", type_get_name(type_runtimeclass_get_default_iface(t), name_type));
         break;
       case TYPE_DELEGATE:
-        fprintf(h, "%s", type_get_name(type_delegate_get_iface(t), name_type));
+        fprintf(h, "%s", type_get_qualified_name(type_delegate_get_iface(t), name_type));
         break;
       case TYPE_VOID:
         fprintf(h, "void");
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 4c115adf4ab..eb8035c39bc 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -2073,9 +2073,15 @@ type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, in
   nt = xmalloc(sizeof(struct rtype));
   nt->name = name;
   if (is_global_namespace(namespace))
+  {
     type->c_name = name;
+    type->qualified_name = name;
+  }
   else
+  {
     type->c_name = format_namespace(namespace, "__x_", "_C", name, use_abi_namespace ? "ABI" : NULL);
+    type->qualified_name = format_namespace(namespace, "", "::", name, use_abi_namespace ? "ABI" : NULL);
+  }
   nt->type = type;
   nt->t = t;
   nt->next = namespace->type_hash[hash];
diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c
index 40d987b7a28..319dd4ae65a 100644
--- a/tools/widl/typetree.c
+++ b/tools/widl/typetree.c
@@ -51,6 +51,7 @@ type_t *make_type(enum type_type type)
     t->attrs = NULL;
     t->c_name = NULL;
     t->signature = NULL;
+    t->qualified_name = NULL;
     memset(&t->details, 0, sizeof(t->details));
     t->typestring_offset = 0;
     t->ptrdesc = 0;
@@ -91,6 +92,19 @@ const char *type_get_name(const type_t *type, enum name_type name_type)
     return NULL;
 }
 
+const char *type_get_qualified_name(const type_t *type, enum name_type name_type)
+{
+    switch(name_type) {
+    case NAME_DEFAULT:
+        return type->qualified_name;
+    case NAME_C:
+        return type->c_name;
+    }
+
+    assert(0);
+    return NULL;
+}
+
 static size_t append_namespace(char **buf, size_t *len, size_t pos, struct namespace *namespace, const char *separator, const char *abi_prefix)
 {
     int nested = namespace && !is_global_namespace(namespace);
@@ -820,6 +834,7 @@ static void compute_delegate_iface_names(type_t *delegate, type_t *type, typeref
     iface->name = strmake("I%s", delegate->name);
     if (type) iface->c_name = format_parameterized_type_c_name(type, params, "I");
     else iface->c_name = format_namespace(delegate->namespace, "__x_", "_C", iface->name, use_abi_namespace ? "ABI" : NULL);
+    iface->qualified_name = format_namespace(delegate->namespace, "", "::", iface->name, use_abi_namespace ? "ABI" : NULL);
 }
 
 type_t *type_delegate_declare(char *name, struct namespace *namespace)
diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h
index c8bccc2fec9..805e96a9305 100644
--- a/tools/widl/typetree.h
+++ b/tools/widl/typetree.h
@@ -75,6 +75,7 @@ type_t *type_parameterized_type_specialize_declare(type_t *type, typeref_list_t
 type_t *type_parameterized_type_specialize_define(type_t *type);
 int type_is_equal(const type_t *type1, const type_t *type2);
 const char *type_get_name(const type_t *type, enum name_type name_type);
+const char *type_get_qualified_name(const type_t *type, enum name_type name_type);
 char *gen_name(void);
 extern int is_attr(const attr_list_t *list, enum attr_type t);
 
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index e01bd122b45..81646cae1d1 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -503,6 +503,7 @@ struct _type_t {
   } details;
   const char *c_name;
   const char *signature;
+  const char *qualified_name;
   unsigned int typestring_offset;
   unsigned int ptrdesc;           /* used for complex structs */
   int typelib_idx;




More information about the wine-cvs mailing list