widl: Add support for composable attribute.

Needed to build windows.ui.composition.idl.
This commit is contained in:
Mohamad Al-Jaf 2023-03-31 20:43:25 -04:00 committed by Alexandre Julliard
parent a7e1c707f1
commit 712f87ee8e
4 changed files with 20 additions and 0 deletions

View file

@ -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" },

View file

@ -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; }

View file

@ -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 */ }

View file

@ -84,6 +84,7 @@ enum attr_type
ATTR_CASE,
ATTR_CODE,
ATTR_COMMSTATUS,
ATTR_COMPOSABLE,
ATTR_CONTEXTHANDLE,
ATTR_CONTRACT,
ATTR_CONTRACTVERSION,