WIDL: Add missing ignore attribute. Check for inapplicable
attributes in typedef.
Saveliy Tretiakov
saveliyt at mail.ru
Wed Mar 22 07:58:14 CST 2006
ChangeLog:
Saveliy Tretiakov <saveliyt at mail.ru>
- Add missing ignore attribute.
- Check for inapplicable attributes in typedef. Changed attribute parsing
in a way Mike McCormack suggested.
- Register type alias in typelib, if ATTR_PUBLIC is set.
-------------- next part --------------
Index: tools/widl/parser.l
===================================================================
RCS file: /home/wine/wine/tools/widl/parser.l,v
retrieving revision 1.35
diff -u -p -r1.35 parser.l
--- tools/widl/parser.l 9 Feb 2006 11:51:32 -0000 1.35
+++ tools/widl/parser.l 15 Mar 2006 13:48:51 -0000
@@ -228,6 +228,7 @@ static struct keyword {
{"hyper", tHYPER},
{"id", tID},
{"idempotent", tIDEMPOTENT},
+ {"ignore", tIGNORE },
/* ... */
{"iid_is", tIIDIS},
{"immediatebind", tIMMEDIATEBIND},
Index: tools/widl/parser.y
===================================================================
RCS file: /home/wine/wine/tools/widl/parser.y,v
retrieving revision 1.63
diff -u -p -r1.63 parser.y
--- tools/widl/parser.y 9 Feb 2006 11:51:32 -0000 1.63
+++ tools/widl/parser.y 22 Mar 2006 13:01:28 -0000
@@ -198,7 +198,27 @@ static type_t std_uhyper = { "MIDL_uhype
%token tVERSION
%token tVOID
%token tWCHAR tWIREMARSHAL
+%token tIGNORE
+%type <attr> attr_aggregatable attr_appobject attr_async attr_auto_handle
+%type <attr> attr_bindable attr_callas attr_case attr_contexthandle
+%type <attr> attr_contexthandlenoserialize attr_contexthandleserialize
+%type <attr> attr_control attr_default attr_defaultcollelem attr_defaultvalue
+%type <attr> attr_defaultvtable attr_displaybind attr_dllname attr_dual
+%type <attr> attr_endpoint attr_entry attr_explicit_handle attr_handle
+%type <attr> attr_helpcontext attr_helpfile attr_helpstring attr_helpstringcontext
+%type <attr> attr_helpstringdll attr_hidden attr_id attr_idempotent attr_ignore
+%type <attr> attr_iidis attr_immediatebind attr_implicit_handle attr_in
+%type <attr> attr_inputsync attr_lengthis attr_local attr_nonbrowsable
+%type <attr> attr_noncreatable attr_nonextensible attr_object attr_odl
+%type <attr> attr_oleautomation attr_optional attr_out attr_pointerdefault
+%type <attr> attr_propget attr_propput attr_propputref attr_public attr_range
+%type <attr> attr_readonly attr_requestedit attr_restricted attr_retval
+%type <attr> attr_sizeis attr_source attr_string attr_switchis attr_switchtype
+%type <attr> attr_transmitas attr_uuid attr_v1enum attr_vararg attr_version
+%type <attr> attr_wiremarshal attr_pointertype
+
+%type <attr> typedef_attributes typedef_attrib_list typedef_attribute
%type <attr> m_attributes attributes attrib_list attribute
%type <expr> m_exprs /* exprs expr_list */ m_expr expr expr_list_const expr_const
%type <expr> array array_list
@@ -342,76 +362,147 @@ attrib_list: attribute
;
attribute:
- tAGGREGATABLE { $$ = make_attr(ATTR_AGGREGATABLE); }
- | tAPPOBJECT { $$ = make_attr(ATTR_APPOBJECT); }
- | tASYNC { $$ = make_attr(ATTR_ASYNC); }
- | tAUTOHANDLE { $$ = make_attr(ATTR_AUTO_HANDLE); }
- | tBINDABLE { $$ = make_attr(ATTR_BINDABLE); }
- | tCALLAS '(' ident ')' { $$ = make_attrp(ATTR_CALLAS, $3); }
- | tCASE '(' expr_list_const ')' { $$ = make_attrp(ATTR_CASE, $3); }
- | tCONTEXTHANDLE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); }
- | tCONTEXTHANDLENOSERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_DONT_SERIALIZE */ }
- | tCONTEXTHANDLESERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); /* RPC_CONTEXT_HANDLE_SERIALIZE */ }
- | tCONTROL { $$ = make_attr(ATTR_CONTROL); }
- | tDEFAULT { $$ = make_attr(ATTR_DEFAULT); }
- | tDEFAULTCOLLELEM { $$ = make_attr(ATTR_DEFAULTCOLLELEM); }
- | tDEFAULTVALUE '(' expr_const ')' { $$ = make_attrp(ATTR_DEFAULTVALUE_EXPR, $3); }
- | tDEFAULTVALUE '(' aSTRING ')' { $$ = make_attrp(ATTR_DEFAULTVALUE_STRING, $3); }
- | tDEFAULTVTABLE { $$ = make_attr(ATTR_DEFAULTVTABLE); }
- | tDISPLAYBIND { $$ = make_attr(ATTR_DISPLAYBIND); }
- | tDLLNAME '(' aSTRING ')' { $$ = make_attrp(ATTR_DLLNAME, $3); }
- | tDUAL { $$ = make_attr(ATTR_DUAL); }
- | tENDPOINT '(' aSTRING ')' { $$ = make_attrp(ATTR_ENDPOINT, $3); }
- | tENTRY '(' aSTRING ')' { $$ = make_attrp(ATTR_ENTRY_STRING, $3); }
- | tENTRY '(' expr_const ')' { $$ = make_attrp(ATTR_ENTRY_ORDINAL, $3); }
- | tEXPLICITHANDLE { $$ = make_attr(ATTR_EXPLICIT_HANDLE); }
- | tHANDLE { $$ = make_attr(ATTR_HANDLE); }
- | tHELPCONTEXT '(' expr_const ')' { $$ = make_attrp(ATTR_HELPCONTEXT, $3); }
- | tHELPFILE '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPFILE, $3); }
- | tHELPSTRING '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRING, $3); }
- | tHELPSTRINGCONTEXT '(' expr_const ')' { $$ = make_attrp(ATTR_HELPSTRINGCONTEXT, $3); }
- | tHELPSTRINGDLL '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRINGDLL, $3); }
- | tHIDDEN { $$ = make_attr(ATTR_HIDDEN); }
- | tID '(' expr_const ')' { $$ = make_attrp(ATTR_ID, $3); }
- | tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); }
- | tIIDIS '(' ident ')' { $$ = make_attrp(ATTR_IIDIS, $3); }
- | tIMMEDIATEBIND { $$ = make_attr(ATTR_IMMEDIATEBIND); }
- | tIMPLICITHANDLE '(' tHANDLET aIDENTIFIER ')' { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $4); }
- | tIN { $$ = make_attr(ATTR_IN); }
- | tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); }
- | tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); }
- | tLOCAL { $$ = make_attr(ATTR_LOCAL); }
- | tNONBROWSABLE { $$ = make_attr(ATTR_NONBROWSABLE); }
- | tNONCREATABLE { $$ = make_attr(ATTR_NONCREATABLE); }
- | tNONEXTENSIBLE { $$ = make_attr(ATTR_NONEXTENSIBLE); }
- | tOBJECT { $$ = make_attr(ATTR_OBJECT); }
- | tODL { $$ = make_attr(ATTR_ODL); }
- | tOLEAUTOMATION { $$ = make_attr(ATTR_OLEAUTOMATION); }
- | tOPTIONAL { $$ = make_attr(ATTR_OPTIONAL); }
- | tOUT { $$ = make_attr(ATTR_OUT); }
- | tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); }
- | tPROPGET { $$ = make_attr(ATTR_PROPGET); }
- | tPROPPUT { $$ = make_attr(ATTR_PROPPUT); }
- | tPROPPUTREF { $$ = make_attr(ATTR_PROPPUTREF); }
- | tPUBLIC { $$ = make_attr(ATTR_PUBLIC); }
- | tRANGE '(' expr_const ',' expr_const ')' { LINK($5, $3); $$ = make_attrp(ATTR_RANGE, $5); }
- | tREADONLY { $$ = make_attr(ATTR_READONLY); }
- | tREQUESTEDIT { $$ = make_attr(ATTR_REQUESTEDIT); }
- | tRESTRICTED { $$ = make_attr(ATTR_RESTRICTED); }
- | tRETVAL { $$ = make_attr(ATTR_RETVAL); }
- | tSIZEIS '(' m_exprs ')' { $$ = make_attrp(ATTR_SIZEIS, $3); }
- | tSOURCE { $$ = make_attr(ATTR_SOURCE); }
- | tSTRING { $$ = make_attr(ATTR_STRING); }
- | tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); }
- | tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, type_ref($3)); }
- | tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, type_ref($3)); }
- | tUUID '(' aUUID ')' { $$ = make_attrp(ATTR_UUID, $3); }
- | tV1ENUM { $$ = make_attr(ATTR_V1ENUM); }
- | tVARARG { $$ = make_attr(ATTR_VARARG); }
- | tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); }
- | tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, type_ref($3)); }
- | pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); }
- ;
+ attr_aggregatable
+ | attr_appobject
+ | attr_async
+ | attr_auto_handle
+ | attr_bindable
+ | attr_callas
+ | attr_case
+ | attr_contexthandle
+ | attr_contexthandlenoserialize
+ | attr_contexthandleserialize
+ | attr_control
+ | attr_default
+ | attr_defaultcollelem
+ | attr_defaultvalue
+ | attr_defaultvtable
+ | attr_displaybind
+ | attr_dllname
+ | attr_dual
+ | attr_endpoint
+ | attr_entry
+ | attr_explicit_handle
+ | attr_handle
+ | attr_helpcontext
+ | attr_helpfile
+ | attr_helpstring
+ | attr_helpstringcontext
+ | attr_helpstringdll
+ | attr_hidden
+ | attr_id
+ | attr_idempotent
+ | attr_ignore
+ | attr_iidis
+ | attr_immediatebind
+ | attr_implicit_handle
+ | attr_in
+ | attr_inputsync
+ | attr_lengthis
+ | attr_local
+ | attr_nonbrowsable
+ | attr_noncreatable
+ | attr_nonextensible
+ | attr_object attr_odl
+ | attr_oleautomation
+ | attr_optional
+ | attr_out
+ | attr_pointerdefault
+ | attr_propget
+ | attr_propput
+ | attr_propputref
+ | attr_public
+ | attr_range
+ | attr_readonly
+ | attr_requestedit
+ | attr_restricted
+ | attr_retval
+ | attr_sizeis
+ | attr_source
+ | attr_string
+ | attr_switchis
+ | attr_switchtype
+ | attr_transmitas
+ | attr_uuid
+ | attr_v1enum
+ | attr_vararg
+ | attr_version
+ | attr_wiremarshal
+ | attr_pointertype
+ ;
+
+
+attr_aggregatable: tAGGREGATABLE { $$ = make_attr(ATTR_AGGREGATABLE); } ;
+attr_appobject: tAPPOBJECT { $$ = make_attr(ATTR_APPOBJECT); } ;
+attr_async: tASYNC { $$ = make_attr(ATTR_ASYNC); } ;
+attr_auto_handle: tAUTOHANDLE { $$ = make_attr(ATTR_AUTO_HANDLE); } ;
+attr_bindable: tBINDABLE { $$ = make_attr(ATTR_BINDABLE); } ;
+attr_callas: tCALLAS '(' ident ')' { $$ = make_attrp(ATTR_CALLAS, $3); } ;
+attr_case: tCASE '(' expr_list_const ')' { $$ = make_attrp(ATTR_CASE, $3); } ;
+attr_contexthandle: tCONTEXTHANDLE{ $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); } ;
+attr_contexthandlenoserialize: tCONTEXTHANDLENOSERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); } ;
+attr_contexthandleserialize: tCONTEXTHANDLESERIALIZE { $$ = make_attrv(ATTR_CONTEXTHANDLE, 0); } ;
+attr_control: tCONTROL { $$ = make_attr(ATTR_CONTROL); } ;
+attr_default: tDEFAULT { $$ = make_attr(ATTR_DEFAULT); } ;
+attr_defaultcollelem: tDEFAULTCOLLELEM { $$ = make_attr(ATTR_DEFAULTCOLLELEM); } ;
+attr_defaultvalue: tDEFAULTVALUE '(' expr_const ')' { $$ = make_attrp(ATTR_DEFAULTVALUE_EXPR, $3); }
+ | tDEFAULTVALUE '(' aSTRING ')' { $$ = make_attrp(ATTR_DEFAULTVALUE_STRING, $3); } ;
+attr_defaultvtable: tDEFAULTVTABLE { $$ = make_attr(ATTR_DEFAULTVTABLE); } ;
+attr_displaybind: tDISPLAYBIND { $$ = make_attr(ATTR_DISPLAYBIND); } ;
+attr_dllname: tDLLNAME '(' aSTRING ')' { $$ = make_attrp(ATTR_DLLNAME, $3); } ;
+attr_dual: tDUAL { $$ = make_attr(ATTR_DUAL); } ;
+attr_endpoint: tENDPOINT '(' aSTRING ')' { $$ = make_attrp(ATTR_ENDPOINT, $3); } ;
+attr_entry: tENTRY '(' aSTRING ')' { $$ = make_attrp(ATTR_ENTRY_STRING, $3); }
+ | tENTRY '(' expr_const ')' { $$ = make_attrp(ATTR_ENTRY_ORDINAL, $3); } ;
+attr_explicit_handle: tEXPLICITHANDLE { $$ = make_attr(ATTR_EXPLICIT_HANDLE); } ;
+attr_handle: tHANDLE { $$ = make_attr(ATTR_HANDLE); } ;
+attr_helpcontext: tHELPCONTEXT '(' expr_const ')' { $$ = make_attrp(ATTR_HELPCONTEXT, $3); } ;
+attr_helpfile: tHELPFILE '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPFILE, $3); } ;
+attr_helpstring: tHELPSTRING '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRING, $3); } ;
+attr_helpstringcontext: tHELPSTRINGCONTEXT '(' expr_const ')' { $$ = make_attrp(ATTR_HELPSTRINGCONTEXT, $3); } ;
+attr_helpstringdll: tHELPSTRINGDLL '(' aSTRING ')' { $$ = make_attrp(ATTR_HELPSTRINGDLL, $3); } ;
+attr_hidden: tHIDDEN { $$ = make_attr(ATTR_HIDDEN); } ;
+attr_id: tID '(' expr_const ')' { $$ = make_attrp(ATTR_ID, $3); } ;
+attr_idempotent: tIDEMPOTENT { $$ = make_attr(ATTR_IDEMPOTENT); } ;
+attr_ignore: tIGNORE { $$ = make_attr(ATTR_IGNORE); } ;
+attr_iidis: tIIDIS '(' ident ')' { $$ = make_attrp(ATTR_IIDIS, $3); } ;
+attr_immediatebind: tIMMEDIATEBIND { $$ = make_attr(ATTR_IMMEDIATEBIND); } ;
+attr_implicit_handle: tIMPLICITHANDLE '(' tHANDLET aIDENTIFIER ')' { $$ = make_attrp(ATTR_IMPLICIT_HANDLE, $4); } ;
+attr_in: tIN { $$ = make_attr(ATTR_IN); } ;
+attr_inputsync: tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); } ;
+attr_lengthis: tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); } ;
+attr_local: tLOCAL { $$ = make_attr(ATTR_LOCAL); } ;
+attr_nonbrowsable: tNONBROWSABLE { $$ = make_attr(ATTR_NONBROWSABLE); } ;
+attr_noncreatable: tNONCREATABLE { $$ = make_attr(ATTR_NONCREATABLE); } ;
+attr_nonextensible: tNONEXTENSIBLE { $$ = make_attr(ATTR_NONEXTENSIBLE); } ;
+attr_object: tOBJECT { $$ = make_attr(ATTR_OBJECT); } ;
+attr_odl: tODL { $$ = make_attr(ATTR_ODL); } ;
+attr_oleautomation: tOLEAUTOMATION { $$ = make_attr(ATTR_OLEAUTOMATION); } ;
+attr_optional: tOPTIONAL { $$ = make_attr(ATTR_OPTIONAL); } ;
+attr_out: tOUT { $$ = make_attr(ATTR_OUT); } ;
+attr_pointerdefault: tPOINTERDEFAULT '(' pointer_type ')' { $$ = make_attrv(ATTR_POINTERDEFAULT, $3); } ;
+attr_propget: tPROPGET { $$ = make_attr(ATTR_PROPGET); } ;
+attr_propput: tPROPPUT { $$ = make_attr(ATTR_PROPPUT); } ;
+attr_propputref: tPROPPUTREF { $$ = make_attr(ATTR_PROPPUTREF); } ;
+attr_public: tPUBLIC { $$ = make_attr(ATTR_PUBLIC); } ;
+attr_range: tRANGE '(' expr_const ',' expr_const ')' { LINK($5, $3); $$ = make_attrp(ATTR_RANGE, $5); } ;
+attr_readonly: tREADONLY { $$ = make_attr(ATTR_READONLY); } ;
+attr_requestedit: tREQUESTEDIT { $$ = make_attr(ATTR_REQUESTEDIT); } ;
+attr_restricted: tRESTRICTED { $$ = make_attr(ATTR_RESTRICTED); } ;
+attr_retval: tRETVAL { $$ = make_attr(ATTR_RETVAL); } ;
+attr_sizeis: tSIZEIS '(' m_exprs ')' { $$ = make_attrp(ATTR_SIZEIS, $3); } ;
+attr_source: tSOURCE { $$ = make_attr(ATTR_SOURCE); } ;
+attr_string: tSTRING { $$ = make_attr(ATTR_STRING); } ;
+attr_switchis: tSWITCHIS '(' expr ')' { $$ = make_attrp(ATTR_SWITCHIS, $3); } ;
+attr_switchtype: tSWITCHTYPE '(' type ')' { $$ = make_attrp(ATTR_SWITCHTYPE, type_ref($3)); } ;
+attr_transmitas: tTRANSMITAS '(' type ')' { $$ = make_attrp(ATTR_TRANSMITAS, type_ref($3)); } ;
+attr_uuid: tUUID '(' aUUID ')' { $$ = make_attrp(ATTR_UUID, $3); } ;
+attr_v1enum: tV1ENUM { $$ = make_attr(ATTR_V1ENUM); } ;
+attr_vararg: tVARARG { $$ = make_attr(ATTR_VARARG); } ;
+attr_version: tVERSION '(' version ')' { $$ = make_attrv(ATTR_VERSION, $3); } ;
+attr_wiremarshal: tWIREMARSHAL '(' type ')' { $$ = make_attrp(ATTR_WIREMARSHAL, type_ref($3)); } ;
+attr_pointertype: pointer_type { $$ = make_attrv(ATTR_POINTERTYPE, $1); } ;
+
callconv:
| tSTDCALL
@@ -768,14 +859,38 @@ type: tVOID { $$ = make_tref(NULL,
| tUNION aIDENTIFIER { $$ = make_tref(NULL, find_type2($2, tsUNION)); }
;
-typedef: tTYPEDEF m_attributes type pident_list { typeref_t *tref = uniq_tref($3);
+
+typedef_attributes: { $$ = NULL; }
+ | '[' typedef_attrib_list ']' { $$ = $2; }
+ ;
+
+typedef_attrib_list: typedef_attribute
+ | typedef_attrib_list ',' typedef_attribute { LINK($3, $1); $$ = $3; }
+ | typedef_attrib_list ']' '[' typedef_attribute { LINK($4, $1); $$ = $4; }
+ ;
+
+typedef_attribute:
+ attr_contexthandle
+ | attr_contexthandlenoserialize
+ | attr_contexthandleserialize
+ | attr_handle
+ | attr_ignore
+ | attr_string
+ | attr_switchtype
+ | attr_transmitas
+ | attr_public
+ | attr_pointertype
+ ;
+
+typedef: tTYPEDEF typedef_attributes type pident_list {
+ typeref_t *tref = uniq_tref($3);
$4->tname = tref->name;
tref->name = NULL;
$$ = type_ref(tref);
$$->attrs = $2;
if (!parse_only && do_header)
write_typedef($$, $4);
- if (in_typelib && $$->attrs)
+ if (in_typelib && ($$->attrs || is_attr($2, ATTR_PUBLIC)))
add_typedef($$, $4);
reg_types($$, $4, 0);
}
Index: tools/widl/widltypes.h
===================================================================
RCS file: /home/wine/wine/tools/widl/widltypes.h,v
retrieving revision 1.36
diff -u -p -r1.36 widltypes.h
--- tools/widl/widltypes.h 9 Feb 2006 11:51:32 -0000 1.36
+++ tools/widl/widltypes.h 15 Mar 2006 14:31:01 -0000
@@ -88,6 +88,7 @@ enum attr_type
ATTR_ID,
ATTR_IDEMPOTENT,
ATTR_IIDIS,
+ ATTR_IGNORE,
ATTR_IMMEDIATEBIND,
ATTR_IMPLICIT_HANDLE,
ATTR_IN,
More information about the wine-patches
mailing list