[PATCH 1/1] widl: Add basic support for the [deprecated] attribute.
Bernhard Kölbl
wine at gitlab.winehq.org
Tue Jul 5 10:01:34 CDT 2022
From: Bernhard Kölbl <besentv at gmail.com>
Signed-off-by: Bernhard Kölbl <besentv at gmail.com>
---
tools/widl/header.c | 23 +++++++++++++++++++++++
tools/widl/parser.l | 1 +
tools/widl/parser.y | 17 ++++++++++++++++-
tools/widl/widltypes.h | 1 +
4 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index 8b9c64e1e38..1db6efbefcd 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -215,6 +215,21 @@ const char *get_name(const var_t *v)
return v->name;
}
+static void write_deprecated(FILE *h, const expr_t *deprecated_attr)
+{
+ const expr_t *deprecated_ver = deprecated_attr->u.ext;
+ const expr_t *deprecated_msg = deprecated_attr->ref->ref;
+ if (deprecated_msg->type == EXPR_STRLIT && deprecated_ver->type == EXPR_GTREQL) {
+ const char *deprecated_text = deprecated_msg->u.sval;
+ write_apicontract_guard_start(h, deprecated_ver);
+ indent(h, 0);
+ fprintf(h, "DEPRECATED(\"%s\")\n", deprecated_text);
+ write_apicontract_guard_end(h, deprecated_ver);
+ }
+ else
+ warning("Deprecated attributes without explicit contract declaration are not supported, yet.\n");
+}
+
static void write_fields(FILE *h, var_list_t *fields, enum name_type name_type)
{
unsigned nameless_struct_cnt = 0, nameless_struct_i = 0, nameless_union_cnt = 0, nameless_union_i = 0;
@@ -1231,6 +1246,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
const decl_spec_t *ret = type_function_get_ret(func->declspec.type);
const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
const var_list_t *args = type_function_get_args(func->declspec.type);
+ const expr_t *deprecated = get_attrp(func->attrs, ATTR_DEPRECATED);
const var_t *arg;
if (!callconv) callconv = "STDMETHODCALLTYPE";
@@ -1277,6 +1293,8 @@ static void write_cpp_method_def(FILE *header, const type_t *iface)
fprintf(header, "#else\n");
}
+ if (deprecated)
+ write_deprecated(header, deprecated);
indent(header, 0);
fprintf(header, "virtual ");
write_type_decl_left(header, ret);
@@ -1361,6 +1379,9 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char
}
if (!is_callas(func->attrs)) {
const char *callconv = get_attrp(func->declspec.type->attrs, ATTR_CALLCONV);
+ const expr_t *deprecated = get_attrp(func->attrs, ATTR_DEPRECATED);
+ if (deprecated)
+ write_deprecated(header, deprecated);
if (!callconv) callconv = "STDMETHODCALLTYPE";
indent(header, 0);
write_type_decl_left(header, type_function_get_ret(func->declspec.type));
@@ -2155,6 +2176,8 @@ void write_header(const statement_list_t *stmts)
fprintf(header, "#ifndef __%s__\n", header_token);
fprintf(header, "#define __%s__\n\n", header_token);
+ fprintf(header, "#define DEPRECATED(x)\n\n");
+
fprintf(header, "/* Forward declarations */\n\n");
write_forward_decls(header, stmts);
diff --git a/tools/widl/parser.l b/tools/widl/parser.l
index 9286a494d4d..5a5f54103b9 100644
--- a/tools/widl/parser.l
+++ b/tools/widl/parser.l
@@ -348,6 +348,7 @@ static const struct keyword attr_keywords[] =
{"defaultcollelem", tDEFAULTCOLLELEM, 0},
{"defaultvalue", tDEFAULTVALUE, 0},
{"defaultvtable", tDEFAULTVTABLE, 0},
+ {"deprecated", tDEPRECATED, 1},
{"disable_consistency_check", tDISABLECONSISTENCYCHECK, 0},
{"displaybind", tDISPLAYBIND, 0},
{"dllname", tDLLNAME, 0},
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index 02db99a55b7..54d6ee2ae22 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -186,6 +186,7 @@ static typelib_t *current_typelib;
%token tDEFAULTCOLLELEM
%token tDEFAULTVALUE
%token tDEFAULTVTABLE
+%token tDEPRECATED
%token tDISABLECONSISTENCYCHECK tDISPLAYBIND
%token tDISPINTERFACE
%token tDLLNAME tDONTFREE tDOUBLE tDUAL
@@ -281,8 +282,9 @@ static typelib_t *current_typelib;
%type <expr> m_expr expr expr_const expr_int_const array m_bitfield
%type <expr_list> m_exprs /* exprs expr_list */ expr_list_int_const
%type <expr> contract_req
+%type <expr> deprecated_ver
%type <expr> static_attr
-%type <expr> activatable_attr
+%type <expr> activatable_attr deprecated_attr
%type <type> delegatedef
%type <stgclass> storage_cls_spec
%type <type_qualifier> type_qualifier m_type_qual_list
@@ -591,6 +593,17 @@ activatable_attr:
}
| contract_req { $$ = $1; } /* activatable on the default activation factory */
+deprecated_ver:
+ contract_req { $$ = $1; }
+ | aNUM { $$ = make_exprl(EXPR_NUM, $1); }
+ ;
+
+deprecated_attr:
+ aSTRING ',' aIDENTIFIER ',' deprecated_ver {
+ $$ = make_expr2(EXPR_MEMBER, make_exprs(EXPR_STRLIT, $1), make_exprs(EXPR_IDENTIFIER, $3));
+ $$ = make_expr2(EXPR_MEMBER, $$, $5);
+ }
+
attribute: { $$ = NULL; }
| tACTIVATABLE '(' activatable_attr ')' { $$ = make_attrp(ATTR_ACTIVATABLE, $3); }
| tAGGREGATABLE { $$ = make_attr(ATTR_AGGREGATABLE); }
@@ -617,6 +630,7 @@ attribute: { $$ = NULL; }
| tDEFAULTCOLLELEM { $$ = make_attr(ATTR_DEFAULTCOLLELEM); }
| tDEFAULTVALUE '(' expr_const ')' { $$ = make_attrp(ATTR_DEFAULTVALUE, $3); }
| tDEFAULTVTABLE { $$ = make_attr(ATTR_DEFAULTVTABLE); }
+ | tDEPRECATED '(' deprecated_attr ')' { $$ = make_attrp(ATTR_DEPRECATED, $3); }
| tDISABLECONSISTENCYCHECK { $$ = make_attr(ATTR_DISABLECONSISTENCYCHECK); }
| tDISPLAYBIND { $$ = make_attr(ATTR_DISPLAYBIND); }
| tDLLNAME '(' aSTRING ')' { $$ = make_attrp(ATTR_DLLNAME, $3); }
@@ -2352,6 +2366,7 @@ struct allowed_attr allowed_attr[] =
/* ATTR_DEFAULTCOLLELEM */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultcollelem" },
/* ATTR_DEFAULTVALUE */ { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "defaultvalue" },
/* ATTR_DEFAULTVTABLE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "defaultvtable" },
+ /* ATTR_DEPRECATED */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "deprecated" },
/* ATTR_DISABLECONSISTENCYCHECK */{ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "disable_consistency_check" },
/* ATTR_DISPINTERFACE */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, NULL },
/* ATTR_DISPLAYBIND */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "displaybind" },
diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h
index 0d88e713433..906fd7272ff 100644
--- a/tools/widl/widltypes.h
+++ b/tools/widl/widltypes.h
@@ -96,6 +96,7 @@ enum attr_type
ATTR_DEFAULTCOLLELEM,
ATTR_DEFAULTVALUE,
ATTR_DEFAULTVTABLE,
+ ATTR_DEPRECATED,
ATTR_DISABLECONSISTENCYCHECK,
ATTR_DISPINTERFACE,
ATTR_DISPLAYBIND,
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/383
More information about the wine-devel
mailing list