widl: Encode coclass types in typelibs.

This commit is contained in:
Dan Hipschman 2006-07-28 13:45:33 -07:00 committed by Alexandre Julliard
parent 9265d77584
commit 678ce9875f
3 changed files with 12 additions and 2 deletions

View File

@ -638,6 +638,7 @@ int_std: tINT { $$ = make_type(RPC_FC_LONG, &std_int); } /* win32 only */
coclass: tCOCLASS aIDENTIFIER { $$ = make_class($2); } coclass: tCOCLASS aIDENTIFIER { $$ = make_class($2); }
| tCOCLASS aKNOWNTYPE { $$ = find_type($2, 0); | tCOCLASS aKNOWNTYPE { $$ = find_type($2, 0);
if ($$->defined) yyerror("multiple definition error"); if ($$->defined) yyerror("multiple definition error");
if ($$->kind != TKIND_COCLASS) yyerror("%s was not declared a coclass", $2);
} }
; ;
@ -1060,6 +1061,7 @@ static type_t *make_type(unsigned char type, type_t *ref)
{ {
type_t *t = xmalloc(sizeof(type_t)); type_t *t = xmalloc(sizeof(type_t));
t->name = NULL; t->name = NULL;
t->kind = TKIND_PRIMITIVE;
t->type = type; t->type = type;
t->ref = ref; t->ref = ref;
t->attrs = NULL; t->attrs = NULL;
@ -1153,6 +1155,7 @@ static type_t *make_class(char *name)
{ {
type_t *c = make_type(0, NULL); type_t *c = make_type(0, NULL);
c->name = name; c->name = name;
c->kind = TKIND_COCLASS;
INIT_LINK(c); INIT_LINK(c);
return c; return c;
} }

View File

@ -160,7 +160,8 @@ enum expr_type
enum type_kind enum type_kind
{ {
TKIND_ENUM = 0, TKIND_PRIMITIVE = -1,
TKIND_ENUM,
TKIND_RECORD, TKIND_RECORD,
TKIND_MODULE, TKIND_MODULE,
TKIND_INTERFACE, TKIND_INTERFACE,
@ -199,6 +200,7 @@ struct _expr_t {
struct _type_t { struct _type_t {
const char *name; const char *name;
enum type_kind kind;
unsigned char type; unsigned char type;
struct _type_t *ref; struct _type_t *ref;
const attr_t *attrs; const attr_t *attrs;

View File

@ -740,6 +740,7 @@ static importinfo_t *find_importinfo(msft_typelib_t *typelib, const char *name)
static void add_structure_typeinfo(msft_typelib_t *typelib, type_t *structure); static void add_structure_typeinfo(msft_typelib_t *typelib, type_t *structure);
static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface); static void add_interface_typeinfo(msft_typelib_t *typelib, type_t *interface);
static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration); static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration);
static void add_coclass_typeinfo(msft_typelib_t *typelib, type_t *cls);
/**************************************************************************** /****************************************************************************
@ -973,7 +974,11 @@ static int encode_type(
add_enum_typeinfo(typelib, type); add_enum_typeinfo(typelib, type);
break; break;
case 0: case 0:
error("encode_type: VT_USERDEFINED - can't yet add typedef's on the fly\n"); if (type->kind == TKIND_COCLASS)
add_coclass_typeinfo(typelib, type);
else
error("encode_type: VT_USERDEFINED - can't yet add typedef's on the fly\n");
break;
default: default:
error("encode_type: VT_USERDEFINED - unhandled type %d\n", type->type); error("encode_type: VT_USERDEFINED - unhandled type %d\n", type->type);
} }