eolian: refactor parsing API and path handling

This splits the eolian_file_parse API into two, one for parsing
files already present in the database (always by filename) and
one for parsing paths.

It fixes several bugs/leaks on the way (incorrect use of
stringshare etc.) as well as adds checking for whether there
are no conflicting filenames at scan time, for free. That means
it is now no longer possible to scan two paths which have an eo
or eot file of the same name in them.

It should also be faster now.

It also fixes T7820.

@fix
This commit is contained in:
Daniel Kolesa 2019-05-03 16:55:59 +02:00
parent 767631e304
commit db57523e78
13 changed files with 150 additions and 68 deletions

View File

@ -618,7 +618,7 @@ main(int argc, char **argv)
}
}
if (!eolian_state_file_parse(eos, input))
if (!eolian_state_file_path_parse(eos, input))
{
fprintf(stderr, "eolian: could not parse file '%s'\n", input);
goto end;

View File

@ -315,7 +315,7 @@ run(options_type const& opts)
for(auto&& name : opts.in_files)
{
Eolian_Unit const* unit = ::eolian_state_file_parse(opts.state, name.c_str());
Eolian_Unit const* unit = ::eolian_state_file_path_parse(opts.state, name.c_str());
if(!unit)
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
@ -398,7 +398,7 @@ database_load(options_type const& opts)
<< "No input file.";
assert(false && "Error parsing input file");
}
if (!opts.main_header && !::eolian_state_file_parse(opts.state, opts.in_files[0].c_str()))
if (!opts.main_header && !::eolian_state_file_path_parse(opts.state, opts.in_files[0].c_str()))
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
<< "Failed parsing: " << opts.in_files[0] << ".";

View File

@ -261,7 +261,7 @@ database_load(options_type const& opts)
<< "No input file.";
assert(false && "Error parsing input file");
}
if (!::eolian_state_file_parse(opts.state, opts.in_file.c_str()))
if (!::eolian_state_file_path_parse(opts.state, opts.in_file.c_str()))
{
EINA_CXX_DOM_LOG_ERR(eolian_mono::domain)
<< "Failed parsing: " << opts.in_file << ".";

View File

@ -310,7 +310,8 @@ ffi.cdef [[
Eina_Iterator *eolian_state_eot_file_paths_get(const Eolian_State *state);
Eina_Iterator *eolian_state_eo_files_get(const Eolian_State *state);
Eina_Iterator *eolian_state_eot_files_get(const Eolian_State *state);
const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filepath);
const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
Eina_Bool eolian_state_all_eo_files_parse(Eolian_State *state);
Eina_Bool eolian_state_all_eot_files_parse(Eolian_State *state);
Eina_Bool eolian_state_check(const Eolian_State *state);
@ -755,8 +756,16 @@ ffi.metatype("Eolian_State", {
return eolian.eolian_state_system_directory_add(self) ~= 0
end,
file_parse = function(self, fpath)
local v = eolian.eolian_state_file_parse(self, fpath)
file_parse = function(self, fname)
local v = eolian.eolian_state_file_parse(self, fname)
if v == nil then
return nil
end
return v
end,
file_path_parse = function(self, fpath)
local v = eolian.eolian_state_file_path_parse(self, fpath)
if v == nil then
return nil
end

View File

@ -804,8 +804,25 @@ EAPI Eina_Iterator *eolian_state_eot_files_get(const Eolian_State *state);
/*
* @brief Parse the given .eo or .eot file and fill the database.
*
* The input can be either a full path to the file or only a filename.
* If it's a filename, it must be scanned for first.
* The input must be a file name from a directory that was previously
* scanned with eolian_state_directory_add().
*
* @param[in] state The Eolian state.
* @param[in] filename The name of the file to parse.
* @return The unit corresponding to the parsed file or NULL.
*
* @see eolian_state_directory_add
* @see eolian_state_file_path_parse
*
* @ingroup Eolian
*/
EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
/*
* @brief Parse the given .eo or .eot file and fill the database.
*
* The input is a file path. Its directory is scanned first, and then
* the file itself is parsed and a unit handle is returned.
*
* @param[in] state The Eolian state.
* @param[in] filepath Path to the file to parse.
@ -815,7 +832,7 @@ EAPI Eina_Iterator *eolian_state_eot_files_get(const Eolian_State *state);
*
* @ingroup Eolian
*/
EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filepath);
EAPI const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
/*
* @brief Parse all known eo files.

View File

@ -759,22 +759,42 @@ join_path(const char *path, const char *file)
return ret;
}
static void
_scan_cb(const char *name, const char *path, void *data EINA_UNUSED)
typedef struct _Scan_State
{
Eolian_State *state = data;
Eolian_State *eos;
Eina_Bool succ;
} Scan_State;
static void
_scan_cb(const char *name, const char *path, void *data)
{
Scan_State *sst = data;
Eina_Bool is_eo = eina_str_has_suffix(name, EO_SUFFIX);
if (!is_eo && !eina_str_has_suffix(name, EOT_SUFFIX)) return;
eina_hash_add(is_eo ? state->filenames_eo : state->filenames_eot,
eina_stringshare_add(name), join_path(path, name));
Eina_Hash *fh = is_eo ? sst->eos->filenames_eo : sst->eos->filenames_eot;
const char *origpath = eina_hash_find(fh, name);
char *newpath = join_path(path, name);
if (origpath)
{
if (strcmp(origpath, newpath))
{
eolian_state_log(sst->eos,
"conflicting paths for '%s': '%s' -> '%s'",
name, origpath, newpath);
sst->succ = EINA_FALSE;
}
free(newpath);
}
else
eina_hash_add(fh, name, newpath);
}
EAPI Eina_Bool
eolian_state_directory_add(Eolian_State *state, const char *dir)
{
if (!dir || !state) return EINA_FALSE;
eina_file_dir_list(dir, EINA_TRUE, _scan_cb, state);
return EINA_TRUE;
Scan_State sst = { state, EINA_TRUE };
return eina_file_dir_list(dir, EINA_TRUE, _scan_cb, &sst);
}
EAPI Eina_Bool
@ -818,25 +838,24 @@ eolian_state_eo_file_paths_get(const Eolian_State *state)
}
static Eolian_Unit *
_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filepath)
_eolian_file_parse_nodep(Eolian_Unit *parent, const char *filename)
{
Eina_Bool is_eo;
const char *eopath;
is_eo = eina_str_has_suffix(filepath, EO_SUFFIX);
if (!is_eo && !eina_str_has_suffix(filepath, EOT_SUFFIX))
is_eo = eina_str_has_suffix(filename, EO_SUFFIX);
if (!is_eo && !eina_str_has_suffix(filename, EOT_SUFFIX))
{
eolian_state_log(parent->state,
"file '%s' doesn't have a correct extension",
filepath);
filename);
return NULL;
}
if (!(eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : parent->state->filenames_eot, filepath)))
const char *eopath = eina_hash_find(is_eo ? parent->state->filenames_eo : parent->state->filenames_eot, filename);
if (!eopath)
{
char *vpath = eina_file_path_sanitize(filepath);
Eolian_Unit *ret = eo_parser_database_fill(parent, vpath, !is_eo);
free(vpath);
return ret;
eolian_state_log(parent->state,
"file '%s' is not registered in the database",
filename);
return NULL;
}
return eo_parser_database_fill(parent, eopath, !is_eo);
}
@ -1027,13 +1046,13 @@ _merge_staging(Eolian_State *state)
}
EAPI const Eolian_Unit *
eolian_state_file_parse(Eolian_State *state, const char *filepath)
eolian_state_file_parse(Eolian_State *state, const char *filename)
{
if (!state)
return NULL;
_state_clean(state);
Eolian_Unit *ret = _eolian_file_parse_nodep(&state->staging.unit, filepath);
Eolian_Unit *ret = _eolian_file_parse_nodep(&state->staging.unit, filename);
if (!ret)
return NULL;
if (!_parse_deferred(ret))
@ -1045,6 +1064,37 @@ eolian_state_file_parse(Eolian_State *state, const char *filepath)
return ret;
}
EAPI const Eolian_Unit *
eolian_state_file_path_parse(Eolian_State *state, const char *filepath)
{
if (!state)
return NULL;
char *mpath = strdup(filepath);
if (!mpath)
return NULL;
char *fname = strrchr(mpath, '/');
if (fname && strrchr(fname, '\\'))
fname = strrchr(fname, '\\');
const char *toscan = mpath;
if (!fname)
{
toscan = ".";
fname = mpath;
}
else
*fname++ = '\0';
if (!eolian_state_directory_add(state, toscan))
{
eolian_state_log(state, "could not scan directory '%s'", toscan);
return NULL;
}
return eolian_state_file_parse(state, fname);
}
typedef struct _Parse_Data
{
Eolian_State *state;

View File

@ -422,8 +422,12 @@ class Eolian_State(Eolian_Unit):
def __repr__(self):
return "<eolian.Eolian_State, %d units loaded>" % len(list(self.units))
def file_parse(self, filepath):
c_unit = lib.eolian_state_file_parse(self, _str_to_bytes(filepath))
def file_parse(self, filename):
c_unit = lib.eolian_state_file_parse(self, _str_to_bytes(filename))
return Eolian_Unit(c_unit) if c_unit else None
def file_path_parse(self, filepath):
c_unit = lib.eolian_state_file_path_parse(self, _str_to_bytes(filepath))
return Eolian_Unit(c_unit) if c_unit else None
@property

View File

@ -52,10 +52,14 @@ lib.eolian_state_new.restype = c_void_p
lib.eolian_state_free.argtypes = (c_void_p,)
lib.eolian_state_free.restype = None
# EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filepath);
# EAPI const Eolian_Unit *eolian_state_file_parse(Eolian_State *state, const char *filename);
lib.eolian_state_file_parse.argtypes = (c_void_p, c_char_p)
lib.eolian_state_file_parse.restype = c_void_p
# EAPI const Eolian_Unit *eolian_state_file_path_parse(Eolian_State *state, const char *filepath);
lib.eolian_state_file_path_parse.argtypes = (c_void_p, c_char_p)
lib.eolian_state_file_path_parse.restype = c_void_p
# EAPI Eina_Iterator *eolian_state_eo_file_paths_get(const Eolian_State *state);
lib.eolian_state_eo_file_paths_get.argtypes = (c_void_p,)
lib.eolian_state_eo_file_paths_get.restype = c_void_p

View File

@ -11,8 +11,8 @@ EFL_START_TEST(eolian_aux_children)
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_b.eo"));
fail_if(!eolian_state_file_path_parse(eos, "aux_a.eo"));
fail_if(!eolian_state_file_parse(eos, "aux_b.eo"));
Eina_Hash *chash = eolian_aux_state_class_children_find(eos);
fail_if(!chash);
@ -48,8 +48,8 @@ EFL_START_TEST(eolian_aux_implements)
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_b.eo"));
fail_if(!eolian_state_file_parse(eos, "aux_a.eo"));
fail_if(!eolian_state_file_parse(eos, "aux_b.eo"));
Eina_Hash *chash = eolian_aux_state_class_children_find(eos);
fail_if(!chash);
@ -75,7 +75,7 @@ EFL_START_TEST(eolian_aux_callables)
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
fail_if(!eolian_state_file_parse(eos, "aux_a.eo"));
const Eolian_Class *acl = eolian_state_class_by_name_get(eos, "Aux_A");
fail_if(!acl);
@ -103,7 +103,7 @@ EFL_START_TEST(eolian_aux_implparent)
Eolian_State *eos = eolian_state_new();
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data_aux"));
fail_if(!eolian_state_file_parse(eos, TESTS_SRC_DIR"/data_aux/aux_a.eo"));
fail_if(!eolian_state_file_parse(eos, "aux_a.eo"));
const Eolian_Class *acl = eolian_state_class_by_name_get(eos, "Aux_A");
fail_if(!acl);

View File

@ -25,7 +25,7 @@ EFL_START_TEST(eolian_namespaces)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/nmsp1_class1.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "nmsp1_class1.eo")));
/* Classes existence */
fail_if(!(class11 = eolian_unit_class_by_name_get(unit, "nmsp1.class1")));
@ -105,7 +105,7 @@ EFL_START_TEST(eolian_events)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/events.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "events.eo")));
/* Class */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Events")));
@ -178,7 +178,7 @@ EFL_START_TEST(eolian_override)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/override.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "override.eo")));
/* Class */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Override")));
@ -236,7 +236,7 @@ EFL_START_TEST(eolian_consts)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/consts.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "consts.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Consts")));
/* Method */
@ -261,7 +261,7 @@ EFL_START_TEST(eolian_ctor_dtor)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/ctor_dtor.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "ctor_dtor.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Ctor_Dtor")));
fail_if(!(base = eolian_unit_class_by_name_get(unit, "Base")));
@ -337,7 +337,7 @@ EFL_START_TEST(eolian_typedef)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/typedef.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "typedef.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Typedef")));
@ -420,7 +420,7 @@ EFL_START_TEST(eolian_complex_type)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/complex_type.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "complex_type.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Complex_Type")));
/* Properties return type */
@ -513,7 +513,7 @@ EFL_START_TEST(eolian_scope)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/scope.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "scope.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Scope")));
/* Property scope */
@ -554,7 +554,7 @@ EFL_START_TEST(eolian_simple_parsing)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/class_simple.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "class_simple.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Class_Simple")));
fail_if(eolian_state_class_by_file_get(eos, "class_simple.eo") != class);
fail_if(strcmp(eolian_object_file_get((const Eolian_Object *)class), "class_simple.eo"));
@ -677,7 +677,7 @@ EFL_START_TEST(eolian_struct)
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/struct.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "struct.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Struct")));
@ -746,7 +746,7 @@ EFL_START_TEST(eolian_extern)
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/extern.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "extern.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Extern")));
@ -786,7 +786,7 @@ EFL_START_TEST(eolian_var)
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/var.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "var.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Var")));
@ -855,7 +855,7 @@ EFL_START_TEST(eolian_enum)
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/enum.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "enum.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Enum")));
@ -949,7 +949,7 @@ EFL_START_TEST(eolian_class_funcs)
Eolian_State *eos = eolian_state_new();
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/class_funcs.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "class_funcs.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Class_Funcs")));
/* Class properties */
@ -987,7 +987,7 @@ EFL_START_TEST(eolian_free_func)
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/free_func.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "free_func.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Free_Func")));
@ -1021,7 +1021,7 @@ EFL_START_TEST(eolian_null)
/* Parsing */
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/null.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "null.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Null")));
fail_if(!(func = eolian_class_function_by_name_get(class, "foo", EOLIAN_METHOD)));
@ -1069,7 +1069,7 @@ EFL_START_TEST(eolian_import)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/import.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "import.eo")));
fail_if(!(class = eolian_unit_class_by_name_get(unit, "Import")));
fail_if(!(tdl = eolian_unit_alias_by_name_get(unit, "Imported")));
@ -1100,7 +1100,7 @@ EFL_START_TEST(eolian_docs)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/docs.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "docs.eo")));
fail_if(!(tdl = eolian_unit_struct_by_name_get(unit, "Foo")));
fail_if(!(doc = eolian_typedecl_documentation_get(tdl)));
@ -1343,7 +1343,7 @@ EFL_START_TEST(eolian_function_types)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
/* Parsing */
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/function_types.eot")));
fail_if(!(unit = eolian_state_file_parse(eos, "function_types.eot")));
/* void func(void); */
fail_if(!(decl = eolian_unit_alias_by_name_get(unit, "VoidFunc")));
@ -1468,7 +1468,7 @@ EFL_START_TEST(eolian_function_as_arguments)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/function_as_argument.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "function_as_argument.eo")));
fail_if(!(cls = eolian_unit_class_by_name_get(unit, "Function_As_Argument")));
@ -1508,7 +1508,7 @@ EFL_START_TEST(eolian_parts)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/parts.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "parts.eo")));
fail_if(!(cls = eolian_unit_class_by_name_get(unit, "Parts")));
@ -1547,7 +1547,7 @@ EFL_START_TEST(eolian_mixins_require)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/mixins_require.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "mixins_require.eo")));
fail_if (!(cl = eolian_state_class_by_name_get(eos, "Mixins.Require")));
fail_if (!(base = eolian_state_class_by_name_get(eos, "Base")));
@ -1610,7 +1610,7 @@ EFL_START_TEST(eolian_class_requires_classes)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
fail_if(!(unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/class_requires.eo")));
fail_if(!(unit = eolian_state_file_parse(eos, "class_requires.eo")));
fail_if (!(cl = eolian_state_class_by_name_get(eos, "Class.Requires")));
@ -1625,7 +1625,7 @@ EFL_START_TEST(eolian_class_unimpl)
fail_if(!eolian_state_directory_add(eos, TESTS_SRC_DIR"/data"));
setenv("EOLIAN_CLASS_UNIMPLEMENTED_WARN", "1", 1);
const Eolian_Unit *unit = eolian_state_file_parse(eos, TESTS_SRC_DIR"/data/unimpl.eo");
const Eolian_Unit *unit = eolian_state_file_parse(eos, "unimpl.eo");
unsetenv("EOLIAN_CLASS_UNIMPLEMENTED_WARN");
fail_if(!unit);

View File

@ -240,9 +240,7 @@ klass_def init_test_data(std::string const target_file, std::string const target
ck_assert(::eolian_state_directory_add(state.value, TESTS_SRC_DIR));
ck_assert(::eolian_state_directory_add(state.value, EO_SRC_DIR));
ck_assert(::eolian_state_all_eot_files_parse(state.value));
std::string filename = TESTS_SRC_DIR;
filename += "/" + target_file;
ck_assert(::eolian_state_file_parse(state.value, filename.c_str()));
ck_assert(::eolian_state_file_parse(state.value, target_file.c_str()));
const Eolian_Class *c_klass = ::eolian_state_class_by_name_get(state.value, target_klass.c_str());
ck_assert_ptr_ne(c_klass, NULL);

View File

@ -24,7 +24,7 @@ klass_def init_test_data(efl::eolian::eolian_state const& state)
{
ck_assert(::eolian_state_directory_add(state.value, TESTS_SRC_DIR));
ck_assert(::eolian_state_all_eot_files_parse(state.value));
ck_assert(::eolian_state_file_parse(state.value, TESTS_SRC_DIR"/docs.eo"));
ck_assert(::eolian_state_file_parse(state.value, "docs.eo"));
const Eolian_Class *c_klass = ::eolian_state_class_by_name_get(state.value, "Docs");
ck_assert_ptr_ne(c_klass, NULL);

View File

@ -15,7 +15,7 @@ EFL_START_TEST(eolian_cxx_test_parse_complex_types)
efl::eolian::eolian_state state;
fail_if(!::eolian_state_directory_add(state.value, EO_SRC_DIR));
fail_if(!::eolian_state_directory_add(state.value, TESTS_SRC_DIR));
fail_if(!::eolian_state_file_parse(state.value, TESTS_SRC_DIR"/complex.eo"));
fail_if(!::eolian_state_file_parse(state.value, "complex.eo"));
// TODO finish
}
EFL_END_TEST