From 9d878f220b234f195732d077cd5157ff5a31f9c4 Mon Sep 17 00:00:00 2001
From: Rob Shearman <robertshearman@gmail.com>
Date: Thu, 5 Mar 2009 08:23:07 +0000
Subject: [PATCH] widl: Add coclass and module types to the global namespace.

---
 tools/widl/typetree.c | 20 ++++++++++++--------
 tools/widl/typetree.h |  4 ++--
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c
index f58935366c2..3b382781e59 100644
--- a/tools/widl/typetree.c
+++ b/tools/widl/typetree.c
@@ -96,20 +96,24 @@ type_t *type_new_alias(type_t *t, const char *name)
     return a;
 }
 
-type_t *type_new_module(const char *name)
+type_t *type_new_module(char *name)
 {
-    type_t *type = make_type(TYPE_MODULE);
+    type_t *type = get_type(TYPE_MODULE, name, 0);
+    if (type->type_type != TYPE_MODULE || type->defined)
+        error_loc("%s: redefinition error; original definition was at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
     type->name = name;
-    /* FIXME: register type to detect multiple definitions */
     return type;
 }
 
-type_t *type_new_coclass(const char *name)
+type_t *type_new_coclass(char *name)
 {
-    type_t *c = make_type(TYPE_COCLASS);
-    c->name = name;
-    /* FIXME: register type to detect multiple definitions */
-    return c;
+    type_t *type = get_type(TYPE_COCLASS, name, 0);
+    if (type->type_type != TYPE_COCLASS || type->defined)
+        error_loc("%s: redefinition error; original definition was at %s:%d\n",
+                  type->name, type->loc_info.input_name, type->loc_info.line_number);
+    type->name = name;
+    return type;
 }
 
 
diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h
index c267e5fa6b4..4c25aa1e16e 100644
--- a/tools/widl/typetree.h
+++ b/tools/widl/typetree.h
@@ -27,13 +27,13 @@
 type_t *type_new_function(var_list_t *args);
 type_t *type_new_pointer(type_t *ref, attr_list_t *attrs);
 type_t *type_new_alias(type_t *t, const char *name);
-type_t *type_new_module(const char *name);
+type_t *type_new_module(char *name);
 type_t *type_new_array(const char *name, type_t *element, int declptr,
                        unsigned int dim, expr_t *size_is, expr_t *length_is);
 type_t *type_new_basic(enum type_basic_type basic_type);
 type_t *type_new_int(enum type_basic_type basic_type, int sign);
 type_t *type_new_void(void);
-type_t *type_new_coclass(const char *name);
+type_t *type_new_coclass(char *name);
 type_t *type_new_enum(const char *name, int defined, var_list_t *enums);
 type_t *type_new_struct(char *name, int defined, var_list_t *fields);
 type_t *type_new_nonencapsulated_union(const char *name, int defined, var_list_t *fields);
-- 
GitLab