Revert "eolian: process classes and typedefs in order (preparation for later potential extension)"

This reverts commit 7c28de0616.
This commit is contained in:
Daniel Kolesa 2014-06-23 18:44:11 +01:00
parent af9b338dee
commit 0f4bb89492
3 changed files with 289 additions and 370 deletions

View File

@ -275,28 +275,19 @@ eo_lexer_set_input(Eo_Lexer *ls, const char *source)
void void
eo_lexer_free(Eo_Lexer *ls) eo_lexer_free(Eo_Lexer *ls)
{ {
Eo_Node *nd; Eo_Class_Def *kls;
Eo_Type_Def *type;
if (!ls) return; if (!ls) return;
if (ls->source) eina_stringshare_del(ls->source); if (ls->source) eina_stringshare_del(ls->source);
if (ls->buff ) eina_strbuf_free (ls->buff); if (ls->buff ) eina_strbuf_free (ls->buff);
if (ls->handle) eina_file_close (ls->handle); if (ls->handle) eina_file_close (ls->handle);
EINA_LIST_FREE(ls->nodes, nd) EINA_LIST_FREE(ls->classes, kls)
{ eo_definitions_class_def_free(kls);
switch (nd->type)
{ EINA_LIST_FREE(ls->typedefs, type)
case NODE_CLASS: eo_definitions_type_def_free(type);
eo_definitions_class_def_free(nd->def_class);
break;
case NODE_TYPEDEF:
eo_definitions_type_def_free(nd->def_type);
break;
default:
break;
}
free(nd);
}
eo_definitions_temps_free(&ls->tmp); eo_definitions_temps_free(&ls->tmp);

View File

@ -42,21 +42,6 @@ typedef struct _Eo_Token
int kw; int kw;
} Eo_Token; } Eo_Token;
enum Nodes
{
NODE_CLASS = 0,
NODE_TYPEDEF
};
typedef struct _Eo_Node
{
unsigned char type;
union {
Eo_Class_Def *def_class;
Eo_Type_Def *def_type;
};
} Eo_Node;
typedef struct _Eo_Lexer typedef struct _Eo_Lexer
{ {
int current; int current;
@ -69,7 +54,8 @@ typedef struct _Eo_Lexer
const char *stream_end; const char *stream_end;
jmp_buf err_jmp; jmp_buf err_jmp;
Eina_List *nodes; Eina_List *classes;
Eina_List *typedefs;
Eo_Lexer_Temps tmp; Eo_Lexer_Temps tmp;
} Eo_Lexer; } Eo_Lexer;

View File

