This revision was automatically updated to reflect the committed changes. Closed by commit rGeba3ee04d450: [clangd] Run code completion on each token coverd by --check-lines (authored by adamcz).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D103538/new/ https://reviews.llvm.org/D103538 Files: clang-tools-extra/clangd/tool/Check.cpp clang-tools-extra/clangd/tool/ClangdMain.cpp Index: clang-tools-extra/clangd/tool/ClangdMain.cpp =================================================================== --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -62,7 +62,8 @@ // Implemented in Check.cpp. bool check(const llvm::StringRef File, llvm::function_ref<bool(const Position &)> ShouldCheckLine, - const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts); + const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts, + bool EnableCodeCompletion); namespace { @@ -929,7 +930,11 @@ uint32_t Line = Pos.line + 1; // Position::line is 0-based. return Line >= Begin && Line <= End; }; - return check(Path, ShouldCheckLine, TFS, Opts) + // For now code completion is enabled any time the range is limited via + // --check-lines. If it turns out to be to slow, we can introduce a + // dedicated flag for that instead. + return check(Path, ShouldCheckLine, TFS, Opts, + /*EnableCodeCompletion=*/!CheckFileLines.empty()) ? 0 : static_cast<int>(ErrorResultCode::CheckFailed); } Index: clang-tools-extra/clangd/tool/Check.cpp =================================================================== --- clang-tools-extra/clangd/tool/Check.cpp +++ clang-tools-extra/clangd/tool/Check.cpp @@ -193,10 +193,15 @@ // Run AST-based features at each token in the file. void testLocationFeatures( - llvm::function_ref<bool(const Position &)> ShouldCheckLine) { + llvm::function_ref<bool(const Position &)> ShouldCheckLine, + const bool EnableCodeCompletion) { log("Testing features at each token (may be slow in large files)"); auto &SM = AST->getSourceManager(); auto SpelledTokens = AST->getTokens().spelledTokens(SM.getMainFileID()); + + CodeCompleteOptions CCOpts = Opts.CodeComplete; + CCOpts.Index = &Index; + for (const auto &Tok : SpelledTokens) { unsigned Start = AST->getSourceManager().getFileOffset(Tok.location()); unsigned End = Start + Tok.length(); @@ -233,8 +238,12 @@ auto Hover = getHover(*AST, Pos, Style, &Index); vlog(" hover: {0}", Hover.hasValue()); - // FIXME: it'd be nice to include code completion, but it's too slow. - // Maybe in combination with a line restriction? + if (EnableCodeCompletion) { + Position EndPos = offsetToPosition(Inputs.Contents, End); + auto CC = codeComplete(File, EndPos, Preamble.get(), Inputs, CCOpts); + vlog(" code completion: {0}", + CC.Completions.empty() ? "<empty>" : CC.Completions[0].Name); + } } } }; @@ -243,7 +252,8 @@ bool check(llvm::StringRef File, llvm::function_ref<bool(const Position &)> ShouldCheckLine, - const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts) { + const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts, + bool EnableCodeCompletion) { llvm::SmallString<0> FakeFile; llvm::Optional<std::string> Contents; if (File.empty()) { @@ -267,7 +277,7 @@ if (!C.buildCommand(TFS) || !C.buildInvocation(TFS, Contents) || !C.buildAST()) return false; - C.testLocationFeatures(ShouldCheckLine); + C.testLocationFeatures(ShouldCheckLine, EnableCodeCompletion); log("All checks completed, {0} errors", C.ErrCount); return C.ErrCount == 0;
Index: clang-tools-extra/clangd/tool/ClangdMain.cpp =================================================================== --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -62,7 +62,8 @@ // Implemented in Check.cpp. bool check(const llvm::StringRef File, llvm::function_ref<bool(const Position &)> ShouldCheckLine, - const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts); + const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts, + bool EnableCodeCompletion); namespace { @@ -929,7 +930,11 @@ uint32_t Line = Pos.line + 1; // Position::line is 0-based. return Line >= Begin && Line <= End; }; - return check(Path, ShouldCheckLine, TFS, Opts) + // For now code completion is enabled any time the range is limited via + // --check-lines. If it turns out to be to slow, we can introduce a + // dedicated flag for that instead. + return check(Path, ShouldCheckLine, TFS, Opts, + /*EnableCodeCompletion=*/!CheckFileLines.empty()) ? 0 : static_cast<int>(ErrorResultCode::CheckFailed); } Index: clang-tools-extra/clangd/tool/Check.cpp =================================================================== --- clang-tools-extra/clangd/tool/Check.cpp +++ clang-tools-extra/clangd/tool/Check.cpp @@ -193,10 +193,15 @@ // Run AST-based features at each token in the file. void testLocationFeatures( - llvm::function_ref<bool(const Position &)> ShouldCheckLine) { + llvm::function_ref<bool(const Position &)> ShouldCheckLine, + const bool EnableCodeCompletion) { log("Testing features at each token (may be slow in large files)"); auto &SM = AST->getSourceManager(); auto SpelledTokens = AST->getTokens().spelledTokens(SM.getMainFileID()); + + CodeCompleteOptions CCOpts = Opts.CodeComplete; + CCOpts.Index = &Index; + for (const auto &Tok : SpelledTokens) { unsigned Start = AST->getSourceManager().getFileOffset(Tok.location()); unsigned End = Start + Tok.length(); @@ -233,8 +238,12 @@ auto Hover = getHover(*AST, Pos, Style, &Index); vlog(" hover: {0}", Hover.hasValue()); - // FIXME: it'd be nice to include code completion, but it's too slow. - // Maybe in combination with a line restriction? + if (EnableCodeCompletion) { + Position EndPos = offsetToPosition(Inputs.Contents, End); + auto CC = codeComplete(File, EndPos, Preamble.get(), Inputs, CCOpts); + vlog(" code completion: {0}", + CC.Completions.empty() ? "<empty>" : CC.Completions[0].Name); + } } } }; @@ -243,7 +252,8 @@ bool check(llvm::StringRef File, llvm::function_ref<bool(const Position &)> ShouldCheckLine, - const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts) { + const ThreadsafeFS &TFS, const ClangdLSPServer::Options &Opts, + bool EnableCodeCompletion) { llvm::SmallString<0> FakeFile; llvm::Optional<std::string> Contents; if (File.empty()) { @@ -267,7 +277,7 @@ if (!C.buildCommand(TFS) || !C.buildInvocation(TFS, Contents) || !C.buildAST()) return false; - C.testLocationFeatures(ShouldCheckLine); + C.testLocationFeatures(ShouldCheckLine, EnableCodeCompletion); log("All checks completed, {0} errors", C.ErrCount); return C.ErrCount == 0;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits