From 9d325708004c0f368154f70cc30409d04b94f83c Mon Sep 17 00:00:00 2001 From: eidheim Date: Thu, 4 Jun 2015 12:48:31 +0200 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 5/8] 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 6/8] 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 7/8] 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 8/8] 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::