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