eolian: process classes and typedefs in order (preparation for later potential extension)
This commit is contained in:
parent
7ea7542e9e
commit
7c28de0616
|
@ -275,19 +275,28 @@ eo_lexer_set_input(Eo_Lexer *ls, const char *source)
|
|||
void
|
||||
eo_lexer_free(Eo_Lexer *ls)
|
||||
{
|
||||
Eo_Class_Def *kls;
|
||||
Eo_Type_Def *type;
|
||||
Eo_Node *nd;
|
||||
|
||||
if (!ls) return;
|
||||
if (ls->source) eina_stringshare_del(ls->source);
|
||||
if (ls->buff ) eina_strbuf_free (ls->buff);
|
||||
if (ls->handle) eina_file_close (ls->handle);
|
||||
|
||||
EINA_LIST_FREE(ls->classes, kls)
|
||||
eo_definitions_class_def_free(kls);
|
||||
|
||||
EINA_LIST_FREE(ls->typedefs, type)
|
||||
eo_definitions_type_def_free(type);
|
||||
EINA_LIST_FREE(ls->nodes, nd)
|
||||
{
|
||||
switch (nd->type)
|
||||
{
|
||||
case NODE_CLASS:
|
||||
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);
|
||||
|
||||
|
|
|
@ -42,6 +42,21 @@ typedef struct _Eo_Token
|
|||
int kw;
|
||||
} 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
|
||||
{
|
||||
int current;
|
||||
|
@ -54,8 +69,7 @@ typedef struct _Eo_Lexer
|
|||
const char *stream_end;
|
||||
jmp_buf err_jmp;
|
||||
|
||||
Eina_List *classes;
|
||||
Eina_List *typedefs;
|
||||
Eina_List *nodes;
|
||||
Eo_Lexer_Temps tmp;
|
||||
} Eo_Lexer;
|
||||
|
||||
|
|
|
@ -852,6 +852,7 @@ parse_class(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
|
|||
static void
|
||||
parse_unit(Eo_Lexer *ls)
|
||||
{
|
||||
Eo_Node *nd;
|
||||
switch (ls->t.kw)
|
||||
{
|
||||
case KW_abstract:
|
||||
|
@ -867,17 +868,25 @@ parse_unit(Eo_Lexer *ls)
|
|||
parse_class(ls, EINA_FALSE, EOLIAN_CLASS_INTERFACE);
|
||||
goto found_class;
|
||||
case KW_type:
|
||||
{
|
||||
parse_typedef(ls);
|
||||
ls->typedefs = eina_list_append(ls->typedefs, ls->tmp.type_def);
|
||||
nd = calloc(1, sizeof(Eo_Node));
|
||||
nd->type = NODE_TYPEDEF;
|
||||
nd->def_type = ls->tmp.type_def;
|
||||
ls->nodes = eina_list_append(ls->nodes, nd);
|
||||
ls->tmp.type_def = NULL;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
eo_lexer_syntax_error(ls, "invalid token");
|
||||
break;
|
||||
}
|
||||
return;
|
||||
found_class:
|
||||
ls->classes = eina_list_append(ls->classes, ls->tmp.kls);
|
||||
nd = calloc(1, sizeof(Eo_Node));
|
||||
nd->type = NODE_CLASS;
|
||||
nd->def_class = ls->tmp.kls;
|
||||
ls->nodes = eina_list_append(ls->nodes, nd);
|
||||
ls->tmp.kls = NULL;
|
||||
}
|
||||
|
||||
|
@ -908,14 +917,12 @@ _print_type(FILE *f, Eolian_Type tp)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
eo_parser_dump(Eo_Lexer *ls)
|
||||
static void
|
||||
_dump_class(Eo_Class_Def *kls)
|
||||
{
|
||||
const char *s;
|
||||
Eina_List *k, *l, *m;
|
||||
Eina_List *l, *m;
|
||||
|
||||
Eo_Type_Def *type;
|
||||
Eo_Class_Def *kls;
|
||||
Eo_Property_Def *prop;
|
||||
Eo_Method_Def *meth;
|
||||
Eo_Param_Def *param;
|
||||
|
@ -923,8 +930,6 @@ eo_parser_dump(Eo_Lexer *ls)
|
|||
Eo_Event_Def *sgn;
|
||||
Eo_Implement_Def *impl;
|
||||
|
||||
EINA_LIST_FOREACH(ls->classes, k, kls)
|
||||
{
|
||||
printf("Class: %s (%s)\n",
|
||||
kls->name, (kls->comment ? kls->comment : "-"));
|
||||
printf(" inherits from :");
|
||||
|
@ -938,7 +943,6 @@ eo_parser_dump(Eo_Lexer *ls)
|
|||
printf(" events:\n");
|
||||
EINA_LIST_FOREACH(kls->events, l, sgn)
|
||||
printf(" %s <%s> (%s)\n", sgn->name, sgn->type, sgn->comment);
|
||||
|
||||
EINA_LIST_FOREACH(kls->constructors, l, meth)
|
||||
{
|
||||
printf(" constructors: %s\n", meth->name);
|
||||
|
@ -1002,12 +1006,34 @@ eo_parser_dump(Eo_Lexer *ls)
|
|||
}
|
||||
}
|
||||
|
||||
EINA_LIST_FOREACH(ls->typedefs, k, type)
|
||||
static void
|
||||
_dump_type(Eo_Type_Def *type)
|
||||
{
|
||||
printf("Typedef: %s ", type->alias);
|
||||
_print_type(stdout, type->type);
|
||||
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
|
||||
|
@ -1021,14 +1047,12 @@ eo_parser_walk(Eo_Lexer *ls)
|
|||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
Eina_Bool
|
||||
eo_parser_database_fill(const char *filename)
|
||||
static Eina_Bool
|
||||
_db_fill_class(Eo_Class_Def *kls, const char *filename)
|
||||
{
|
||||
const char *s;
|
||||
Eina_List *k, *l, *m;
|
||||
Eina_List *l, *m;
|
||||
|
||||
Eo_Class_Def *kls;
|
||||
Eo_Type_Def *type_def;
|
||||
Eo_Property_Def *prop;
|
||||
Eo_Method_Def *meth;
|
||||
Eo_Param_Def *param;
|
||||
|
@ -1036,31 +1060,6 @@ eo_parser_database_fill(const char *filename)
|
|||
Eo_Event_Def *event;
|
||||
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);
|
||||
Eina_Bool is_iface = (kls->type == EOLIAN_CLASS_INTERFACE);
|
||||
database_class_file_set(class, filename);
|
||||
|
@ -1228,7 +1227,6 @@ eo_parser_database_fill(const char *filename)
|
|||
if (!foo_id)
|
||||
{
|
||||
ERR("Error - %s not known in class %s", impl_name + 8, eolian_class_name_get(class));
|
||||
eo_lexer_free(ls);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
database_function_set_as_virtual_pure(foo_id, ftype);
|
||||
|
@ -1244,14 +1242,74 @@ eo_parser_database_fill(const char *filename)
|
|||
database_class_event_add(class, ev);
|
||||
}
|
||||
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
EINA_LIST_FOREACH(ls->typedefs, k, type_def)
|
||||
static Eina_Bool
|
||||
_db_fill_type(Eo_Type_Def *type_def)
|
||||
{
|
||||
database_type_add(type_def->alias, type_def->type);
|
||||
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);
|
||||
return EINA_TRUE;
|
||||
|
||||
error:
|
||||
eo_lexer_free(ls);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue