From: Bernhard Kölbl bkoelbl@codeweavers.com
--- tools/widl/header.c | 25 +++++++++++++++++++++++++ tools/widl/parser.l | 1 + tools/widl/parser.y | 8 ++++++++ tools/widl/widltypes.h | 1 + 4 files changed, 35 insertions(+)
diff --git a/tools/widl/header.c b/tools/widl/header.c index b7497e215d5..5a8ee8bd430 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -158,6 +158,23 @@ 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_msg = deprecated_attr->ref; + const expr_t *contract_req = deprecated_attr->ext2; + if (deprecated_msg->type == EXPR_STRLIT && contract_req->type == EXPR_GTREQL) { + const char *deprecated_text = deprecated_msg->u.sval; + const expr_t *contract_ver = contract_req->ref; + + write_apicontract_guard_start( h, contract_ver ); + indent( h, 0 ); + fprintf( h, "DEPRECATED("%s")\n", deprecated_text ); + write_apicontract_guard_end( h, contract_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; @@ -1174,6 +1191,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"; @@ -1220,6 +1238,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); @@ -1304,6 +1324,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)); @@ -2098,6 +2121,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, "#ifndef __WIDL_INLINE\n"); fprintf(header, "#if defined(__cplusplus) || defined(_MSC_VER)\n"); fprintf(header, "#define __WIDL_INLINE inline\n"); diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 445efd2d458..afbdf7151f0 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -258,6 +258,7 @@ static void winrt_enable( int ns_prefix ) defaultcollelem { return tDEFAULTCOLLELEM; } defaultvalue { return tDEFAULTVALUE; } defaultvtable { return tDEFAULTVTABLE; } + deprecated { return token_winrt( tDEPRECATED, yytext, yylval ); } disable_consistency_check { return tDISABLECONSISTENCYCHECK; } displaybind { return tDISPLAYBIND; } dllname { return tDLLNAME; } diff --git a/tools/widl/parser.y b/tools/widl/parser.y index b802f75874d..d449a29c725 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -199,6 +199,7 @@ void pop_import( PARSER_LTYPE *yylloc ); %token tDEFAULTCOLLELEM %token tDEFAULTVALUE %token tDEFAULTVTABLE +%token tDEPRECATED %token tDISABLECONSISTENCYCHECK tDISPLAYBIND %token tDISPINTERFACE %token tDLLNAME tDONTFREE tDOUBLE tDUAL @@ -298,6 +299,7 @@ void pop_import( PARSER_LTYPE *yylloc ); %type <expr> static_attr %type <expr> activatable_attr %type <expr> composable_attr +%type <expr> deprecated_attr %type <type> delegatedef %type <stgclass> storage_cls_spec %type <type_qualifier> type_qualifier m_type_qual_list @@ -628,6 +630,11 @@ composable_attr } ;
+deprecated_attr + : aSTRING ',' aIDENTIFIER ',' contract_req + { $$ = make_expr3( EXPR_MEMBER, make_exprs( EXPR_STRLIT, $1 ), make_exprs( EXPR_IDENTIFIER, $1 ), $5 ); } + ; + attribute : %empty { $$ = NULL; } | tACTIVATABLE '(' activatable_attr ')' { $$ = attr_ptr( @$, ATTR_ACTIVATABLE, $3 ); } @@ -659,6 +666,7 @@ attribute | tDEFAULTCOLLELEM { $$ = attr_int( @$, ATTR_DEFAULTCOLLELEM, 0 ); } | tDEFAULTVALUE '(' expr_const ')' { $$ = attr_ptr( @$, ATTR_DEFAULTVALUE, $3 ); } | tDEFAULTVTABLE { $$ = attr_int( @$, ATTR_DEFAULTVTABLE, 0 ); } + | tDEPRECATED '(' deprecated_attr ')' { $$ = attr_ptr( @$, ATTR_DEPRECATED, $3 ); } | tDISABLECONSISTENCYCHECK { $$ = attr_int( @$, ATTR_DISABLECONSISTENCYCHECK, 0 ); } | tDISPLAYBIND { $$ = attr_int( @$, ATTR_DISPLAYBIND, 0 ); } | tDLLNAME '(' aSTRING ')' { $$ = attr_ptr( @$, ATTR_DLLNAME, $3 ); } diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index ad6a4e0b7ec..b92c8c15e68 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,