_eolian_decl_get(Eo_Lexer *ls, const char *name)
{
Eolian_Object *obj = eina_hash_find(ls->state->unit.objects, name);
+ if (!obj)
+ obj = eina_hash_find(ls->state->staging.objects, name);
if (obj && ((obj->type == EOLIAN_OBJECT_CLASS) ||
(obj->type == EOLIAN_OBJECT_TYPEDECL) ||
(obj->type == EOLIAN_OBJECT_VARIABLE)))
{
/* object storage */
eina_hash_add(unit->objects, obj->name, obj);
- eina_hash_add(unit->state->unit.objects, obj->name, obj);
+ eina_hash_add(unit->state->staging.objects, obj->name, obj);
eina_hash_set(unit->state->objects_f, obj->file, eina_list_append
((Eina_List *)eina_hash_find(unit->state->objects_f, obj->file), obj));
}
return EINA_TRUE;
}
+static Eina_Bool
+_merge_unit_cb_noref(const Eina_Hash *hash EINA_UNUSED,
+ const void *key, void *data, void *fdata)
+{
+ Eina_Hash *dest = fdata;
+ if (!eina_hash_find(dest, key))
+ eina_hash_add(dest, key, data);
+ return EINA_TRUE;
+}
+
static void
_merge_unit(Eolian_Unit *dest, Eolian_Unit *src)
{
eina_hash_foreach(src->aliases, _merge_unit_cb, dest->aliases);
eina_hash_foreach(src->structs, _merge_unit_cb, dest->structs);
eina_hash_foreach(src->enums, _merge_unit_cb, dest->enums);
- eina_hash_foreach(src->objects, _merge_unit_cb, dest->objects);
+ eina_hash_foreach(src->objects, _merge_unit_cb_noref, dest->objects);
}
typedef struct _Merge_Data
_merge_units(ret);
if (!database_validate(ret))
return NULL;
+ _merge_unit(&state->unit, &state->staging);
+ _state_clean(state);
return &state->unit;
}
if (pd.ret && !database_validate(&state->unit))
return EINA_FALSE;
+ _merge_unit(&state->unit, &state->staging);
+ _state_clean(state);
+
return pd.ret;
}
if (pd.ret && !database_validate(&state->unit))
return EINA_FALSE;
+ _merge_unit(&state->unit, &state->staging);
+ _state_clean(state);
+
return pd.ret;
}
#define EOLIAN_OBJECT_ADD(tunit, name, obj, memb) \
{ \
- eolian_object_add(&obj->base, name, tunit->state->unit.memb); \
+ eolian_object_add(&obj->base, name, tunit->state->staging.memb); \
eolian_object_add(&obj->base, name, tunit->memb); \
}