Module: wine Branch: master Commit: 712f87ee8e4e798193ca0ab6d8cfaba566a56709 URL: https://gitlab.winehq.org/wine/wine/-/commit/712f87ee8e4e798193ca0ab6d8cfaba...
Author: Mohamad Al-Jaf mohamadaljaf@gmail.com Date: Fri Mar 31 20:43:25 2023 -0400
widl: Add support for composable attribute.
Needed to build windows.ui.composition.idl.
---
tools/widl/attribute.c | 1 + tools/widl/parser.l | 1 + tools/widl/parser.y | 17 +++++++++++++++++ tools/widl/widltypes.h | 1 + 4 files changed, 20 insertions(+)
diff --git a/tools/widl/attribute.c b/tools/widl/attribute.c index c5bfbce716d..b9aa99c9228 100644 --- a/tools/widl/attribute.c +++ b/tools/widl/attribute.c @@ -145,6 +145,7 @@ struct allowed_attr allowed_attr[] = /* ATTR_CASE */ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "case" }, /* ATTR_CODE */ { 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "code" }, /* ATTR_COMMSTATUS */ { 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "comm_status" }, + /* ATTR_COMPOSABLE */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, "composable" }, /* ATTR_CONTEXTHANDLE */ { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "context_handle" }, /* ATTR_CONTRACT */ { 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, "contract" }, /* ATTR_CONTRACTVERSION */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "contractversion" }, diff --git a/tools/widl/parser.l b/tools/widl/parser.l index 4f24929d5a4..445efd2d458 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -245,6 +245,7 @@ static void winrt_enable( int ns_prefix ) callback { return tCALLBACK; } code { return tCODE; } comm_status { return tCOMMSTATUS; } + composable { return token_winrt( tCOMPOSABLE, yytext, yylval ); } context_handle { return tCONTEXTHANDLE; } context_handle_noserialize { return tCONTEXTHANDLENOSERIALIZE; } context_handle_serialize { return tCONTEXTHANDLENOSERIALIZE; } diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 29be784448d..9b81f9521fa 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -186,6 +186,7 @@ void pop_import( PARSER_LTYPE *yylloc ); %token tAPPOBJECT tASYNC tASYNCUUID %token tAUTOHANDLE tBINDABLE tBOOLEAN tBROADCAST tBYTE tBYTECOUNT %token tCALLAS tCALLBACK tCASE tCHAR tCOCLASS tCODE tCOMMSTATUS +%token tCOMPOSABLE %token tCONST tCONTEXTHANDLE tCONTEXTHANDLENOSERIALIZE %token tCONTEXTHANDLESERIALIZE %token tCONTRACT @@ -285,6 +286,7 @@ void pop_import( PARSER_LTYPE *yylloc ); %token tWCHAR tWIREMARSHAL %token tAPARTMENT tNEUTRAL tSINGLE tFREE tBOTH
+%type <attr> access_attr %type <attr> attribute acf_attribute %type <attr_list> m_attributes attributes attrib_list %type <attr_list> acf_attributes acf_attribute_list @@ -295,6 +297,7 @@ void pop_import( PARSER_LTYPE *yylloc ); %type <expr> contract_req %type <expr> static_attr %type <expr> activatable_attr +%type <expr> composable_attr %type <type> delegatedef %type <stgclass> storage_cls_spec %type <type_qualifier> type_qualifier m_type_qual_list @@ -612,6 +615,19 @@ activatable_attr: | contract_req { $$ = $1; } /* activatable on the default activation factory */ ;
+access_attr + : tPUBLIC { $$ = attr_int( @$, ATTR_PUBLIC, 0 ); } + | tPROTECTED { $$ = attr_int( @$, ATTR_PROTECTED, 0 ); } + ; + +composable_attr + : decl_spec ',' access_attr ',' contract_req + { if ($1->type->type_type != TYPE_INTERFACE) + error_loc( "type %s is not an interface\n", $1->type->name ); + $$ = make_exprt( EXPR_MEMBER, declare_var( append_attr( NULL, $3 ), $1, make_declarator( NULL ), 0 ), $5 ); + } + ; + attribute : %empty { $$ = NULL; } | tACTIVATABLE '(' activatable_attr ')' { $$ = attr_ptr( @$, ATTR_ACTIVATABLE, $3 ); } @@ -625,6 +641,7 @@ attribute | tCALLAS '(' ident ')' { $$ = attr_ptr( @$, ATTR_CALLAS, $3 ); } | tCASE '(' expr_list_int_const ')' { $$ = attr_ptr( @$, ATTR_CASE, $3 ); } | tCODE { $$ = attr_int( @$, ATTR_CODE, 0 ); } + | tCOMPOSABLE '(' composable_attr ')' { $$ = attr_ptr( @$, ATTR_COMPOSABLE, $3 ); } | tCOMMSTATUS { $$ = attr_int( @$, ATTR_COMMSTATUS, 0 ); } | tCONTEXTHANDLE { $$ = attr_int( @$, ATTR_CONTEXTHANDLE, 0 ); } | tCONTEXTHANDLENOSERIALIZE { $$ = attr_int( @$, ATTR_CONTEXTHANDLE, 0 ); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ } diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 7b68b684c0b..ad6a4e0b7ec 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -84,6 +84,7 @@ enum attr_type ATTR_CASE, ATTR_CODE, ATTR_COMMSTATUS, + ATTR_COMPOSABLE, ATTR_CONTEXTHANDLE, ATTR_CONTRACT, ATTR_CONTRACTVERSION,