diff --git a/src/bin/editor/edi_editor.c b/src/bin/editor/edi_editor.c index ee64aba..23321ae 100644 --- a/src/bin/editor/edi_editor.c +++ b/src/bin/editor/edi_editor.c @@ -163,6 +163,7 @@ static void _suggest_list_update(Edi_Editor *editor, char *word) { Edi_Editor_Suggest_Item *suggest_it; + Edi_Editor_Suggest_Provider *provider; Eina_List *list, *l; Elm_Genlist_Item_Class *ic; Elm_Object_Item *item; @@ -175,10 +176,11 @@ _suggest_list_update(Edi_Editor *editor, char *word) ic->item_style = "full"; ic->func.content_get = _suggest_list_content_get; + provider = edi_editor_suggest_provider_get(editor); EINA_LIST_FOREACH(list, l, suggest_it) { const char *term; - term = edi_editor_suggest_provider_get(editor)->summary_get(editor, suggest_it); + term = provider->summary_get(editor, suggest_it); if (eina_str_has_prefix(term, word)) { @@ -229,7 +231,7 @@ _suggest_list_set(Edi_Editor *editor) elm_code_widget_cursor_position_get(editor->entry, &row, &col); curword = _edi_editor_current_word_get(editor, row, col); - list = edi_editor_suggest_provider_get(editor)->lookup(editor, curword); + list = edi_editor_suggest_provider_get(editor)->lookup(editor, row, col - strlen(curword)); evas_object_data_set(editor->suggest_genlist, "suggest_list", list); _suggest_list_update(editor, curword); diff --git a/src/bin/editor/edi_editor_suggest_provider.h b/src/bin/editor/edi_editor_suggest_provider.h index ecfd114..5e80c97 100644 --- a/src/bin/editor/edi_editor_suggest_provider.h +++ b/src/bin/editor/edi_editor_suggest_provider.h @@ -31,7 +31,7 @@ typedef struct _Edi_Editor_Suggest_Provider void (*add)(Edi_Editor *editor); void (*del)(Edi_Editor *editor); - Eina_List *(*lookup)(Edi_Editor *editor, const char *word); + Eina_List *(*lookup)(Edi_Editor *editor, unsigned int row, unsigned int col); const char *(*summary_get)(Edi_Editor *editor, Edi_Editor_Suggest_Item *item); char *(*detail_get)(Edi_Editor *editor, Edi_Editor_Suggest_Item *item); void (*item_free)(Edi_Editor_Suggest_Item *item); diff --git a/src/bin/editor/edi_editor_suggest_provider_c.c b/src/bin/editor/edi_editor_suggest_provider_c.c index 6ddb68f..40e0e60 100644 --- a/src/bin/editor/edi_editor_suggest_provider_c.c +++ b/src/bin/editor/edi_editor_suggest_provider_c.c @@ -2,6 +2,13 @@ # include "config.h" #endif +#if HAVE_LIBCLANG +#include +#endif + +#include +#include + #include "edi_editor_suggest_provider.h" #include "edi_config.h" @@ -89,7 +96,7 @@ _edi_editor_sugget_c_del(Edi_Editor *editor) } Eina_List * -_edi_editor_suggest_c_lookup(Edi_Editor *editor, const char *curword) +_edi_editor_suggest_c_lookup(Edi_Editor *editor, unsigned int row, unsigned int col) { Eina_List *list = NULL; @@ -97,22 +104,21 @@ _edi_editor_suggest_c_lookup(Edi_Editor *editor, const char *curword) CXCodeCompleteResults *res; struct CXUnsavedFile unsaved_file; Elm_Code *code; - const char *path; - unsigned int col, row; + const char *path = NULL; if (!editor->as_unit) return list; code = elm_code_widget_code_get(editor->entry); - path = elm_code_file_path_get(code->file); - elm_code_widget_cursor_position_get(editor->entry, &row, &col); + if (code->file->file) + path = elm_code_file_path_get(code->file); unsaved_file.Filename = path; unsaved_file.Contents = elm_code_widget_text_between_positions_get( editor->entry, 1, 1, col, row); unsaved_file.Length = strlen(unsaved_file.Contents); - res = clang_codeCompleteAt(editor->as_unit, path, row, col - strlen(curword), + res = clang_codeCompleteAt(editor->as_unit, path, row, col, &unsaved_file, 1, CXCodeComplete_IncludeMacros | CXCodeComplete_IncludeCodePatterns); diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 39d1935..96a49f9 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -4,18 +4,24 @@ CLEANFILES = check-results.xml if EFL_HAVE_TESTS check_PROGRAMS = edi_suite +efl_cflags_safe = '@EFL_CFLAGS@' +clang_include = '$(CLANG_INCLUDE)' edi_suite_SOURCES = \ edi_test_path.c \ edi_test_content_provider.c \ +edi_test_editor_suggest_provider.c \ +edi_test_editor_suggest_provider_c.c \ edi_suite.c edi_suite_CPPFLAGS = -I$(top_builddir)/src/lib/ -I$(top_builddir)/src/bin/ \ -I$(top_srcdir)/src/lib \ -I$(top_srcdir)/src/bin \ --DPACKAGE_TESTS_DIR=\"$(top_srcdir)/src/tests/\" \ +-DPACKAGE_TESTS_DIR=\"`pwd`/$(top_srcdir)/src/tests/\" \ -DPACKAGE_BUILD_DIR=\"`pwd`/$(top_builddir)/src/tests/\" \ -DEFL_BETA_API_SUPPORT \ +-DEFL_CFLAGS=\"$(efl_cflags_safe)\" \ +-DCLANG_INCLUDES=\"$(clang_include)\" \ @EFL_CFLAGS@ \ @CHECK_CFLAGS@ diff --git a/src/tests/edi_suite.c b/src/tests/edi_suite.c index 480a913..7bfda5b 100644 --- a/src/tests/edi_suite.c +++ b/src/tests/edi_suite.c @@ -15,7 +15,9 @@ static const struct { } tests[] = { { "basic", edi_test_basic }, { "path", edi_test_path }, - { "content_provider", edi_test_content_provider } + { "content_provider", edi_test_content_provider }, + { "editor_suggest_provider", edi_test_editor_suggest_provider }, + { "editor_suggest_provider_c", edi_test_editor_suggest_provider_c } }; START_TEST(edi_initialization) diff --git a/src/tests/edi_suite.h b/src/tests/edi_suite.h index e5c6169..da89f51 100644 --- a/src/tests/edi_suite.h +++ b/src/tests/edi_suite.h @@ -9,5 +9,7 @@ void edi_test_basic(TCase *tc); void edi_test_console(TCase *tc); void edi_test_path(TCase *tc); void edi_test_content_provider(TCase *tc); +void edi_test_editor_suggest_provider(TCase *tc); +void edi_test_editor_suggest_provider_c(TCase *tc); #endif /* _EDI_SUITE_H */ diff --git a/src/tests/edi_test_editor_suggest_provider.c b/src/tests/edi_test_editor_suggest_provider.c new file mode 100644 index 0000000..fab6e86 --- /dev/null +++ b/src/tests/edi_test_editor_suggest_provider.c @@ -0,0 +1,26 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "editor/edi_editor_suggest_provider.c" + +#include "edi_suite.h" + +START_TEST (edi_test_editor_suggest_provider_lookup) +{ + Edi_Editor editor; + Edi_Editor_Suggest_Provider *provider; + + editor.mimetype = "text/x-csrc"; + provider = edi_editor_suggest_provider_get(&editor); + + ck_assert(provider); + ck_assert_str_eq(provider->id, "c"); +} +END_TEST + +void edi_test_editor_suggest_provider(TCase *tc) +{ + tcase_add_test(tc, edi_test_editor_suggest_provider_lookup); +} + diff --git a/src/tests/edi_test_editor_suggest_provider_c.c b/src/tests/edi_test_editor_suggest_provider_c.c new file mode 100644 index 0000000..a7f45c4 --- /dev/null +++ b/src/tests/edi_test_editor_suggest_provider_c.c @@ -0,0 +1,106 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "../bin/edi_private.h" +#include "editor/edi_editor_suggest_provider.h" + +#include "edi_suite.h" + +static Elm_Code * +_setup(Edi_Editor *editor, Evas_Object *win) +{ + Elm_Code *code; + Elm_Code_Widget *widget; + + code = elm_code_create(); + elm_code_file_open(code, PACKAGE_TESTS_DIR "test.c"); + + widget = elm_code_widget_add(win, code); + editor->entry = widget; + elm_code_widget_cursor_position_set(widget, 3, 12); + + return code; +} + +static Eina_List * +_filtered_list_get(Edi_Editor *editor, Edi_Editor_Suggest_Provider *provider, + Eina_List *list, const char *word) +{ + Edi_Editor_Suggest_Item *suggest_it; + Eina_List *l, *ret = NULL; + + EINA_LIST_FOREACH(list, l, suggest_it) + { + const char *term; + term = provider->summary_get(editor, suggest_it); + + if (eina_str_has_prefix(term, word)) + ret = eina_list_append(ret, suggest_it); + } + + return ret; +} + +START_TEST (edi_test_editor_suggest_provider_c_lookup) +{ + Elm_Code *code; + Evas_Object *win; + Edi_Editor editor; + Edi_Editor_Suggest_Provider *provider; + Eina_List *list; + + elm_init(1, NULL); + win = elm_win_add(NULL, "entry", ELM_WIN_BASIC); + editor.mimetype = "text/x-csrc"; + code = _setup(&editor, win); + + provider = edi_editor_suggest_provider_get(&editor); + provider->add(&editor); + list = provider->lookup(&editor, 3, 12); + ck_assert_int_eq(eina_list_count(_filtered_list_get(&editor, provider, list, "_xyzabc_")), 1); + + provider->del(&editor); + elm_code_free(code); + elm_shutdown(); +} +END_TEST + +START_TEST (edi_test_editor_suggest_provider_c_summary) +{ + Elm_Code *code; + Evas_Object *win; + Edi_Editor editor; + Edi_Editor_Suggest_Provider *provider; + Edi_Editor_Suggest_Item *item; + Eina_List *list; + const char *key; + + elm_init(1, NULL); + win = elm_win_add(NULL, "entry", ELM_WIN_BASIC); + editor.mimetype = "text/x-csrc"; + code = _setup(&editor, win); + + provider = edi_editor_suggest_provider_get(&editor); + provider->add(&editor); + list = provider->lookup(&editor, 3, 12); + item = eina_list_nth(_filtered_list_get(&editor, provider, list, "_xyzabc_"), 0); + key = provider->summary_get(&editor, item); + ck_assert_str_eq(key, "_xyzabc_test"); + + provider->del(&editor); + elm_code_free(code); + elm_shutdown(); +} +END_TEST + +void edi_test_editor_suggest_provider_c(TCase *tc) +{ +#if HAVE_LIBCLANG + tcase_add_test(tc, edi_test_editor_suggest_provider_c_lookup); + tcase_add_test(tc, edi_test_editor_suggest_provider_c_summary); +#endif +} + diff --git a/src/tests/test.c b/src/tests/test.c new file mode 100644 index 0000000..1fc99f1 --- /dev/null +++ b/src/tests/test.c @@ -0,0 +1,3 @@ +static void _xyzabc_test() {} +static void _thing() { + _xyzabc_