[PATCH 1/6] widl: Print full namespace name on error.

Rémi Bernon rbernon at codeweavers.com
Wed Aug 26 17:57:05 CDT 2020


Not really necessary as the errors are usually more cryptic, but nice
to have when it fails there.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---

This series is just implementing a little better support of WinRT-style
interfaces in idl files, required for cleaner stubbing of some WinRT
dlls, which are in turn, necessary for some recent games to even start.

Namely, Death Stranding requires windows.gaming.input.dll, and
Flight Simulator requires windows.media.speech.dll, where some simple
stubs are enough to make both happy.

 tools/widl/parser.y    | 10 ++++++++--
 tools/widl/widltypes.h |  1 +
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 3ef8d89ba1c..98bd8949f13 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -118,7 +118,7 @@ static statement_list_t *append_statements(statement_list_t *, statement_list_t
 static attr_list_t *append_attribs(attr_list_t *, attr_list_t *);
 
 static struct namespace global_namespace = {
-    NULL, NULL, LIST_INIT(global_namespace.entry), LIST_INIT(global_namespace.children)
+    NULL, NULL, NULL, LIST_INIT(global_namespace.entry), LIST_INIT(global_namespace.children)
 };
 
 static struct namespace *current_namespace = &global_namespace;
@@ -1833,6 +1833,12 @@ static void push_namespace(const char *name)
   if(!namespace) {
     namespace = xmalloc(sizeof(*namespace));
     namespace->name = xstrdup(name);
+    if (!current_namespace->full_name) namespace->full_name = xstrdup(name);
+    else
+    {
+        namespace->full_name = xmalloc(strlen(current_namespace->full_name) + strlen(name) + 1);
+        sprintf(namespace->full_name, "%s.%s", current_namespace->full_name, name);
+    }
     namespace->parent = current_namespace;
     list_add_tail(&current_namespace->children, &namespace->entry);
     list_init(&namespace->children);
@@ -1961,7 +1967,7 @@ static type_t *find_type_or_error(const char *name, int t)
 {
   type_t *type = find_type(name, NULL, t);
   if (!type) {
-    error_loc("type '%s' not found\n", name);
+    error_loc("type '%s' not found in %s\n", name, current_namespace->full_name);
     return NULL;
   }
   return type;
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 085a0ff55f5..1634f9bd50b 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -409,6 +409,7 @@ struct alias_details
 
 struct namespace {
     const char *name;
+    char *full_name;
     struct namespace *parent;
     struct list entry;
     struct list children;
-- 
2.28.0




More information about the wine-devel mailing list