diff --git a/src/source_clang.cc b/src/source_clang.cc index 53c2049..f67dcfb 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -1449,7 +1449,7 @@ Source::ClangViewRefactor::ClangViewRefactor(const boost::filesystem::path &file auto argument_type=argument_cursor.get_type().get_spelling(); for(auto it=semantic_parents.rbegin();it!=semantic_parents.rend();++it) { size_t pos=argument_type.find(*it); - if(pos==0) + if(pos==0 || (pos!=std::string::npos && argument_type[pos-1]==' ')) argument_type.erase(pos, it->size()); } auto argument=argument_cursor.get_spelling(); diff --git a/tests/source_clang_test.cc b/tests/source_clang_test.cc index 3ae3b06..513d530 100644 --- a/tests/source_clang_test.cc +++ b/tests/source_clang_test.cc @@ -131,6 +131,76 @@ int main() { g_assert_cmpstr(old_source.c_str(),==,source.c_str()); } + // Test Implement method + { + clang_view->get_buffer()->set_text(R"(#include +#include +#include + +namespace N { + class T { + void f1(); + void f1(T &t); + void f1(const T &t); + void f1(std::vector ts); + void f1(const std::vector &ts); + std::string f2(); + const std::string &f3(); + std::vector f4(); + std::vector f5(); + std::vector f6(); + std::map f7(); + static + std::map f8(); + }; +} +)"); + while(!clang_view->parsed) + flush_events(); + g_assert_cmpuint(clang_view->clang_diagnostics.size(), ==, 0); + + auto buffer=clang_view->get_buffer(); + + buffer->place_cursor(buffer->get_iter_at_line_offset(6, 9)); + auto method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "void N::T::f1() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(7, 9)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "void N::T::f1(T &t) {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(8, 9)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "void N::T::f1(const T &t) {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(9, 9)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "void N::T::f1(std::vector ts) {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(10, 9)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "void N::T::f1(const std::vector &ts) {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(11, 16)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "std::string N::T::f2() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(12, 23)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "const std::string &N::T::f3() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(13, 19)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "std::vector N::T::f4() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(14, 20)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "std::vector N::T::f5() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(15, 20)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "std::vector N::T::f6() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(16, 29)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "std::map N::T::f7() {}"); + buffer->place_cursor(buffer->get_iter_at_line_offset(20, 6)); + method=clang_view->get_method(); + g_assert_cmpstr(method.c_str(), ==, "std::map N::T::f8() {}"); + } + clang_view->async_delete(); clang_view->delete_thread.join(); flush_events();