diff --git a/tools/widl/header.c b/tools/widl/header.c index f19929aaf05..9ecbab5c0f2 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -816,6 +816,28 @@ const var_t *is_callas(const attr_list_t *a) return get_attrp(a, ATTR_CALLAS); } +static int is_inherited_method(const type_t *iface, const var_t *func) +{ + while ((iface = type_iface_get_inherit(iface))) + { + const statement_t *stmt; + STATEMENTS_FOR_EACH_FUNC(stmt, type_iface_get_stmts(iface)) + { + const var_t *funccmp = stmt->u.var; + + if (!is_callas(func->attrs)) + { + char inherit_name[256]; + /* compare full name including property prefix */ + strcpy(inherit_name, get_name(funccmp)); + if (!strcmp(inherit_name, get_name(func))) return 1; + } + } + } + + return 0; +} + static void write_method_macro(FILE *header, const type_t *iface, const char *name) { const statement_t *stmt; @@ -967,7 +989,10 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char if (!callconv) callconv = "STDMETHODCALLTYPE"; indent(header, 0); write_type_decl_left(header, type_function_get_rettype(func->type)); - fprintf(header, " (%s *%s)(\n", callconv, get_name(func)); + if (is_inherited_method(iface, func)) + fprintf(header, " (%s *%s_%s)(\n", callconv, iface->name, func->name); + else + fprintf(header, " (%s *%s)(\n", callconv, get_name(func)); write_args(header, type_get_function_args(func->type), name, 1, TRUE); fprintf(header, ");\n"); fprintf(header, "\n");