From 89fdd6fe48605c07cd85f4ef1d7e58eaaf09a4b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lien=20Sell=C3=A6g?= Date: Mon, 18 May 2015 15:51:04 +0200 Subject: [PATCH 01/12] juci branch --- src/TranslationUnit.cc | 2 +- src/TranslationUnit.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index dab7f20..df26ed9 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -2,7 +2,7 @@ clang::TranslationUnit:: ~TranslationUnit() { - clang_disposeTranslationUnit(tu_); + // clang_disposeTranslationUnit(tu_); } diff --git a/src/TranslationUnit.h b/src/TranslationUnit.h index 9074fd3..19118e5 100644 --- a/src/TranslationUnit.h +++ b/src/TranslationUnit.h @@ -27,6 +27,7 @@ namespace clang { TranslationUnit(Index *index, const std::string &filepath); ~TranslationUnit(); + TranslationUnit() { } TranslationUnit& operator=(const TranslationUnit &tu); int ReparseTranslationUnit(const std::string &file_path, const std::map From 9d325708004c0f368154f70cc30409d04b94f83c Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 4 Jun 2015 12:48:31 +0200 Subject: [PATCH 02/12] Added -O3, and OS X support. Also fixed a test on OS X. --- CMakeLists.txt | 6 ++++++ src/CMakeLists.txt | 4 ++-- tests/CodeCompleteResults_H_Test.cc | 10 ++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e0c3bf2..99ac894 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,12 @@ cmake_minimum_required (VERSION 2.8.4) set(project_name clangmm) project(${project_name}) set(library_installation_path "/usr/local/lib/libclangmm/") + +if(APPLE) + set(Boost_USE_STATIC_LIBS "YES") + set(CMAKE_MACOSX_RPATH 1) +endif() + enable_testing() add_subdirectory(src) add_subdirectory(tests) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8e9259d..6c74fa5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3") set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_HOME_DIRECTORY}/cmake/Modules/") @@ -49,4 +49,4 @@ target_link_libraries(${project_name} ${LIBCLANG_LIBRARIES}) install(TARGETS ${project_name} LIBRARY DESTINATION ${library_installation_path}) install(FILES ${header_files} - DESTINATION ${library_installation_path}/include) \ No newline at end of file + DESTINATION ${library_installation_path}/include) diff --git a/tests/CodeCompleteResults_H_Test.cc b/tests/CodeCompleteResults_H_Test.cc index 8912a90..32bcd76 100644 --- a/tests/CodeCompleteResults_H_Test.cc +++ b/tests/CodeCompleteResults_H_Test.cc @@ -30,6 +30,12 @@ BOOST_AUTO_TEST_CASE(code_complete_results) { clang::CodeCompleteResults results(&tu, path, buffers, 4, 5); - BOOST_CHECK(results.size() == 105); - BOOST_CHECK(results.get(0).get_num_chunks() == 5); + bool substr_found=false; + for(int c=0;c Date: Fri, 5 Jun 2015 11:44:37 +0200 Subject: [PATCH 03/12] Segmentation fault fixed as get_num_chunks could sometimes be larger than get_chunks.size(). --- src/CompletionString.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/CompletionString.cc b/src/CompletionString.cc index e7cf1b8..074fec8 100644 --- a/src/CompletionString.cc +++ b/src/CompletionString.cc @@ -13,12 +13,10 @@ get_num_chunks() { std::vector clang::CompletionString:: get_chunks() { std::vector res; - if (clang_getCompletionAvailability(str_) == CXAvailability_Available) { - for (auto i = 0; i < get_num_chunks(); i++) { - res.emplace_back(clang_getCString(clang_getCompletionChunkText(str_, i)), - static_cast - (clang_getCompletionChunkKind(str_, i))); - } + for (auto i = 0; i < get_num_chunks(); i++) { + res.emplace_back(clang_getCString(clang_getCompletionChunkText(str_, i)), + static_cast + (clang_getCompletionChunkKind(str_, i))); } return res; } From 06d1c1aa7c757349538d3aaf2b407aca6a1f77f8 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 5 Jun 2015 12:05:52 +0200 Subject: [PATCH 04/12] Changed the last fix to instead return the correct number of chunks in clang::CompletionString::get_num_chunks(). --- src/CompletionString.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/CompletionString.cc b/src/CompletionString.cc index 074fec8..a3c17eb 100644 --- a/src/CompletionString.cc +++ b/src/CompletionString.cc @@ -7,16 +7,21 @@ CompletionString(const CXCompletionString &str) { int clang::CompletionString:: get_num_chunks() { - return clang_getNumCompletionChunks(str_); + if (clang_getCompletionAvailability(str_) == CXAvailability_Available) + return clang_getNumCompletionChunks(str_); + else + return 0; } std::vector clang::CompletionString:: get_chunks() { std::vector res; - for (auto i = 0; i < get_num_chunks(); i++) { - res.emplace_back(clang_getCString(clang_getCompletionChunkText(str_, i)), - static_cast - (clang_getCompletionChunkKind(str_, i))); + if (clang_getCompletionAvailability(str_) == CXAvailability_Available) { + for (auto i = 0; i < get_num_chunks(); i++) { + res.emplace_back(clang_getCString(clang_getCompletionChunkText(str_, i)), + static_cast + (clang_getCompletionChunkKind(str_, i))); + } } return res; } From cadcbbfe7e9d0ff258de9fc1bcabdc26d897b3a0 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 5 Jun 2015 13:58:36 +0200 Subject: [PATCH 05/12] Greatly increased speed. For instance, instant completion on second completion if headers are not changed. From approximately 5 to 0 seconds on https://github.com/eidheim/Simple-Web-Server. --- src/TranslationUnit.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index df26ed9..3d1c170 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -1,5 +1,7 @@ #include "TranslationUnit.h" +const int TranslationUnitOptions = CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; + clang::TranslationUnit:: ~TranslationUnit() { // clang_disposeTranslationUnit(tu_); @@ -55,7 +57,7 @@ TranslationUnit(clang::Index *index, command_line_args.size(), files.data(), files.size(), - clang_defaultEditingTranslationUnitOptions()); + TranslationUnitOptions); } int clang::TranslationUnit:: @@ -72,5 +74,5 @@ ReparseTranslationUnit(const std::string &file_path, return clang_reparseTranslationUnit(tu_, files.size(), files.data(), - clang_defaultReparseOptions(tu_)); + TranslationUnitOptions); } From 39ab3f97b6125a909edc6f091ba7f186fb1f9fb7 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 5 Jun 2015 16:25:19 +0200 Subject: [PATCH 06/12] Added two exception throws. --- src/CodeCompleteResults.cc | 5 +++-- src/CompilationDatabase.cc | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/CodeCompleteResults.cc b/src/CodeCompleteResults.cc index d72528b..bb77346 100644 --- a/src/CodeCompleteResults.cc +++ b/src/CodeCompleteResults.cc @@ -1,5 +1,6 @@ #include "CodeCompleteResults.h" #include "CompletionString.h" +#include clang::CodeCompleteResults:: CodeCompleteResults(clang::TranslationUnit *tu, @@ -32,8 +33,8 @@ size() { clang::CompletionString clang::CodeCompleteResults:: get(int i) { - if (i > size()) { - // TODO(zalox) return type + if (i >= size()) { + throw std::invalid_argument("clang::CodeCompleteResults::get(int i): i>=size()"); } return CompletionString(results_->Results[i].CompletionString); } diff --git a/src/CompilationDatabase.cc b/src/CompilationDatabase.cc index fb008a4..abf56b7 100644 --- a/src/CompilationDatabase.cc +++ b/src/CompilationDatabase.cc @@ -1,11 +1,12 @@ #include "CompilationDatabase.h" +#include clang::CompilationDatabase:: CompilationDatabase(const std::string &project_path) { CXCompilationDatabase_Error error; db_ = clang_CompilationDatabase_fromDirectory(project_path.c_str(), &error); if(error) { - // TODO(user) error code... + throw std::invalid_argument("clang::CompilationDatabase::CompilationDatabase): CXCompilationDatabase_Error"); } } From e380b4175d5f26d3f793729904e4130028bf3881 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 7 Jun 2015 14:47:17 +0200 Subject: [PATCH 07/12] Removed throw exception when compile_commands.json is missing in project_path. --- src/CompilationDatabase.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CompilationDatabase.cc b/src/CompilationDatabase.cc index abf56b7..183570f 100644 --- a/src/CompilationDatabase.cc +++ b/src/CompilationDatabase.cc @@ -6,7 +6,7 @@ CompilationDatabase(const std::string &project_path) { CXCompilationDatabase_Error error; db_ = clang_CompilationDatabase_fromDirectory(project_path.c_str(), &error); if(error) { - throw std::invalid_argument("clang::CompilationDatabase::CompilationDatabase): CXCompilationDatabase_Error"); + //TODO: compile_commands.json is missing, create it? } } From 1dce44f4e49c06dc9469daf7d37771401875bf29 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 7 Jun 2015 17:25:05 +0200 Subject: [PATCH 08/12] Changed vector to vector in TranslationUnit parameter. --- src/TranslationUnit.cc | 20 ++++++++++++++------ src/TranslationUnit.h | 4 ++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index 3d1c170..1361912 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -17,11 +17,15 @@ operator=(const clang::TranslationUnit &tu) { clang::TranslationUnit:: TranslationUnit(Index *index, const std::string &filepath, - const std::vector &command_line_args) { + const std::vector &command_line_args) { + std::vector args; + for(auto &a: command_line_args) { + args.push_back(a.c_str()); + } tu_ = clang_createTranslationUnitFromSourceFile(index->index_, filepath.c_str(), - command_line_args.size(), - command_line_args.data(), + args.size(), + args.data(), 0, NULL); } @@ -40,7 +44,7 @@ TranslationUnit(Index *index, clang::TranslationUnit:: TranslationUnit(clang::Index *index, const std::string &filepath, - const std::vector &command_line_args, + const std::vector &command_line_args, const std::map &buffers) { std::vector files; for (auto &buffer : buffers) { @@ -50,11 +54,15 @@ TranslationUnit(clang::Index *index, file.Length = buffer.second.size(); files.push_back(file); } + std::vector args; + for(auto &a: command_line_args) { + args.push_back(a.c_str()); + } tu_ = clang_parseTranslationUnit(index->index_, filepath.c_str(), - command_line_args.data(), - command_line_args.size(), + args.data(), + args.size(), files.data(), files.size(), TranslationUnitOptions); diff --git a/src/TranslationUnit.h b/src/TranslationUnit.h index 19118e5..6e8e170 100644 --- a/src/TranslationUnit.h +++ b/src/TranslationUnit.h @@ -19,10 +19,10 @@ namespace clang { public: TranslationUnit(Index *index, const std::string &filepath, - const std::vector &command_line_args); + const std::vector &command_line_args); TranslationUnit(Index *index, const std::string &filepath, - const std::vector &command_line_args, + const std::vector &command_line_args, const std::map &buffers); TranslationUnit(Index *index, const std::string &filepath); From ef0183c3719f8c42725bb3dc5d7a5f1787cbec24 Mon Sep 17 00:00:00 2001 From: eidheim Date: Mon, 8 Jun 2015 12:46:53 +0200 Subject: [PATCH 09/12] Now also getting compile commands for header-files. --- src/CompileCommands.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CompileCommands.cc b/src/CompileCommands.cc index 2bcd88f..af9b64d 100644 --- a/src/CompileCommands.cc +++ b/src/CompileCommands.cc @@ -4,6 +4,8 @@ clang::CompileCommands:: CompileCommands(const std::string &filename, CompilationDatabase *db) { commands_ = clang_CompilationDatabase_getCompileCommands(db->db_, filename.c_str()); + if(clang_CompileCommands_getSize(commands_)==0) + commands_ = clang_CompilationDatabase_getAllCompileCommands(db->db_); } clang::CompileCommands:: From fc4e02756bf268fd9d410dbfe6f2910223afcbd1 Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 11 Jun 2015 13:58:29 +0200 Subject: [PATCH 10/12] Changed const int flags to class private member in clang::TranslationUnit. --- src/TranslationUnit.cc | 8 +++----- src/TranslationUnit.h | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index 1361912..e709375 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -1,16 +1,14 @@ #include "TranslationUnit.h" -const int TranslationUnitOptions = CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; - clang::TranslationUnit:: ~TranslationUnit() { // clang_disposeTranslationUnit(tu_); } - clang::TranslationUnit& clang::TranslationUnit:: operator=(const clang::TranslationUnit &tu) { tu_ = tu.tu_; + flags = tu.flags; return *this; } @@ -65,7 +63,7 @@ TranslationUnit(clang::Index *index, args.size(), files.data(), files.size(), - TranslationUnitOptions); + flags); } int clang::TranslationUnit:: @@ -82,5 +80,5 @@ ReparseTranslationUnit(const std::string &file_path, return clang_reparseTranslationUnit(tu_, files.size(), files.data(), - TranslationUnitOptions); + flags); } diff --git a/src/TranslationUnit.h b/src/TranslationUnit.h index 6e8e170..68b5c30 100644 --- a/src/TranslationUnit.h +++ b/src/TranslationUnit.h @@ -41,6 +41,7 @@ namespace clang { friend Cursor; friend CodeCompleteResults; CXTranslationUnit tu_; + unsigned flags=CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; }; } // namespace clang #endif // TRANSLATIONUNIT_H_ From 4cec716eacd8088de04c4633ce9cc6920024586f Mon Sep 17 00:00:00 2001 From: eidheim Date: Sat, 13 Jun 2015 18:06:57 +0200 Subject: [PATCH 11/12] Removed some maybe-dangerous use of auto. Added DefaultFlags, and using this as default parameter to for instance ReparseTranslationUnit. --- src/CompileCommands.cc | 2 +- src/CompletionString.cc | 2 +- src/TranslationUnit.cc | 11 ++++++++--- src/TranslationUnit.h | 9 +++++---- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/CompileCommands.cc b/src/CompileCommands.cc index af9b64d..42a7095 100644 --- a/src/CompileCommands.cc +++ b/src/CompileCommands.cc @@ -17,7 +17,7 @@ std::vector clang::CompileCommands:: get_commands() { unsigned N = clang_CompileCommands_getSize(commands_); std::vector res; - for (auto i = 0; i < N; i++) { + for (unsigned i = 0; i < N; i++) { res.emplace_back(clang::CompileCommand(i, this)); } return res; diff --git a/src/CompletionString.cc b/src/CompletionString.cc index a3c17eb..06bc9cb 100644 --- a/src/CompletionString.cc +++ b/src/CompletionString.cc @@ -17,7 +17,7 @@ std::vector clang::CompletionString:: get_chunks() { std::vector res; if (clang_getCompletionAvailability(str_) == CXAvailability_Available) { - for (auto i = 0; i < get_num_chunks(); i++) { + for (size_t i = 0; i < get_num_chunks(); i++) { res.emplace_back(clang_getCString(clang_getCompletionChunkText(str_, i)), static_cast (clang_getCompletionChunkKind(str_, i))); diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index e709375..57dfeb4 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -8,7 +8,6 @@ clang::TranslationUnit:: clang::TranslationUnit& clang::TranslationUnit:: operator=(const clang::TranslationUnit &tu) { tu_ = tu.tu_; - flags = tu.flags; return *this; } @@ -43,7 +42,8 @@ clang::TranslationUnit:: TranslationUnit(clang::Index *index, const std::string &filepath, const std::vector &command_line_args, - const std::map &buffers) { + const std::map &buffers, + unsigned flags) { std::vector files; for (auto &buffer : buffers) { CXUnsavedFile file; @@ -68,7 +68,8 @@ TranslationUnit(clang::Index *index, int clang::TranslationUnit:: ReparseTranslationUnit(const std::string &file_path, - const std::map &buffers) { + const std::map &buffers, + unsigned flags) { std::vector files; for (auto &buffer : buffers) { CXUnsavedFile file; @@ -82,3 +83,7 @@ ReparseTranslationUnit(const std::string &file_path, files.data(), flags); } + +unsigned clang::TranslationUnit::DefaultFlags() { + return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; +} diff --git a/src/TranslationUnit.h b/src/TranslationUnit.h index 68b5c30..e92c588 100644 --- a/src/TranslationUnit.h +++ b/src/TranslationUnit.h @@ -23,7 +23,8 @@ namespace clang { TranslationUnit(Index *index, const std::string &filepath, const std::vector &command_line_args, - const std::map &buffers); + const std::map &buffers, + unsigned flags=DefaultFlags()); TranslationUnit(Index *index, const std::string &filepath); ~TranslationUnit(); @@ -31,8 +32,9 @@ namespace clang { TranslationUnit& operator=(const TranslationUnit &tu); int ReparseTranslationUnit(const std::string &file_path, const std::map - &buffers); - + &buffers, + unsigned flags=DefaultFlags()); + static unsigned DefaultFlags(); private: friend Token; friend Tokens; @@ -41,7 +43,6 @@ namespace clang { friend Cursor; friend CodeCompleteResults; CXTranslationUnit tu_; - unsigned flags=CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; }; } // namespace clang #endif // TRANSLATIONUNIT_H_ From fbefd909852ae797a41939c8ceb035522549076f Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 14 Jun 2015 12:03:17 +0200 Subject: [PATCH 12/12] Removed default constructor since destroying an object using this would result in segmentation fault. No more crashes hopefully --- src/TranslationUnit.cc | 2 +- src/TranslationUnit.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index 57dfeb4..a91fa6d 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -2,7 +2,7 @@ clang::TranslationUnit:: ~TranslationUnit() { - // clang_disposeTranslationUnit(tu_); + clang_disposeTranslationUnit(tu_); } clang::TranslationUnit& clang::TranslationUnit:: diff --git a/src/TranslationUnit.h b/src/TranslationUnit.h index e92c588..6cfa1a4 100644 --- a/src/TranslationUnit.h +++ b/src/TranslationUnit.h @@ -28,7 +28,6 @@ namespace clang { TranslationUnit(Index *index, const std::string &filepath); ~TranslationUnit(); - TranslationUnit() { } TranslationUnit& operator=(const TranslationUnit &tu); int ReparseTranslationUnit(const std::string &file_path, const std::map