diff --git a/src/code_completion.cc b/src/code_completion.cc index 00e465df..da9b1d71 100644 --- a/src/code_completion.cc +++ b/src/code_completion.cc @@ -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(0 /*excludeDeclarationsFromPCH*/, 0 /*displayDiagnostics*/); active = MakeUnique(*active_index, file.filename, args, unsaved, Flags()); - if (active->did_fail) { - std::cerr << "Failed to create translation unit; trying again..." << std::endl; - active = MakeUnique(*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(*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& 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 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 CompletionManager::CodeComplete(const lsTextDo break; } } - ls_completion_item.detail = BuildDetailString(result.CompletionString); // Get docs. diff --git a/src/code_completion.h b/src/code_completion.h index 4753edd0..1e4b6bfc 100644 --- a/src/code_completion.h +++ b/src/code_completion.h @@ -25,7 +25,7 @@ struct CompletionSession { ~CompletionSession(); // Refresh file index. - void Refresh(WorkingFiles* working_files); + void Refresh(std::vector& unsaved); }; struct CompletionManager { diff --git a/src/libclangmm/TranslationUnit.cc b/src/libclangmm/TranslationUnit.cc index 1bcd183e..583ca444 100644 --- a/src/libclangmm/TranslationUnit.cc +++ b/src/libclangmm/TranslationUnit.cc @@ -54,8 +54,8 @@ TranslationUnit::~TranslationUnit() { clang_disposeTranslationUnit(cx_tu); } -void TranslationUnit::ReparseTranslationUnit(std::vector& unsaved, unsigned flags) { - int error_code = clang_reparseTranslationUnit(cx_tu, unsaved.size(), unsaved.data(), flags); +void TranslationUnit::ReparseTranslationUnit(std::vector& 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; diff --git a/src/libclangmm/TranslationUnit.h b/src/libclangmm/TranslationUnit.h index ad06f016..8196a005 100644 --- a/src/libclangmm/TranslationUnit.h +++ b/src/libclangmm/TranslationUnit.h @@ -23,7 +23,7 @@ namespace clang { bool did_fail = false; - void ReparseTranslationUnit(std::vector& unsaved, unsigned flags); + void ReparseTranslationUnit(std::vector& unsaved); clang::CodeCompleteResults get_code_completions(const std::string &buffer, unsigned line_number, unsigned column); diff --git a/src/platform_win.cc b/src/platform_win.cc index d6b1ae9d..917a6cb1 100644 --- a/src/platform_win.cc +++ b/src/platform_win.cc @@ -31,6 +31,7 @@ DWORD CheckForError(std::vector allow) { std::cerr << "Windows error code=" << error << ", message=" << message << std::endl; + assert(false); // debugger break exit(1); } diff --git a/src/serializer.cc b/src/serializer.cc index 37b11dc4..d6ee1680 100644 --- a/src/serializer.cc +++ b/src/serializer.cc @@ -193,8 +193,8 @@ void Reflect(TVisitor& visitor, IndexedFile& value) { std::string Serialize(IndexedFile& file) { rapidjson::StringBuffer output; - //rapidjson::PrettyWriter writer(output); - Writer writer(output); + rapidjson::PrettyWriter writer(output); + //Writer writer(output); writer.SetFormatOptions( rapidjson::PrettyFormatOptions::kFormatSingleLineArray); writer.SetIndent(' ', 2); diff --git a/src/serializer.h b/src/serializer.h index cb957831..4627e19b 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -13,7 +13,7 @@ using std::experimental::optional; using std::experimental::nullopt; using Reader = rapidjson::GenericValue>; -using Writer = rapidjson::PrettyWriter; +using Writer = rapidjson::Writer; struct IndexedFile; #define REFLECT_MEMBER_START() \