mirror of
https://github.com/MaskRay/ccls.git
synced 2025-02-21 16:09:40 +00:00
more code completion work
This commit is contained in:
parent
404b853d6f
commit
876296d62f
@ -7,14 +7,23 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
unsigned Flags() {
|
unsigned Flags() {
|
||||||
|
/*
|
||||||
return
|
return
|
||||||
CXTranslationUnit_Incomplete |
|
//CXTranslationUnit_Incomplete |
|
||||||
CXTranslationUnit_PrecompiledPreamble |
|
CXTranslationUnit_PrecompiledPreamble |
|
||||||
CXTranslationUnit_CacheCompletionResults |
|
CXTranslationUnit_CacheCompletionResults |
|
||||||
//CXTranslationUnit_ForSerialization |
|
//CXTranslationUnit_ForSerialization |
|
||||||
CXTranslationUnit_IncludeBriefCommentsInCodeCompletion;
|
CXTranslationUnit_IncludeBriefCommentsInCodeCompletion |
|
||||||
CXTranslationUnit_CreatePreambleOnFirstParse |
|
//CXTranslationUnit_CreatePreambleOnFirstParse |
|
||||||
CXTranslationUnit_KeepGoing;
|
CXTranslationUnit_KeepGoing;
|
||||||
|
*/
|
||||||
|
|
||||||
|
return
|
||||||
|
CXTranslationUnit_CacheCompletionResults |
|
||||||
|
CXTranslationUnit_PrecompiledPreamble |
|
||||||
|
CXTranslationUnit_IncludeBriefCommentsInCodeCompletion |
|
||||||
|
//CXTranslationUnit_CreatePreambleOnFirstParse |
|
||||||
|
CXTranslationUnit_DetailedPreprocessingRecord;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StartsWith(const std::string& value, const std::string& start) {
|
bool StartsWith(const std::string& value, const std::string& start) {
|
||||||
@ -46,6 +55,7 @@ lsCompletionItemKind GetCompletionKind(CXCursorKind cursor_kind) {
|
|||||||
case CXCursor_ParmDecl:
|
case CXCursor_ParmDecl:
|
||||||
return lsCompletionItemKind::Variable;
|
return lsCompletionItemKind::Variable;
|
||||||
|
|
||||||
|
case CXCursor_UnionDecl:
|
||||||
case CXCursor_ClassTemplate:
|
case CXCursor_ClassTemplate:
|
||||||
case CXCursor_ClassTemplatePartialSpecialization:
|
case CXCursor_ClassTemplatePartialSpecialization:
|
||||||
case CXCursor_ClassDecl:
|
case CXCursor_ClassDecl:
|
||||||
@ -76,7 +86,7 @@ lsCompletionItemKind GetCompletionKind(CXCursorKind cursor_kind) {
|
|||||||
//return lsCompletionItemKind::Reference;
|
//return lsCompletionItemKind::Reference;
|
||||||
|
|
||||||
case CXCursor_NotImplemented:
|
case CXCursor_NotImplemented:
|
||||||
break;
|
return lsCompletionItemKind::Text;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
std::cerr << "Unhandled completion kind " << cursor_kind << std::endl;
|
std::cerr << "Unhandled completion kind " << cursor_kind << std::endl;
|
||||||
@ -182,24 +192,30 @@ CompletionSession::CompletionSession(const CompilationEntry& file, WorkingFiles*
|
|||||||
// TODO: I think we crash when there are syntax errors.
|
// TODO: I think we crash when there are syntax errors.
|
||||||
active_index = MakeUnique<clang::Index>(0 /*excludeDeclarationsFromPCH*/, 0 /*displayDiagnostics*/);
|
active_index = MakeUnique<clang::Index>(0 /*excludeDeclarationsFromPCH*/, 0 /*displayDiagnostics*/);
|
||||||
active = MakeUnique<clang::TranslationUnit>(*active_index, file.filename, args, unsaved, Flags());
|
active = MakeUnique<clang::TranslationUnit>(*active_index, file.filename, args, unsaved, Flags());
|
||||||
if (active->did_fail) {
|
std::cerr << "Done creating active; did_fail=" << active->did_fail << std::endl;
|
||||||
std::cerr << "Failed to create translation unit; trying again..." << std::endl;
|
//if (active->did_fail) {
|
||||||
active = MakeUnique<clang::TranslationUnit>(*active_index, file.filename, args, unsaved, Flags());
|
// std::cerr << "Failed to create translation unit; trying again..." << std::endl;
|
||||||
}
|
// active = MakeUnique<clang::TranslationUnit>(*active_index, file.filename, args, unsaved, Flags());
|
||||||
|
//}
|
||||||
|
|
||||||
// Despite requesting clang create a precompiled header on the first parse in
|
// Despite requesting clang create a precompiled header on the first parse in
|
||||||
// Flags() via CXTranslationUnit_CreatePreambleOnFirstParse, it doesn't seem
|
// Flags() via CXTranslationUnit_CreatePreambleOnFirstParse, it doesn't seem
|
||||||
// to do so. Immediately reparsing will create one which reduces
|
// to do so. Immediately reparsing will create one which reduces
|
||||||
// clang_codeCompleteAt timing from 200ms to 20ms on simple files.
|
// clang_codeCompleteAt timing from 200ms to 20ms on simple files.
|
||||||
if (!active->did_fail)
|
// TODO: figure out why this is crashing so much
|
||||||
Refresh(working_files);
|
if (!active->did_fail) {
|
||||||
|
std::cerr << "Start reparse" << std::endl;
|
||||||
|
active->ReparseTranslationUnit(unsaved);
|
||||||
|
|
||||||
|
std::cerr << "Done reparse" << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CompletionSession::~CompletionSession() {}
|
CompletionSession::~CompletionSession() {}
|
||||||
|
|
||||||
void CompletionSession::Refresh(WorkingFiles* working_files) {
|
void CompletionSession::Refresh(std::vector<CXUnsavedFile>& unsaved) {
|
||||||
// TODO: Do this off the code completion thread so we don't block completions.
|
// TODO: Do this off the code completion thread so we don't block completions.
|
||||||
active->ReparseTranslationUnit(working_files->AsUnsavedFiles(), Flags());
|
active->ReparseTranslationUnit(unsaved);
|
||||||
}
|
}
|
||||||
|
|
||||||
CompletionManager::CompletionManager(Project* project, WorkingFiles* working_files) : project(project), working_files(working_files) {}
|
CompletionManager::CompletionManager(Project* project, WorkingFiles* working_files) : project(project), working_files(working_files) {}
|
||||||
@ -267,7 +283,6 @@ NonElidedVector<lsCompletionItem> CompletionManager::CodeComplete(const lsTextDo
|
|||||||
|
|
||||||
|
|
||||||
// Get the primary text to insert.
|
// Get the primary text to insert.
|
||||||
|
|
||||||
int num_chunks = clang_getNumCompletionChunks(result.CompletionString);
|
int num_chunks = clang_getNumCompletionChunks(result.CompletionString);
|
||||||
for (unsigned i = 0; i < num_chunks; ++i) {
|
for (unsigned i = 0; i < num_chunks; ++i) {
|
||||||
CXCompletionChunkKind kind = clang_getCompletionChunkKind(result.CompletionString, i);
|
CXCompletionChunkKind kind = clang_getCompletionChunkKind(result.CompletionString, i);
|
||||||
@ -276,7 +291,6 @@ NonElidedVector<lsCompletionItem> CompletionManager::CodeComplete(const lsTextDo
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ls_completion_item.detail = BuildDetailString(result.CompletionString);
|
ls_completion_item.detail = BuildDetailString(result.CompletionString);
|
||||||
|
|
||||||
// Get docs.
|
// Get docs.
|
||||||
|
@ -25,7 +25,7 @@ struct CompletionSession {
|
|||||||
~CompletionSession();
|
~CompletionSession();
|
||||||
|
|
||||||
// Refresh file index.
|
// Refresh file index.
|
||||||
void Refresh(WorkingFiles* working_files);
|
void Refresh(std::vector<CXUnsavedFile>& unsaved);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CompletionManager {
|
struct CompletionManager {
|
||||||
|
@ -54,8 +54,8 @@ TranslationUnit::~TranslationUnit() {
|
|||||||
clang_disposeTranslationUnit(cx_tu);
|
clang_disposeTranslationUnit(cx_tu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TranslationUnit::ReparseTranslationUnit(std::vector<CXUnsavedFile>& unsaved, unsigned flags) {
|
void TranslationUnit::ReparseTranslationUnit(std::vector<CXUnsavedFile>& unsaved) {
|
||||||
int error_code = clang_reparseTranslationUnit(cx_tu, unsaved.size(), unsaved.data(), flags);
|
int error_code = clang_reparseTranslationUnit(cx_tu, unsaved.size(), unsaved.data(), clang_defaultReparseOptions(cx_tu));
|
||||||
switch (error_code) {
|
switch (error_code) {
|
||||||
case CXError_Success:
|
case CXError_Success:
|
||||||
did_fail = false;
|
did_fail = false;
|
||||||
|
@ -23,7 +23,7 @@ namespace clang {
|
|||||||
|
|
||||||
bool did_fail = false;
|
bool did_fail = false;
|
||||||
|
|
||||||
void ReparseTranslationUnit(std::vector<CXUnsavedFile>& unsaved, unsigned flags);
|
void ReparseTranslationUnit(std::vector<CXUnsavedFile>& unsaved);
|
||||||
|
|
||||||
clang::CodeCompleteResults get_code_completions(const std::string &buffer,
|
clang::CodeCompleteResults get_code_completions(const std::string &buffer,
|
||||||
unsigned line_number, unsigned column);
|
unsigned line_number, unsigned column);
|
||||||
|
@ -31,6 +31,7 @@ DWORD CheckForError(std::vector<DWORD> allow) {
|
|||||||
|
|
||||||
std::cerr << "Windows error code=" << error << ", message=" << message
|
std::cerr << "Windows error code=" << error << ", message=" << message
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
assert(false); // debugger break
|
assert(false); // debugger break
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -193,8 +193,8 @@ void Reflect(TVisitor& visitor, IndexedFile& value) {
|
|||||||
|
|
||||||
std::string Serialize(IndexedFile& file) {
|
std::string Serialize(IndexedFile& file) {
|
||||||
rapidjson::StringBuffer output;
|
rapidjson::StringBuffer output;
|
||||||
//rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(output);
|
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(output);
|
||||||
Writer writer(output);
|
//Writer writer(output);
|
||||||
writer.SetFormatOptions(
|
writer.SetFormatOptions(
|
||||||
rapidjson::PrettyFormatOptions::kFormatSingleLineArray);
|
rapidjson::PrettyFormatOptions::kFormatSingleLineArray);
|
||||||
writer.SetIndent(' ', 2);
|
writer.SetIndent(' ', 2);
|
||||||
|
@ -13,7 +13,7 @@ using std::experimental::optional;
|
|||||||
using std::experimental::nullopt;
|
using std::experimental::nullopt;
|
||||||
|
|
||||||
using Reader = rapidjson::GenericValue<rapidjson::UTF8<>>;
|
using Reader = rapidjson::GenericValue<rapidjson::UTF8<>>;
|
||||||
using Writer = rapidjson::PrettyWriter<rapidjson::StringBuffer>;
|
using Writer = rapidjson::Writer<rapidjson::StringBuffer>;
|
||||||
struct IndexedFile;
|
struct IndexedFile;
|
||||||
|
|
||||||
#define REFLECT_MEMBER_START() \
|
#define REFLECT_MEMBER_START() \
|
||||||
|
Loading…
Reference in New Issue
Block a user