eolian: pass state where necessary

This modifies the API so that global state removal is made
possible. It's still used internally for now but externally
the state is contained.
This commit is contained in:
Daniel Kolesa 2017-12-05 16:40:04 +01:00
parent 67e1c2ab88
commit 8a1f93f698
7 changed files with 276 additions and 159 deletions

View File

@ -430,6 +430,8 @@ main(int argc, char **argv)
eina_init();
eolian_init();
Eolian *eos = eolian_new();
const char *dom = "eolian_gen";
_eolian_gen_log_dom = eina_log_domain_register(dom, EINA_COLOR_GREEN);
if (_eolian_gen_log_dom < 0)
@ -530,7 +532,7 @@ main(int argc, char **argv)
if (scan_system)
{
if (!eolian_system_directory_scan())
if (!eolian_system_directory_scan(eos))
{
fprintf(stderr, "eolian: could not scan system directory\n");
goto end;
@ -540,14 +542,14 @@ main(int argc, char **argv)
const char *inc;
EINA_LIST_FREE(includes, inc)
{
if (!eolian_directory_scan(inc))
if (!eolian_directory_scan(eos, inc))
{
fprintf(stderr, "eolian: could not scan '%s'\n", inc);
goto end;
}
}
const Eolian_Unit *src = eolian_file_parse(input);
const Eolian_Unit *src = eolian_file_parse(eos, input);
if (!src)
{
fprintf(stderr, "eolian: could not parse file '%s'\n", input);
@ -589,6 +591,7 @@ end:
free(outs[i]);
free(basen);
eolian_free(eos);
eolian_shutdown();
eina_shutdown();

View File

@ -34,6 +34,7 @@ struct options_type
{
std::vector<std::string> include_dirs;
std::vector<std::string> in_files;
mutable Eolian* state;
mutable Eolian_Unit const* unit;
std::string out_file;
bool main_header;
@ -298,7 +299,7 @@ run(options_type const& opts)
for(auto&& name : opts.in_files)
{
Eolian_Unit const* unit = ::eolian_file_parse(name.c_str());
Eolian_Unit const* unit = ::eolian_file_parse(opts.state, name.c_str());
if(!unit)
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
@ -345,18 +346,31 @@ run(options_type const& opts)
}
}
static void
state_init(options_type const& opts)
{
Eolian *eos = ::eolian_new();
if (!eos)
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
<< "Eolian failed creating state";
assert(false && "Error creating Eolian state");
}
opts.state = eos;
}
static void
database_load(options_type const& opts)
{
for (auto src : opts.include_dirs)
{
if (!::eolian_directory_scan(src.c_str()))
if (!::eolian_directory_scan(opts.state, src.c_str()))
{
EINA_CXX_DOM_LOG_WARN(eolian_cxx::domain)
<< "Couldn't load eolian from '" << src << "'.";
}
}
if (!::eolian_all_eot_files_parse())
if (!::eolian_all_eot_files_parse(opts.state))
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
<< "Eolian failed parsing eot files";
@ -368,7 +382,7 @@ database_load(options_type const& opts)
<< "No input file.";
assert(false && "Error parsing input file");
}
if (!opts.main_header && !::eolian_file_parse(opts.in_files[0].c_str()))
if (!opts.main_header && !::eolian_file_parse(opts.state, opts.in_files[0].c_str()))
{
EINA_CXX_DOM_LOG_ERR(eolian_cxx::domain)
<< "Failed parsing: " << opts.in_files[0] << ".";
@ -480,6 +494,7 @@ int main(int argc, char **argv)
efl::eina::eina_init eina_init;
efl::eolian::eolian_init eolian_init;
eolian_cxx::options_type opts = opts_get(argc, argv);
eolian_cxx::state_init(opts);
eolian_cxx::database_load(opts);
eolian_cxx::run(opts);
}

View File

@ -13,6 +13,7 @@ ffi.cdef [[
typedef unsigned char Eina_Bool;
typedef struct _Eina_Iterator Eina_Iterator;
typedef struct _Eolian Eolian;
typedef struct _Eolian_Class Eolian_Class;
typedef struct _Eolian_Function Eolian_Function;
typedef struct _Eolian_Type Eolian_Type;
@ -284,17 +285,19 @@ ffi.cdef [[
const char *text, *text_end;
} Eolian_Doc_Token;
const Eolian_Unit *eolian_file_parse(const char *filepath);
Eina_Iterator *eolian_all_eo_file_paths_get(void);
Eina_Iterator *eolian_all_eot_file_paths_get(void);
Eina_Iterator *eolian_all_eo_files_get(void);
Eina_Iterator *eolian_all_eot_files_get(void);
int eolian_init(void);
int eolian_shutdown(void);
Eina_Bool eolian_directory_scan(const char *dir);
Eina_Bool eolian_system_directory_scan();
Eina_Bool eolian_all_eo_files_parse();
Eina_Bool eolian_all_eot_files_parse();
Eolian *eolian_new(void);
void eolian_free(Eolian *state);
const Eolian_Unit *eolian_file_parse(Eolian *state, const char *filepath);
Eina_Iterator *eolian_all_eo_file_paths_get(Eolian *state);
Eina_Iterator *eolian_all_eot_file_paths_get(Eolian *state);
Eina_Iterator *eolian_all_eo_files_get(Eolian *state);
Eina_Iterator *eolian_all_eot_files_get(Eolian *state);
Eina_Bool eolian_directory_scan(Eolian *state, const char *dir);
Eina_Bool eolian_system_directory_scan(Eolian *state);
Eina_Bool eolian_all_eo_files_parse(Eolian *state);
Eina_Bool eolian_all_eot_files_parse(Eolian *state);
const Eolian_Class *eolian_class_get_by_name(const Eolian_Unit *unit, const char *class_name);
const Eolian_Class *eolian_class_get_by_file(const Eolian_Unit *unit, const char *file_name);
const char *eolian_class_file_get(const Eolian_Class *klass);
@ -509,44 +512,59 @@ M.object_scope = {
PROTECTED = 3
}
M.directory_scan = function(dir)
return eolian.eolian_directory_scan(dir) ~= 0
end
ffi.metatype("Eolian", {
__index = {
directory_scan = function(self, dir)
return eolian.eolian_directory_scan(self, dir) ~= 0
end,
M.system_directory_scan = function()
return eolian.eolian_system_directory_scan() ~= 0
end
system_directory_scan = function(self)
return eolian.eolian_system_directory_scan(self) ~= 0
end,
M.file_parse = function(fpath)
local v = eolian.eolian_file_parse(fpath)
if v == nil then
return nil
file_parse = function(self, fpath)
local v = eolian.eolian_file_parse(self, fpath)
if v == nil then
return nil
end
return v
end,
all_eo_files_parse = function(self)
return eolian.eolian_all_eo_files_parse(self) ~= 0
end,
all_eot_files_parse = function(self)
return eolian.eolian_all_eot_files_parse(self) ~= 0
end,
all_eo_file_paths_get = function(self)
return iterator.String_Iterator(eolian.eolian_all_eo_file_paths_get(self))
end,
all_eot_file_paths_get = function(self)
return iterator.String_Iterator(eolian.eolian_all_eot_file_paths_get(self))
end,
all_eo_files_get = function(self)
return iterator.String_Iterator(eolian.eolian_all_eo_files_get(self))
end,
all_eot_files_get = function(self)
return iterator.String_Iterator(eolian.eolian_all_eot_files_get(self))
end,
unit_get = function(self)
return ffi.cast("Eolian_Unit *", self)
end
},
__gc = function(self)
eolian.eolian_free(self)
end
return v
end
})
M.all_eo_files_parse = function()
return eolian.eolian_all_eo_files_parse() ~= 0
end
M.all_eot_files_parse = function()
return eolian.eolian_all_eot_files_parse() ~= 0
end
M.all_eo_file_paths_get = function()
return iterator.String_Iterator(eolian.eolian_all_eo_file_paths_get())
end
M.all_eot_file_paths_get = function()
return iterator.String_Iterator(eolian.eolian_all_eot_file_paths_get())
end
M.all_eo_files_get = function()
return iterator.String_Iterator(eolian.eolian_all_eo_files_get())
end
M.all_eot_files_get = function()
return iterator.String_Iterator(eolian.eolian_all_eot_files_get())
M.new = function()
return eolian.eolian_new()
end
M.declaration_type = {

View File

@ -455,65 +455,6 @@ typedef struct _Eolian_Doc_Token
const char *text, *text_end;
} Eolian_Doc_Token;
/*
* @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.
*
* @param[in] filepath Path to the file to parse.
* @return The unit corresponding to the parsed file or NULL.
*
* @see eolian_directory_scan
*
* @ingroup Eolian
*/
EAPI const Eolian_Unit *eolian_file_parse(const char *filepath);
/*
* @brief Get an iterator to all .eo file names with paths.
*
* @see eolian_all_eo_files_get
* @see eolian_all_eot_file_paths_get
* @see eolian_all_eot_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eo_file_paths_get(void);
/*
* @brief Get an iterator to all .eot file names with paths.
*
* @see eolian_all_eo_files_get
* @see eolian_all_eo_file_paths_get
* @see eolian_all_eot_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eot_file_paths_get(void);
/*
* @brief Get an iterator to all .eo file names (without paths).
*
* @see eolian_all_eo_file_paths_get
* @see eolian_all_eot_file_paths_get
* @see eolian_all_eot_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eo_files_get(void);
/*
* @brief Get an iterator to all .eot file names (without paths).
*
* @see eolian_all_eo_file_paths_get
* @see eolian_all_eot_file_paths_get
* @see eolian_all_eo_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eot_files_get(void);
/*
* @brief Init Eolian.
*
@ -550,17 +491,86 @@ EAPI Eolian *eolian_new(void);
*
* If the input is NULL, this function has no effect.
*
* @param[in] unit the state to free
* @param[in] state the state to free
*
*/
EAPI void eolian_free(Eolian *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.
*
* @param[in] state The Eolian state.
* @param[in] filepath Path to the file to parse.
* @return The unit corresponding to the parsed file or NULL.
*
* @see eolian_directory_scan
*
* @ingroup Eolian
*/
EAPI const Eolian_Unit *eolian_file_parse(Eolian *state, const char *filepath);
/*
* @brief Get an iterator to all .eo file names with paths.
*
* @param[in] state The Eolian state.
*
* @see eolian_all_eo_files_get
* @see eolian_all_eot_file_paths_get
* @see eolian_all_eot_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eo_file_paths_get(Eolian *state);
/*
* @brief Get an iterator to all .eot file names with paths.
*
* @param[in] state The Eolian state.
*
* @see eolian_all_eo_files_get
* @see eolian_all_eo_file_paths_get
* @see eolian_all_eot_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eot_file_paths_get(Eolian *state);
/*
* @brief Get an iterator to all .eo file names (without paths).
*
* @param[in] state The Eolian state.
*
* @see eolian_all_eo_file_paths_get
* @see eolian_all_eot_file_paths_get
* @see eolian_all_eot_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eo_files_get(Eolian *state);
/*
* @brief Get an iterator to all .eot file names (without paths).
*
* @param[in] state The Eolian state.
*
* @see eolian_all_eo_file_paths_get
* @see eolian_all_eot_file_paths_get
* @see eolian_all_eo_files_get
*
* @ingroup Eolian
*/
EAPI Eina_Iterator *eolian_all_eot_files_get(Eolian *state);
/*
* @brief Scan the given directory (recursively) and search for .eo and
* .eot files.
*
* The found files are just open to extract the class name.
*
* @param[in] state The Eolian state.
* @param[in] dir the directory to scan
* @return EINA_TRUE on success, EINA_FALSE otherwise.
*
@ -568,24 +578,28 @@ EAPI void eolian_free(Eolian *state);
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_directory_scan(const char *dir);
EAPI Eina_Bool eolian_directory_scan(Eolian *state, const char *dir);
/*
* @brief Scan the system directory (recursively) and search for .eo and
* .eot files.
*
* @param[in] state The Eolian state.
*
* @return EINA_TRUE on success, EINA_FALSE otherwise.
*
* @see eolian_directory_scan
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_system_directory_scan(void);
EAPI Eina_Bool eolian_system_directory_scan(Eolian *state);
/*
* @brief Force parsing of all the .eo files located in the directories
* given in eolian_directory_scan..
*
* @param[in] state The Eolian state.
*
* @return EINA_TRUE on success, EINA_FALSE otherwise.
*
* @see eolian_directory_scan
@ -593,12 +607,14 @@ EAPI Eina_Bool eolian_system_directory_scan(void);
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_all_eo_files_parse(void);
EAPI Eina_Bool eolian_all_eo_files_parse(Eolian *state);
/*
* @brief Force parsing of all the .eot files located in the directories
* given in eolian_directory_scan..
*
* @param[in] state The Eolian state.
*
* @return EINA_TRUE on success, EINA_FALSE otherwise.
*
* @see eolian_directory_scan
@ -606,7 +622,7 @@ EAPI Eina_Bool eolian_all_eo_files_parse(void);
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_all_eot_files_parse(void);
EAPI Eina_Bool eolian_all_eot_files_parse(Eolian *state);
/*
* @brief Gets a class by its name

View File

@ -685,7 +685,7 @@ _scan_cb(const char *name, const char *path, void *data EINA_UNUSED)
}
EAPI Eina_Bool
eolian_directory_scan(const char *dir)
eolian_directory_scan(Eolian *state EINA_UNUSED, const char *dir)
{
if (!dir) return EINA_FALSE;
eina_file_dir_list(dir, EINA_TRUE, _scan_cb, NULL);
@ -693,13 +693,13 @@ eolian_directory_scan(const char *dir)
}
EAPI Eina_Bool
eolian_system_directory_scan()
eolian_system_directory_scan(Eolian *state)
{
Eina_Bool ret;
Eina_Strbuf *buf = eina_strbuf_new();
eina_strbuf_append(buf, eina_prefix_data_get(_eolian_prefix));
eina_strbuf_append(buf, "/include");
ret = eolian_directory_scan(eina_strbuf_string_get(buf));
ret = eolian_directory_scan(state, eina_strbuf_string_get(buf));
eina_strbuf_free(buf);
return ret;
}
@ -773,7 +773,7 @@ _parse_deferred()
static Eolian_Unit unit_tmp;
EAPI const Eolian_Unit *
eolian_file_parse(const char *filepath)
eolian_file_parse(Eolian *state EINA_UNUSED, const char *filepath)
{
if (!_eolian_file_parse_nodep(filepath))
return NULL;
@ -794,7 +794,7 @@ static Eina_Bool _tfile_parse(const Eina_Hash *hash EINA_UNUSED, const void *key
}
EAPI Eina_Bool
eolian_all_eot_files_parse()
eolian_all_eot_files_parse(Eolian *state EINA_UNUSED)
{
Eina_Bool ret = EINA_TRUE;
@ -819,7 +819,7 @@ static Eina_Bool _file_parse(const Eina_Hash *hash EINA_UNUSED, const void *key
}
EAPI Eina_Bool
eolian_all_eo_files_parse()
eolian_all_eo_files_parse(Eolian *state EINA_UNUSED)
{
Eina_Bool ret = EINA_TRUE;
@ -836,28 +836,28 @@ eolian_all_eo_files_parse()
}
EAPI Eina_Iterator *
eolian_all_eot_files_get(void)
eolian_all_eot_files_get(Eolian *state EINA_UNUSED)
{
if (!_tfilenames) return NULL;
return eina_hash_iterator_key_new(_tfilenames);
}
EAPI Eina_Iterator *
eolian_all_eo_files_get(void)
eolian_all_eo_files_get(Eolian *state EINA_UNUSED)
{
if (!_filenames) return NULL;
return eina_hash_iterator_key_new(_filenames);
}
EAPI Eina_Iterator *
eolian_all_eot_file_paths_get(void)
eolian_all_eot_file_paths_get(Eolian *state EINA_UNUSED)
{
if (!_tfilenames) return NULL;
return eina_hash_iterator_data_new(_tfilenames);
}
EAPI Eina_Iterator *
eolian_all_eo_file_paths_get(void)
eolian_all_eo_file_paths_get(Eolian *state EINA_UNUSED)
{
if (!_filenames) return NULL;
return eina_hash_iterator_data_new(_filenames);

View File

@ -16,6 +16,14 @@ local obj_scope = eolian.object_scope
local param_dir = eolian.parameter_dir
local gen_unit
local gen_state
local get_state = function()
if not gen_state then
gen_state = eolian.new()
end
return assert(gen_state, "could not create eolian state")
end
cutil.init_module(function()
dom = log.Domain("lualian")
@ -683,21 +691,21 @@ local gen_class = function(klass)
end
M.include_dir = function(dir)
if not eolian.directory_scan(dir) then
if not get_state():directory_scan(dir) then
error("Failed including directory: " .. dir)
end
end
M.load_eot_files = function()
return eolian.all_eot_files_parse()
return get_state():all_eot_files_parse()
end
M.system_directory_scan = function()
return eolian.system_directory_scan()
return get_state():system_directory_scan()
end
M.generate = function(fname, fstream)
local unit = eolian.file_parse(fname)
local unit = get_state():file_parse(fname)
if unit == nil then
error("Failed parsing file: " .. fname)
end

View File

@ -23,9 +23,10 @@ START_TEST(eolian_namespaces)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/nmsp1_class1.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/nmsp1_class1.eo")));
/* Classes existence */
fail_if(!(class11 = eolian_class_get_by_name(unit, "nmsp1.class1")));
@ -89,6 +90,7 @@ START_TEST(eolian_namespaces)
fail_if(eina_iterator_next(iter, &dummy));
eina_iterator_free(iter);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -104,8 +106,10 @@ START_TEST(eolian_events)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/events.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/events.eo")));
/* Class */
fail_if(!(class = eolian_class_get_by_name(unit, "Events")));
@ -162,6 +166,7 @@ START_TEST(eolian_events)
fail_if(!eolian_class_event_get_by_name(class, "clicked,double"));
fail_if(eolian_class_event_get_by_name(class, "clicked,triple"));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -176,9 +181,10 @@ START_TEST(eolian_override)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/override.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/override.eo")));
/* Class */
fail_if(!(class = eolian_class_get_by_name(unit, "Override")));
@ -220,6 +226,7 @@ START_TEST(eolian_override)
eina_iterator_free(iter);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -231,14 +238,17 @@ START_TEST(eolian_consts)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/consts.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/consts.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Consts")));
/* Method */
fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)));
fail_if(EINA_FALSE == eolian_function_object_is_const(fid));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -255,9 +265,10 @@ START_TEST(eolian_ctor_dtor)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/ctor_dtor.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/ctor_dtor.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Ctor_Dtor")));
fail_if(!(base = eolian_class_get_by_name(unit, "Base")));
@ -307,6 +318,7 @@ START_TEST(eolian_ctor_dtor)
fail_if(eina_iterator_next(iter, &dummy));
eina_iterator_free(iter);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -322,8 +334,10 @@ START_TEST(eolian_typedef)
const char *file;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/typedef.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/typedef.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_class_get_by_name(unit, "Typedef")));
@ -388,6 +402,7 @@ START_TEST(eolian_typedef)
fail_if(!eina_iterator_next(iter, (void**)&tdl));
fail_if(eina_iterator_next(iter, (void**)&tdl));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -404,8 +419,10 @@ START_TEST(eolian_complex_type)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/complex_type.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/complex_type.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Complex_Type")));
/* Properties return type */
@ -474,6 +491,7 @@ START_TEST(eolian_complex_type)
fail_if(strcmp(type_name, "char *"));
eina_stringshare_del(type_name);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -485,8 +503,10 @@ START_TEST(eolian_scope)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/scope.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/scope.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Scope")));
/* Property scope */
@ -507,6 +527,7 @@ START_TEST(eolian_scope)
fail_if(!(fid = eolian_class_function_get_by_name(class, "foobar", EOLIAN_METHOD)));
fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != EOLIAN_SCOPE_PUBLIC);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -525,8 +546,10 @@ START_TEST(eolian_simple_parsing)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/class_simple.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/class_simple.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Class_Simple")));
fail_if(eolian_class_get_by_file(unit, "class_simple.eo") != class);
fail_if(strcmp(eolian_class_file_get(class), "class_simple.eo"));
@ -643,6 +666,7 @@ START_TEST(eolian_simple_parsing)
fail_if(eolian_function_is_beta(fid));
fail_if(!eolian_type_is_ptr(eolian_function_return_type_get(fid, EOLIAN_METHOD)));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -659,9 +683,11 @@ START_TEST(eolian_struct)
const char *file;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/struct.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/struct.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_class_get_by_name(unit, "Struct")));
@ -713,6 +739,7 @@ START_TEST(eolian_struct)
fail_if(!(tdl = eolian_type_typedecl_get(type)));
fail_if(eolian_typedecl_type_get(tdl) != EOLIAN_TYPEDECL_STRUCT);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -724,9 +751,11 @@ START_TEST(eolian_extern)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/extern.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/extern.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_class_get_by_name(unit, "Extern")));
@ -748,6 +777,7 @@ START_TEST(eolian_extern)
fail_if(!(tdl = eolian_typedecl_struct_get_by_name(unit, "Y")));
fail_if(!eolian_typedecl_is_extern(tdl));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -763,9 +793,11 @@ START_TEST(eolian_var)
const char *name;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/var.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/var.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_class_get_by_name(unit, "Var")));
@ -813,6 +845,7 @@ START_TEST(eolian_var)
fail_if(strcmp(name, "double"));
fail_if(eolian_variable_value_get(var));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -831,9 +864,11 @@ START_TEST(eolian_enum)
Eolian_Value v;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/enum.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/enum.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_class_get_by_name(unit, "Enum")));
@ -914,6 +949,7 @@ START_TEST(eolian_enum)
fail_if(v.type != EOLIAN_EXPR_INT);
fail_if(v.value.i != 5);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -925,8 +961,10 @@ START_TEST(eolian_class_funcs)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/class_funcs.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/class_funcs.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Class_Funcs")));
/* Class properties */
@ -950,6 +988,7 @@ START_TEST(eolian_class_funcs)
fail_if(eolian_function_is_class(fid));
fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != EOLIAN_SCOPE_PROTECTED);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -962,9 +1001,11 @@ START_TEST(eolian_free_func)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/free_func.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/free_func.eo")));
/* Check that the class Dummy is still readable */
fail_if(!(class = eolian_class_get_by_name(unit, "Free_Func")));
@ -996,6 +1037,7 @@ START_TEST(eolian_free_func)
fail_if(!(type = eolian_typedecl_base_type_get(tdl)));
fail_if(strcmp(eolian_type_free_func_get(type), "ptr_free"));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1009,9 +1051,11 @@ START_TEST(eolian_null)
Eina_Iterator *iter;
eolian_init();
Eolian *eos = eolian_new();
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/null.eo")));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/null.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Null")));
fail_if(!(func = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)));
@ -1045,6 +1089,7 @@ START_TEST(eolian_null)
fail_if(eina_iterator_next(iter, (void**)&param));
eina_iterator_free(iter);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1056,10 +1101,11 @@ START_TEST(eolian_import)
const Eolian_Unit *unit;
eolian_init();
Eolian *eos = eolian_new();
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/import.eo")));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/import.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Import")));
fail_if(!(tdl = eolian_typedecl_alias_get_by_name(unit, "Imported")));
@ -1068,6 +1114,7 @@ START_TEST(eolian_import)
fail_if(!(tdl = eolian_typedecl_struct_get_by_name(unit, "Imported_Struct")));
fail_if(strcmp(eolian_typedecl_file_get(tdl), "import_types.eot"));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1082,10 +1129,11 @@ START_TEST(eolian_decl)
Eina_Iterator *itr;
eolian_init();
Eolian *eos = eolian_new();
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/decl.eo")));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/decl.eo")));
fail_if(!(class = eolian_class_get_by_name(unit, "Decl")));
fail_if(!(itr = eolian_declarations_get_by_file("decl.eo")));
@ -1130,6 +1178,7 @@ START_TEST(eolian_decl)
fail_if(!(decl = eolian_declaration_get_by_name("A")));
fail_if(eolian_declaration_type_get(decl) != EOLIAN_DECL_STRUCT);
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1149,10 +1198,11 @@ START_TEST(eolian_docs)
Eina_Iterator *itr;
eolian_init();
Eolian *eos = eolian_new();
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/docs.eo")));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/docs.eo")));
fail_if(!(tdl = eolian_typedecl_struct_get_by_name(unit, "Foo")));
fail_if(!(doc = eolian_typedecl_documentation_get(tdl)));
@ -1374,6 +1424,7 @@ START_TEST(eolian_docs)
"Event docs."));
fail_if(eolian_documentation_description_get(doc));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1391,11 +1442,12 @@ START_TEST(eolian_function_types)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
/* Parsing */
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/function_types.eot")));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/function_types.eot")));
/* void func(void); */
fail_if(!(decl = eolian_typedecl_alias_get_by_name(unit, "VoidFunc")));
@ -1500,6 +1552,7 @@ START_TEST(eolian_function_types)
fail_if(eina_iterator_next(iter, &dummy));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1517,10 +1570,11 @@ START_TEST(eolian_function_as_arguments)
void *dummy;
eolian_init();
Eolian *eos = eolian_new();
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/function_as_argument.eo")));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/function_as_argument.eo")));
fail_if(!(cls = eolian_class_get_by_name(unit, "Function_As_Argument")));
@ -1540,6 +1594,7 @@ START_TEST(eolian_function_as_arguments)
fail_if(eina_iterator_next(iter, &dummy));
eolian_free(eos);
eolian_shutdown();
}
END_TEST
@ -1557,10 +1612,11 @@ START_TEST(eolian_parts)
};
eolian_init();
Eolian *eos = eolian_new();
fail_if(!eolian_directory_scan(PACKAGE_DATA_DIR"/data"));
fail_if(!eolian_directory_scan(eos, PACKAGE_DATA_DIR"/data"));
fail_if(!(unit = eolian_file_parse(PACKAGE_DATA_DIR"/data/parts.eo")));
fail_if(!(unit = eolian_file_parse(eos, PACKAGE_DATA_DIR"/data/parts.eo")));
fail_if(!(cls = eolian_class_get_by_name(unit, "Parts")));
@ -1585,6 +1641,7 @@ START_TEST(eolian_parts)
}
eina_iterator_free(iter);
eolian_free(eos);
eolian_shutdown();
}
END_TEST