diff --git a/src/CodeCompleteResults.cc b/src/CodeCompleteResults.cc index bb77346..db4cdb5 100644 --- a/src/CodeCompleteResults.cc +++ b/src/CodeCompleteResults.cc @@ -22,7 +22,7 @@ CodeCompleteResults(clang::TranslationUnit *tu, column, files.data(), files.size(), - clang_defaultCodeCompleteOptions()); + clang_defaultCodeCompleteOptions()|CXCodeComplete_IncludeBriefComments); clang_sortCodeCompletionResults(results_->Results, results_->NumResults); } diff --git a/src/CodeCompleteResults.h b/src/CodeCompleteResults.h index ef05d4c..ff9c43c 100644 --- a/src/CodeCompleteResults.h +++ b/src/CodeCompleteResults.h @@ -13,6 +13,7 @@ namespace clang { const std::map &buffers, int line_num, int column); + ~CodeCompleteResults() {clang_disposeCodeCompleteResults(results_);} CompletionString get(int index); int size(); diff --git a/src/CompletionString.cc b/src/CompletionString.cc index 06bc9cb..9cccaa0 100644 --- a/src/CompletionString.cc +++ b/src/CompletionString.cc @@ -26,6 +26,16 @@ get_chunks() { return res; } +std::string clang::CompletionString::get_brief_comments() { + std::string brief_comments; + auto cxstr=clang_getCompletionBriefComment(str_); + if(cxstr.data!=NULL) { + brief_comments=clang_getCString(cxstr); + clang_disposeString(cxstr); + } + return brief_comments; +} + clang::CompletionChunk:: CompletionChunk(std::string chunk, clang::CompletionChunkKind kind) : chunk_(chunk), kind_(kind) { } diff --git a/src/CompletionString.h b/src/CompletionString.h index 040c87a..34f04b7 100644 --- a/src/CompletionString.h +++ b/src/CompletionString.h @@ -31,6 +31,7 @@ namespace clang { class CompletionString { public: std::vector get_chunks(); + std::string get_brief_comments(); int get_num_chunks(); private: explicit CompletionString(const CXCompletionString &str); diff --git a/src/Tokens.cc b/src/Tokens.cc index 1b46dbb..571d0db 100644 --- a/src/Tokens.cc +++ b/src/Tokens.cc @@ -81,7 +81,7 @@ void clang::Tokens::update_types(clang::TranslationUnit *tu) { } } -std::string clang::Tokens::get_brief_comment(size_t cursor_id) { +std::string clang::Tokens::get_brief_comments(size_t cursor_id) { std::string comment_string; auto referenced=clang_getCursorReferenced(clang_cursors[cursor_id]); auto comment=clang_Cursor_getParsedComment(referenced); diff --git a/src/Tokens.h b/src/Tokens.h index c15cd25..8696337 100644 --- a/src/Tokens.h +++ b/src/Tokens.h @@ -10,7 +10,7 @@ namespace clang { Tokens(TranslationUnit *tu, SourceRange *range); ~Tokens(); void update_types(clang::TranslationUnit *tu); - std::string get_brief_comment(size_t cursor_id); + std::string get_brief_comments(size_t cursor_id); private: CXToken *tokens_; unsigned num_tokens_; diff --git a/src/TranslationUnit.cc b/src/TranslationUnit.cc index 09a9b67..de1c2aa 100644 --- a/src/TranslationUnit.cc +++ b/src/TranslationUnit.cc @@ -1,6 +1,8 @@ #include "TranslationUnit.h" #include "SourceLocation.h" #include "Tokens.h" +#include +#include clang::TranslationUnit:: ~TranslationUnit() { @@ -17,27 +19,24 @@ clang::TranslationUnit:: TranslationUnit(Index *index, const std::string &filepath, 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(), - args.size(), - args.data(), - 0, - NULL); + std::map buffers; + std::ifstream ifs(filepath, std::ifstream::in); + std::stringstream ss; + ss << ifs.rdbuf(); + buffers[filepath]=ss.str(); + parse(index, filepath, command_line_args, buffers); } clang::TranslationUnit:: TranslationUnit(Index *index, const std::string &filepath) { - tu_ = clang_createTranslationUnitFromSourceFile(index->index_, - filepath.c_str(), - 0, - NULL, - 0, - NULL); + std::vector command_line_args; + std::map buffers; + std::ifstream ifs(filepath, std::ifstream::in); + std::stringstream ss; + ss << ifs.rdbuf(); + buffers[filepath]=ss.str(); + parse(index, filepath, command_line_args, buffers); } clang::TranslationUnit:: @@ -46,6 +45,14 @@ TranslationUnit(clang::Index *index, const std::vector &command_line_args, const std::map &buffers, unsigned flags) { + parse(index, filepath, command_line_args, buffers, flags); +} + +void clang::TranslationUnit::parse(Index *index, + const std::string &filepath, + const std::vector &command_line_args, + const std::map &buffers, + unsigned flags) { std::vector files; for (auto &buffer : buffers) { CXUnsavedFile file; @@ -59,13 +66,13 @@ TranslationUnit(clang::Index *index, args.push_back(a.c_str()); } tu_ = - clang_parseTranslationUnit(index->index_, - filepath.c_str(), - args.data(), - args.size(), - files.data(), - files.size(), - flags); + clang_parseTranslationUnit(index->index_, + filepath.c_str(), + args.data(), + args.size(), + files.data(), + files.size(), + flags); } int clang::TranslationUnit:: @@ -87,7 +94,7 @@ ReparseTranslationUnit(const std::string &file_path, } unsigned clang::TranslationUnit::DefaultFlags() { - return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete; + return CXTranslationUnit_CacheCompletionResults | CXTranslationUnit_PrecompiledPreamble | CXTranslationUnit_Incomplete | CXTranslationUnit_IncludeBriefCommentsInCodeCompletion; } void clang::TranslationUnit::update_diagnostics() { diff --git a/src/TranslationUnit.h b/src/TranslationUnit.h index 038093c..b04a93e 100644 --- a/src/TranslationUnit.h +++ b/src/TranslationUnit.h @@ -40,6 +40,11 @@ namespace clang { std::vector diagnostics; private: + void parse(Index *index, + const std::string &filepath, + const std::vector &command_line_args, + const std::map &buffers, + unsigned flags=DefaultFlags()); friend Token; friend Tokens; friend SourceLocation;