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/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..183570f 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... + //TODO: compile_commands.json is missing, create it? } } 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:: diff --git a/src/CompletionString.cc b/src/CompletionString.cc index e7cf1b8..a3c17eb 100644 --- a/src/CompletionString.cc +++ b/src/CompletionString.cc @@ -7,7 +7,10 @@ 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:: @@ -16,8 +19,8 @@ get_chunks() { 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))); + static_cast + (clang_getCompletionChunkKind(str_, i))); } } return res; diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index df26ed9..1361912 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_); @@ -15,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); } @@ -38,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) { @@ -48,14 +54,18 @@ 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(), - clang_defaultEditingTranslationUnitOptions()); + TranslationUnitOptions); } int clang::TranslationUnit:: @@ -72,5 +82,5 @@ ReparseTranslationUnit(const std::string &file_path, return clang_reparseTranslationUnit(tu_, files.size(), files.data(), - clang_defaultReparseOptions(tu_)); + 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); 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