@ -852,7 +852,6 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
static void static void
parse_unit(Eo_Lexer *ls) parse_unit(Eo_Lexer *ls)
{ {
Eo_Node *nd;
switch (ls->t.kw) switch (ls->t.kw)
{ {
case KW_abstract: case KW_abstract:
@ -868,25 +867,17 @@ parse_unit(Eo_Lexer *ls)
parse_class(ls, EINA_FALSE, EOLIAN_CLASS_INTERFACE); parse_class(ls, EINA_FALSE, EOLIAN_CLASS_INTERFACE);
goto found_class; goto found_class;
case KW_type: case KW_type:
{
parse_typedef(ls); parse_typedef(ls);
nd = calloc(1, sizeof(Eo_Node)); ls->typedefs = eina_list_append(ls->typedefs, ls->tmp.type_def);
nd->type = NODE_TYPEDEF;
nd->def_type = ls->tmp.type_def;
ls->nodes = eina_list_append(ls->nodes, nd);
ls->tmp.type_def = NULL; ls->tmp.type_def = NULL;
break; break;
}
default: default:
eo_lexer_syntax_error(ls, "invalid token"); eo_lexer_syntax_error(ls, "invalid token");
break; break;
} }
return; return;
found_class: found_class:
nd = calloc(1, sizeof(Eo_Node)); ls->classes = eina_list_append(ls->classes, ls->tmp.kls);
nd->type = NODE_CLASS;
nd->def_class = ls->tmp.kls;
ls->nodes = eina_list_append(ls->nodes, nd);
ls->tmp.kls = NULL; ls->tmp.kls = NULL;
} }
@ -917,12 +908,14 @@ _print_type(FILE *f, Eolian_Type tp)
} }
} }
static void void
_dump_class(Eo_Class_Def *kls) eo_parser_dump(Eo_Lexer *ls)
{ {
const char *s; const char *s;
Eina_List *l, *m; Eina_List *k, *l, *m;
Eo_Type_Def *type;
Eo_Class_Def *kls;
Eo_Property_Def *prop; Eo_Property_Def *prop;
Eo_Method_Def *meth; Eo_Method_Def *meth;
Eo_Param_Def *param; Eo_Param_Def *param;
@ -930,6 +923,8 @@ _dump_class(Eo_Class_Def *kls)
Eo_Event_Def *sgn; Eo_Event_Def *sgn;
Eo_Implement_Def *impl; Eo_Implement_Def *impl;
EINA_LIST_FOREACH(ls->classes, k, kls)
{
printf("Class: %s (%s)\n", printf("Class: %s (%s)\n",
kls->name, (kls->comment ? kls->comment : "-")); kls->name, (kls->comment ? kls->comment : "-"));
printf(" inherits from :"); printf(" inherits from :");
@ -943,6 +938,7 @@ _dump_class(Eo_Class_Def *kls)
printf(" events:\n"); printf(" events:\n");
EINA_LIST_FOREACH(kls->events, l, sgn) EINA_LIST_FOREACH(kls->events, l, sgn)
printf(" %s <%s> (%s)\n", sgn->name, sgn->type, sgn->comment); printf(" %s <%s> (%s)\n", sgn->name, sgn->type, sgn->comment);
EINA_LIST_FOREACH(kls->constructors, l, meth) EINA_LIST_FOREACH(kls->constructors, l, meth)
{ {
printf(" constructors: %s\n", meth->name); printf(" constructors: %s\n", meth->name);
@ -1006,34 +1002,12 @@ _dump_class(Eo_Class_Def *kls)
} }
} }
static void EINA_LIST_FOREACH(ls->typedefs, k, type)
_dump_type(Eo_Type_Def *type)
{ {
printf("Typedef: %s ", type->alias); printf("Typedef: %s ", type->alias);
_print_type(stdout, type->type); _print_type(stdout, type->type);
printf("\n"); printf("\n");
} }
void
eo_parser_dump(Eo_Lexer *ls)
{
Eina_List *k;
Eo_Node *nd;
EINA_LIST_FOREACH(ls->nodes, k, nd)
{
switch (nd->type)
{
case NODE_CLASS:
_dump_class(nd->def_class);
break;
case NODE_TYPEDEF:
_dump_type(nd->def_type);
break;
default:
break;
}
}
} }
Eina_Bool Eina_Bool
@ -1047,12 +1021,14 @@ eo_parser_walk(Eo_Lexer *ls)
return EINA_FALSE; return EINA_FALSE;
} }
static Eina_Bool Eina_Bool
_db_fill_class(Eo_Class_Def *kls, const char *filename) eo_parser_database_fill(const char *filename)
{ {
const char *s; const char *s;
Eina_List *l, *m; Eina_List *k, *l, *m;
Eo_Class_Def *kls;
Eo_Type_Def *type_def;
Eo_Property_Def *prop; Eo_Property_Def *prop;
Eo_Method_Def *meth; Eo_Method_Def *meth;
Eo_Param_Def *param; Eo_Param_Def *param;
@ -1060,6 +1036,31 @@ _db_fill_class(Eo_Class_Def *kls, const char *filename)
Eo_Event_Def *event; Eo_Event_Def *event;
Eo_Implement_Def *impl; Eo_Implement_Def *impl;
Eo_Lexer *ls = eo_lexer_new(filename);
if (!ls)
{
ERR("unable to create lexer");
return EINA_FALSE;
}
/* read first token */
eo_lexer_get(ls);
if (!eo_parser_walk(ls))
{
eo_lexer_free(ls);
return EINA_FALSE;
}
if (!ls->classes)
{
ERR("No classes for file %s", filename);
eo_lexer_free(ls);
return EINA_FALSE;
}
EINA_LIST_FOREACH(ls->classes, k, kls)
{
Eolian_Class class = database_class_add(kls->name, kls->type); Eolian_Class class = database_class_add(kls->name, kls->type);
Eina_Bool is_iface = (kls->type == EOLIAN_CLASS_INTERFACE); Eina_Bool is_iface = (kls->type == EOLIAN_CLASS_INTERFACE);
database_class_file_set(class, filename); database_class_file_set(class, filename);
@ -1227,6 +1228,7 @@ _db_fill_class(Eo_Class_Def *kls, const char *filename)
if (!foo_id) if (!foo_id)
{ {
ERR("Error - %s not known in class %s", impl_name + 8, eolian_class_name_get(class)); ERR("Error - %s not known in class %s", impl_name + 8, eolian_class_name_get(class));
eo_lexer_free(ls);
return EINA_FALSE; return EINA_FALSE;
} }
database_function_set_as_virtual_pure(foo_id, ftype); database_function_set_as_virtual_pure(foo_id, ftype);
@ -1242,74 +1244,14 @@ _db_fill_class(Eo_Class_Def *kls, const char *filename)
database_class_event_add(class, ev); database_class_event_add(class, ev);
} }
return EINA_TRUE;
} }
static Eina_Bool EINA_LIST_FOREACH(ls->typedefs, k, type_def)
_db_fill_type(Eo_Type_Def *type_def)
{ {
database_type_add(type_def->alias, type_def->type); database_type_add(type_def->alias, type_def->type);
type_def->type = NULL; type_def->type = NULL;
return EINA_TRUE;
}
Eina_Bool
eo_parser_database_fill(const char *filename)
{
Eina_List *k;
Eo_Node *nd;
Eina_Bool has_class = EINA_FALSE;
Eo_Lexer *ls = eo_lexer_new(filename);
if (!ls)
{
ERR("unable to create lexer");
return EINA_FALSE;
}
/* read first token */
eo_lexer_get(ls);
if (!eo_parser_walk(ls))
{
eo_lexer_free(ls);
return EINA_FALSE;
}
EINA_LIST_FOREACH(ls->nodes, k, nd) if (nd->type == NODE_CLASS)
{
has_class = EINA_TRUE;
break;
}
if (!has_class)
{
ERR("No classes for file %s", filename);
eo_lexer_free(ls);
return EINA_FALSE;
}
EINA_LIST_FOREACH(ls->nodes, k, nd)
{
switch (nd->type)
{
case NODE_CLASS:
if (!_db_fill_class(nd->def_class, filename))
goto error;
break;
case NODE_TYPEDEF:
if (!_db_fill_type(nd->def_type))
goto error;
break;
default:
break;
}
} }
eo_lexer_free(ls); eo_lexer_free(ls);
return EINA_TRUE; return EINA_TRUE;
error:
eo_lexer_free(ls);
return EINA_FALSE;
} }