Author: Vassil Vassilev Date: 2023-08-23T14:46:15Z New Revision: f94a937cb37a949cca7a084669c634a87b1d2bb1
URL: https://github.com/llvm/llvm-project/commit/f94a937cb37a949cca7a084669c634a87b1d2bb1 DIFF: https://github.com/llvm/llvm-project/commit/f94a937cb37a949cca7a084669c634a87b1d2bb1.diff LOG: Revert "[clang-repl] support code completion at a REPL." This reverts commit eb0e6c3134ef6deafe0a4958e9e1a1214b3c2f14 due to failures in clangd such as https://lab.llvm.org/buildbot/#/builders/57/builds/29377 Added: Modified: clang/include/clang/Frontend/ASTUnit.h clang/include/clang/Sema/CodeCompleteConsumer.h clang/include/clang/Sema/Sema.h clang/lib/Frontend/ASTUnit.cpp clang/lib/Interpreter/CMakeLists.txt clang/lib/Interpreter/IncrementalParser.cpp clang/lib/Interpreter/IncrementalParser.h clang/lib/Interpreter/Interpreter.cpp clang/lib/Parse/ParseDecl.cpp clang/lib/Parse/Parser.cpp clang/lib/Sema/CodeCompleteConsumer.cpp clang/lib/Sema/SemaCodeComplete.cpp clang/tools/clang-repl/ClangRepl.cpp clang/tools/libclang/CIndexCodeCompletion.cpp clang/unittests/Interpreter/CMakeLists.txt Removed: clang/include/clang/Interpreter/CodeCompletion.h clang/lib/Interpreter/CodeCompletion.cpp clang/test/CodeCompletion/incrememal-mode-completion-no-error.cpp clang/test/CodeCompletion/incremental-top-level.cpp clang/unittests/Interpreter/CodeCompletionTest.cpp ################################################################################ diff --git a/clang/include/clang/Frontend/ASTUnit.h b/clang/include/clang/Frontend/ASTUnit.h index c6d0d4d7e90233..b762be1c9b1d6d 100644 --- a/clang/include/clang/Frontend/ASTUnit.h +++ b/clang/include/clang/Frontend/ASTUnit.h @@ -77,7 +77,6 @@ class Preprocessor; class PreprocessorOptions; class Sema; class TargetInfo; -class SyntaxOnlyAction; /// \brief Enumerates the available scopes for skipping function bodies. enum class SkipFunctionBodiesScope { None, Preamble, PreambleAndMainFile }; @@ -888,10 +887,6 @@ class ASTUnit { /// \param IncludeBriefComments Whether to include brief documentation within /// the set of code completions returned. /// - /// \param Act If supplied, this argument is used to parse the input file, - /// allowing customized parsing by overriding SyntaxOnlyAction lifecycle - /// methods. - /// /// FIXME: The Diag, LangOpts, SourceMgr, FileMgr, StoredDiagnostics, and /// OwnedBuffers parameters are all disgusting hacks. They will go away. void CodeComplete(StringRef File, unsigned Line, unsigned Column, @@ -902,8 +897,7 @@ class ASTUnit { DiagnosticsEngine &Diag, LangOptions &LangOpts, SourceManager &SourceMgr, FileManager &FileMgr, SmallVectorImpl<StoredDiagnostic> &StoredDiagnostics, - SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers, - std::unique_ptr<SyntaxOnlyAction> Act = nullptr); + SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers); /// Save this translation unit to a file with the given name. /// diff --git a/clang/include/clang/Interpreter/CodeCompletion.h b/clang/include/clang/Interpreter/CodeCompletion.h deleted file mode 100644 index 6631d33358600f..00000000000000 --- a/clang/include/clang/Interpreter/CodeCompletion.h +++ /dev/null @@ -1,33 +0,0 @@ -//===----- CodeCompletion.h - Code Completion for ClangRepl ---===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file defines the classes which performs code completion at the REPL. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_INTERPRETER_CODE_COMPLETION_H -#define LLVM_CLANG_INTERPRETER_CODE_COMPLETION_H -#include <string> -#include <vector> - -namespace llvm { -class StringRef; -} // namespace llvm - -namespace clang { -class CodeCompletionResult; -class CompilerInstance; - -void codeComplete(CompilerInstance *InterpCI, llvm::StringRef Content, - unsigned Line, unsigned Col, const CompilerInstance *ParentCI, - std::vector<CodeCompletionResult> &CCResults); - -std::vector<std::string> -convertToCodeCompleteStrings(const std::vector<CodeCompletionResult> &Results); -} // namespace clang -#endif diff --git a/clang/include/clang/Sema/CodeCompleteConsumer.h b/clang/include/clang/Sema/CodeCompleteConsumer.h index c9e866676e884c..bb4b638050383c 100644 --- a/clang/include/clang/Sema/CodeCompleteConsumer.h +++ b/clang/include/clang/Sema/CodeCompleteConsumer.h @@ -336,10 +336,7 @@ class CodeCompletionContext { CCC_Recovery, /// Code completion in a @class forward declaration. - CCC_ObjCClassForwardDecl, - - /// Code completion at a top level in a REPL session. - CCC_TopLevelOrExpression, + CCC_ObjCClassForwardDecl }; using VisitedContextSet = llvm::SmallPtrSet<DeclContext *, 8>; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index eb4cdbb7e60240..c992e8763057bd 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -13449,9 +13449,7 @@ class Sema final { PCC_ParenthesizedExpression, /// Code completion occurs within a sequence of declaration /// specifiers within a function, method, or block. - PCC_LocalDeclarationSpecifiers, - /// Code completion occurs at top-level in a REPL session - PCC_TopLevelOrExpression, + PCC_LocalDeclarationSpecifiers }; void CodeCompleteModuleImport(SourceLocation ImportLoc, ModuleIdPath Path); diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 98d6c08146d6c8..aece72243d17e0 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -2008,8 +2008,7 @@ static void CalculateHiddenNames(const CodeCompletionContext &Context, case CodeCompletionContext::CCC_SymbolOrNewName: case CodeCompletionContext::CCC_ParenthesizedExpression: case CodeCompletionContext::CCC_ObjCInterfaceName: - case CodeCompletionContext::CCC_TopLevelOrExpression: - break; + break; case CodeCompletionContext::CCC_EnumTag: case CodeCompletionContext::CCC_UnionTag: @@ -2168,8 +2167,7 @@ void ASTUnit::CodeComplete( std::shared_ptr<PCHContainerOperations> PCHContainerOps, DiagnosticsEngine &Diag, LangOptions &LangOpts, SourceManager &SourceMgr, FileManager &FileMgr, SmallVectorImpl<StoredDiagnostic> &StoredDiagnostics, - SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers, - std::unique_ptr<SyntaxOnlyAction> Act) { + SmallVectorImpl<const llvm::MemoryBuffer *> &OwnedBuffers) { if (!Invocation) return; @@ -2306,9 +2304,8 @@ void ASTUnit::CodeComplete( if (!Clang->getLangOpts().Modules) PreprocessorOpts.DetailedRecord = false; - if (!Act) - Act.reset(new SyntaxOnlyAction); - + std::unique_ptr<SyntaxOnlyAction> Act; + Act.reset(new SyntaxOnlyAction); if (Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) { if (llvm::Error Err = Act->Execute()) { consumeError(std::move(Err)); // FIXME this drops errors on the floor. diff --git a/clang/lib/Interpreter/CMakeLists.txt b/clang/lib/Interpreter/CMakeLists.txt index 79d2cba67f54c4..d3781fef1bd3de 100644 --- a/clang/lib/Interpreter/CMakeLists.txt +++ b/clang/lib/Interpreter/CMakeLists.txt @@ -13,7 +13,6 @@ set(LLVM_LINK_COMPONENTS add_clang_library(clangInterpreter DeviceOffload.cpp - CodeCompletion.cpp IncrementalExecutor.cpp IncrementalParser.cpp Interpreter.cpp diff --git a/clang/lib/Interpreter/CodeCompletion.cpp b/clang/lib/Interpreter/CodeCompletion.cpp deleted file mode 100644 index 05a19aec05ff7e..00000000000000 --- a/clang/lib/Interpreter/CodeCompletion.cpp +++ /dev/null @@ -1,229 +0,0 @@ -//===------ CodeCompletion.cpp - Code Completion for ClangRepl -------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements the classes which performs code completion at the REPL. -// -//===----------------------------------------------------------------------===// - -#include "clang/Interpreter/CodeCompletion.h" -#include "clang/AST/ASTImporter.h" -#include "clang/AST/DeclarationName.h" -#include "clang/AST/ExternalASTSource.h" -#include "clang/Basic/IdentifierTable.h" -#include "clang/Frontend/ASTUnit.h" -#include "clang/Frontend/CompilerInstance.h" -#include "clang/Frontend/FrontendActions.h" -#include "clang/Interpreter/Interpreter.h" -#include "clang/Lex/PreprocessorOptions.h" -#include "clang/Sema/CodeCompleteConsumer.h" -#include "clang/Sema/CodeCompleteOptions.h" -#include "clang/Sema/Sema.h" - -namespace clang { - -const std::string CodeCompletionFileName = "input_line_[Completion]"; - -clang::CodeCompleteOptions getClangCompleteOpts() { - clang::CodeCompleteOptions Opts; - Opts.IncludeCodePatterns = true; - Opts.IncludeMacros = true; - Opts.IncludeGlobals = true; - Opts.IncludeBriefComments = true; - return Opts; -} - -class ReplCompletionConsumer : public CodeCompleteConsumer { -public: - ReplCompletionConsumer(std::vector<CodeCompletionResult> &Results) - : CodeCompleteConsumer(getClangCompleteOpts()), - CCAllocator(std::make_shared<GlobalCodeCompletionAllocator>()), - CCTUInfo(CCAllocator), Results(Results){}; - - void ProcessCodeCompleteResults(class Sema &S, CodeCompletionContext Context, - CodeCompletionResult *InResults, - unsigned NumResults) final; - - CodeCompletionAllocator &getAllocator() override { return *CCAllocator; } - - CodeCompletionTUInfo &getCodeCompletionTUInfo() override { return CCTUInfo; } - -private: - std::shared_ptr<GlobalCodeCompletionAllocator> CCAllocator; - CodeCompletionTUInfo CCTUInfo; - std::vector<CodeCompletionResult> &Results; -}; - -void ReplCompletionConsumer::ProcessCodeCompleteResults( - class Sema &S, CodeCompletionContext Context, - CodeCompletionResult *InResults, unsigned NumResults) { - for (unsigned I = 0; I < NumResults; ++I) { - auto &Result = InResults[I]; - switch (Result.Kind) { - case CodeCompletionResult::RK_Declaration: - if (Result.Declaration->getIdentifier()) { - Results.push_back(Result); - } - break; - case CodeCompletionResult::RK_Keyword: - Results.push_back(Result); - break; - default: - break; - } - } -} - -std::vector<std::string> convertToCodeCompleteStrings( - const std::vector<clang::CodeCompletionResult> &Results) { - std::vector<std::string> CompletionStrings; - for (auto Res : Results) { - switch (Res.Kind) { - case clang::CodeCompletionResult::RK_Declaration: - if (auto *ID = Res.Declaration->getIdentifier()) { - CompletionStrings.push_back(ID->getName().str()); - } - break; - case clang::CodeCompletionResult::RK_Keyword: - CompletionStrings.push_back(Res.Keyword); - break; - default: - break; - } - } - return CompletionStrings; -} - -class IncrementalSyntaxOnlyAction : public SyntaxOnlyAction { - const CompilerInstance *ParentCI; - -public: - IncrementalSyntaxOnlyAction(const CompilerInstance *ParentCI) - : ParentCI(ParentCI) {} - -protected: - void ExecuteAction() override; -}; - -class ExternalSource : public clang::ExternalASTSource { - TranslationUnitDecl *ChildTUDeclCtxt; - ASTContext &ParentASTCtxt; - TranslationUnitDecl *ParentTUDeclCtxt; - - std::unique_ptr<ASTImporter> Importer; - -public: - ExternalSource(ASTContext &ChildASTCtxt, FileManager &ChildFM, - ASTContext &ParentASTCtxt, FileManager &ParentFM); - bool FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name) override; - void - completeVisibleDeclsMap(const clang::DeclContext *childDeclContext) override; -}; - -// This method is intended to set up `ExternalASTSource` to the running -// compiler instance before the super `ExecuteAction` triggers parsing -void IncrementalSyntaxOnlyAction::ExecuteAction() { - CompilerInstance &CI = getCompilerInstance(); - ExternalSource *myExternalSource = - new ExternalSource(CI.getASTContext(), CI.getFileManager(), - ParentCI->getASTContext(), ParentCI->getFileManager()); - llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> astContextExternalSource( - myExternalSource); - CI.getASTContext().setExternalSource(astContextExternalSource); - CI.getASTContext().getTranslationUnitDecl()->setHasExternalVisibleStorage( - true); - - SyntaxOnlyAction::ExecuteAction(); -} - -ExternalSource::ExternalSource(ASTContext &ChildASTCtxt, FileManager &ChildFM, - ASTContext &ParentASTCtxt, FileManager &ParentFM) - : ChildTUDeclCtxt(ChildASTCtxt.getTranslationUnitDecl()), - ParentASTCtxt(ParentASTCtxt), - ParentTUDeclCtxt(ParentASTCtxt.getTranslationUnitDecl()) { - ASTImporter *importer = - new ASTImporter(ChildASTCtxt, ChildFM, ParentASTCtxt, ParentFM, - /*MinimalImport : ON*/ true); - Importer.reset(importer); -} - -bool ExternalSource::FindExternalVisibleDeclsByName(const DeclContext *DC, - DeclarationName Name) { - IdentifierTable &ParentIdTable = ParentASTCtxt.Idents; - - auto ParentDeclName = - DeclarationName(&(ParentIdTable.get(Name.getAsString()))); - - DeclContext::lookup_result lookup_result = - ParentTUDeclCtxt->lookup(ParentDeclName); - - if (!lookup_result.empty()) { - return true; - } - return false; -} - -void ExternalSource::completeVisibleDeclsMap( - const DeclContext *ChildDeclContext) { - assert(ChildDeclContext && ChildDeclContext == ChildTUDeclCtxt && - "No child decl context!"); - - if (!ChildDeclContext->hasExternalVisibleStorage()) - return; - - for (auto *DeclCtxt = ParentTUDeclCtxt; DeclCtxt != nullptr; - DeclCtxt = DeclCtxt->getPreviousDecl()) { - for (auto &IDeclContext : DeclCtxt->decls()) { - if (NamedDecl *Decl = llvm::dyn_cast<NamedDecl>(IDeclContext)) { - if (auto DeclOrErr = Importer->Import(Decl)) { - if (NamedDecl *importedNamedDecl = - llvm::dyn_cast<NamedDecl>(*DeclOrErr)) { - SetExternalVisibleDeclsForName(ChildDeclContext, - importedNamedDecl->getDeclName(), - importedNamedDecl); - } - - } else { - llvm::consumeError(DeclOrErr.takeError()); - } - } - } - ChildDeclContext->setHasExternalLexicalStorage(false); - } -} - -void codeComplete(CompilerInstance *InterpCI, llvm::StringRef Content, - unsigned Line, unsigned Col, const CompilerInstance *ParentCI, - std::vector<CodeCompletionResult> &CCResults) { - std::unique_ptr<llvm::MemoryBuffer> MB = - llvm::MemoryBuffer::getMemBufferCopy(Content, CodeCompletionFileName); - llvm::SmallVector<ASTUnit::RemappedFile, 4> RemappedFiles; - - RemappedFiles.push_back(std::make_pair(CodeCompletionFileName, MB.release())); - - auto DiagOpts = DiagnosticOptions(); - auto consumer = ReplCompletionConsumer(CCResults); - - auto diag = InterpCI->getDiagnosticsPtr(); - ASTUnit *AU = ASTUnit::LoadFromCompilerInvocationAction( - InterpCI->getInvocationPtr(), std::make_shared<PCHContainerOperations>(), - diag); - llvm::SmallVector<clang::StoredDiagnostic, 8> sd = {}; - llvm::SmallVector<const llvm::MemoryBuffer *, 1> tb = {}; - InterpCI->getFrontendOpts().Inputs[0] = FrontendInputFile( - CodeCompletionFileName, Language::CXX, InputKind::Source); - auto Act = std::unique_ptr<IncrementalSyntaxOnlyAction>( - new IncrementalSyntaxOnlyAction(ParentCI)); - AU->CodeComplete(CodeCompletionFileName, 1, Col, RemappedFiles, false, false, - false, consumer, - std::make_shared<clang::PCHContainerOperations>(), *diag, - InterpCI->getLangOpts(), InterpCI->getSourceManager(), - InterpCI->getFileManager(), sd, tb, std::move(Act)); -} - -} // namespace clang diff --git a/clang/lib/Interpreter/IncrementalParser.cpp b/clang/lib/Interpreter/IncrementalParser.cpp index 370bcbfee8b014..9e5cf358700b1b 100644 --- a/clang/lib/Interpreter/IncrementalParser.cpp +++ b/clang/lib/Interpreter/IncrementalParser.cpp @@ -11,7 +11,6 @@ //===----------------------------------------------------------------------===// #include "IncrementalParser.h" - #include "clang/AST/DeclContextInternals.h" #include "clang/CodeGen/BackendUtil.h" #include "clang/CodeGen/CodeGenAction.h" @@ -158,11 +157,16 @@ class IncrementalAction : public WrapperFrontendAction { TranslationUnitKind getTranslationUnitKind() override { return TU_Incremental; } - void ExecuteAction() override { CompilerInstance &CI = getCompilerInstance(); assert(CI.hasPreprocessor() && "No PP!"); + // FIXME: Move the truncation aspect of this into Sema, we delayed this till + // here so the source manager would be initialized. + if (hasCodeCompletionSupport() && + !CI.getFrontendOpts().CodeCompletionAt.FileName.empty()) + CI.createCodeCompletionConsumer(); + // Use a code completion consumer? CodeCompleteConsumer *CompletionConsumer = nullptr; if (CI.hasCodeCompletionConsumer()) @@ -394,4 +398,5 @@ llvm::StringRef IncrementalParser::GetMangledName(GlobalDecl GD) const { assert(CG); return CG->GetMangledName(GD); } + } // end namespace clang diff --git a/clang/lib/Interpreter/IncrementalParser.h b/clang/lib/Interpreter/IncrementalParser.h index e13b74c7f65948..def5750d166755 100644 --- a/clang/lib/Interpreter/IncrementalParser.h +++ b/clang/lib/Interpreter/IncrementalParser.h @@ -13,9 +13,9 @@ #ifndef LLVM_CLANG_LIB_INTERPRETER_INCREMENTALPARSER_H #define LLVM_CLANG_LIB_INTERPRETER_INCREMENTALPARSER_H -#include "clang/AST/GlobalDecl.h" #include "clang/Interpreter/PartialTranslationUnit.h" +#include "clang/AST/GlobalDecl.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Error.h" @@ -24,7 +24,7 @@ #include <memory> namespace llvm { class LLVMContext; -} // namespace llvm +} namespace clang { class ASTConsumer; diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 7968c62cbd3e7b..4e1045298537b1 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -11,11 +11,13 @@ // //===----------------------------------------------------------------------===// +#include "clang/Interpreter/Interpreter.h" + #include "DeviceOffload.h" #include "IncrementalExecutor.h" #include "IncrementalParser.h" -#include "InterpreterUtils.h" +#include "InterpreterUtils.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Mangle.h" #include "clang/AST/TypeVisitor.h" @@ -31,7 +33,6 @@ #include "clang/Driver/Tool.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/TextDiagnosticBuffer.h" -#include "clang/Interpreter/Interpreter.h" #include "clang/Interpreter/Value.h" #include "clang/Lex/PreprocessorOptions.h" #include "clang/Sema/Lookup.h" @@ -126,6 +127,7 @@ CreateCI(const llvm::opt::ArgStringList &Argv) { Clang->getFrontendOpts().DisableFree = false; Clang->getCodeGenOpts().DisableFree = false; + return std::move(Clang); } @@ -274,7 +276,6 @@ Interpreter::create(std::unique_ptr<CompilerInstance> CI) { std::unique_ptr<Interpreter>(new Interpreter(std::move(CI), Err)); if (Err) return std::move(Err); - auto PTU = Interp->Parse(Runtimes); if (!PTU) return PTU.takeError(); diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index d4cc04848c4c35..cd7c5dcf275c04 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -18,7 +18,6 @@ #include "clang/Basic/Attributes.h" #include "clang/Basic/CharInfo.h" #include "clang/Basic/TargetInfo.h" -#include "clang/Basic/TokenKinds.h" #include "clang/Parse/ParseDiagnostic.h" #include "clang/Parse/Parser.h" #include "clang/Parse/RAIIObjectsForParser.h" diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index 09215b8303ecf9..9a8c9e3497de9d 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -923,16 +923,9 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs, /*IsInstanceMethod=*/std::nullopt, /*ReturnType=*/nullptr); } - - Sema::ParserCompletionContext PCC; - if (CurParsedObjCImpl) { - PCC = Sema::PCC_ObjCImplementation; - } else if (PP.isIncrementalProcessingEnabled()) { - PCC = Sema::PCC_TopLevelOrExpression; - } else { - PCC = Sema::PCC_Namespace; - }; - Actions.CodeCompleteOrdinaryName(getCurScope(), PCC); + Actions.CodeCompleteOrdinaryName( + getCurScope(), + CurParsedObjCImpl ? Sema::PCC_ObjCImplementation : Sema::PCC_Namespace); return nullptr; case tok::kw_import: { Sema::ModuleImportState IS = Sema::ModuleImportState::NotACXX20Module; diff --git a/clang/lib/Sema/CodeCompleteConsumer.cpp b/clang/lib/Sema/CodeCompleteConsumer.cpp index 9caa1a8431e902..202417798712a9 100644 --- a/clang/lib/Sema/CodeCompleteConsumer.cpp +++ b/clang/lib/Sema/CodeCompleteConsumer.cpp @@ -51,7 +51,6 @@ bool CodeCompletionContext::wantConstructorResults() const { case CCC_ParenthesizedExpression: case CCC_Symbol: case CCC_SymbolOrNewName: - case CCC_TopLevelOrExpression: return true; case CCC_TopLevel: @@ -170,8 +169,6 @@ StringRef clang::getCompletionKindString(CodeCompletionContext::Kind Kind) { return "Recovery"; case CCKind::CCC_ObjCClassForwardDecl: return "ObjCClassForwardDecl"; - case CCKind::CCC_TopLevelOrExpression: - return "ReplTopLevel"; } llvm_unreachable("Invalid CodeCompletionContext::Kind!"); } diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 5440e16841ad8f..2a3de571c4c428 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -225,7 +225,6 @@ class ResultBuilder { case CodeCompletionContext::CCC_ObjCMessageReceiver: case CodeCompletionContext::CCC_ParenthesizedExpression: case CodeCompletionContext::CCC_Statement: - case CodeCompletionContext::CCC_TopLevelOrExpression: case CodeCompletionContext::CCC_Recovery: if (ObjCMethodDecl *Method = SemaRef.getCurMethodDecl()) if (Method->isInstanceMethod()) @@ -1851,7 +1850,6 @@ static void AddFunctionSpecifiers(Sema::ParserCompletionContext CCC, case Sema::PCC_ObjCInstanceVariableList: case Sema::PCC_Expression: case Sema::PCC_Statement: - case Sema::PCC_TopLevelOrExpression: case Sema::PCC_ForInit: case Sema::PCC_Condition: case Sema::PCC_RecoveryInFunction: @@ -1909,7 +1907,6 @@ static bool WantTypesInContext(Sema::ParserCompletionContext CCC, case Sema::PCC_Type: case Sema::PCC_ParenthesizedExpression: case Sema::PCC_LocalDeclarationSpecifiers: - case Sema::PCC_TopLevelOrExpression: return true; case Sema::PCC_Expression: @@ -2222,7 +2219,6 @@ static void AddOrdinaryNameResults(Sema::ParserCompletionContext CCC, Scope *S, break; case Sema::PCC_RecoveryInFunction: - case Sema::PCC_TopLevelOrExpression: case Sema::PCC_Statement: { if (SemaRef.getLangOpts().CPlusPlus11) AddUsingAliasResult(Builder, Results); @@ -4212,8 +4208,6 @@ mapCodeCompletionContext(Sema &S, Sema::ParserCompletionContext PCC) { case Sema::PCC_LocalDeclarationSpecifiers: return CodeCompletionContext::CCC_Type; - case Sema::PCC_TopLevelOrExpression: - return CodeCompletionContext::CCC_TopLevelOrExpression; } llvm_unreachable("Invalid ParserCompletionContext!"); @@ -4354,7 +4348,6 @@ void Sema::CodeCompleteOrdinaryName(Scope *S, break; case PCC_Statement: - case PCC_TopLevelOrExpression: case PCC_ParenthesizedExpression: case PCC_Expression: case PCC_ForInit: @@ -4392,7 +4385,6 @@ void Sema::CodeCompleteOrdinaryName(Scope *S, case PCC_ParenthesizedExpression: case PCC_Expression: case PCC_Statement: - case PCC_TopLevelOrExpression: case PCC_RecoveryInFunction: if (S->getFnParent()) AddPrettyFunctionResults(getLangOpts(), Results); diff --git a/clang/test/CodeCompletion/incrememal-mode-completion-no-error.cpp b/clang/test/CodeCompletion/incrememal-mode-completion-no-error.cpp deleted file mode 100644 index e6846f8087d98b..00000000000000 --- a/clang/test/CodeCompletion/incrememal-mode-completion-no-error.cpp +++ /dev/null @@ -1,3 +0,0 @@ -void foo( -// RUN: %clang_cc1 -fincremental-extensions -fsyntax-only -code-completion-at=%s:%(line-1):9 %s | wc -c | FileCheck %s -// CHECK: 0 diff --git a/clang/test/CodeCompletion/incremental-top-level.cpp b/clang/test/CodeCompletion/incremental-top-level.cpp deleted file mode 100644 index 11f8bd6948dcfe..00000000000000 --- a/clang/test/CodeCompletion/incremental-top-level.cpp +++ /dev/null @@ -1,4 +0,0 @@ -int foo = 10; -f -// RUN: %clang_cc1 -fincremental-extensions -fsyntax-only -code-completion-at=%s:%(line-1):1 %s | FileCheck %s -// CHECK: COMPLETION: foo : [#int#]foo diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp index 05fc115ddc4cc5..f46452d9e10d1a 100644 --- a/clang/tools/clang-repl/ClangRepl.cpp +++ b/clang/tools/clang-repl/ClangRepl.cpp @@ -13,9 +13,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendDiagnostic.h" -#include "clang/Interpreter/CodeCompletion.h" #include "clang/Interpreter/Interpreter.h" -#include "clang/Sema/CodeCompleteConsumer.h" #include "llvm/ExecutionEngine/Orc/LLJIT.h" #include "llvm/LineEditor/LineEditor.h" @@ -72,70 +70,6 @@ static int checkDiagErrors(const clang::CompilerInstance *CI, bool HasError) { return (Errs || HasError) ? EXIT_FAILURE : EXIT_SUCCESS; } -struct ReplListCompleter { - clang::IncrementalCompilerBuilder &CB; - clang::Interpreter &MainInterp; - ReplListCompleter(clang::IncrementalCompilerBuilder &CB, - clang::Interpreter &Interp) - : CB(CB), MainInterp(Interp){}; - - std::vector<llvm::LineEditor::Completion> operator()(llvm::StringRef Buffer, - size_t Pos) const; - std::vector<llvm::LineEditor::Completion> - operator()(llvm::StringRef Buffer, size_t Pos, llvm::Error &ErrRes) const; -}; - -std::vector<llvm::LineEditor::Completion> -ReplListCompleter::operator()(llvm::StringRef Buffer, size_t Pos) const { - auto Err = llvm::Error::success(); - auto res = (*this)(Buffer, Pos, Err); - if (Err) - llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: "); - return res; -} - -std::vector<llvm::LineEditor::Completion> -ReplListCompleter::operator()(llvm::StringRef Buffer, size_t Pos, - llvm::Error &ErrRes) const { - std::vector<llvm::LineEditor::Completion> Comps; - std::vector<clang::CodeCompletionResult> Results; - - auto CI = CB.CreateCpp(); - if (auto Err = CI.takeError()) { - ErrRes = std::move(Err); - return {}; - } - - size_t Lines = - std::count(Buffer.begin(), std::next(Buffer.begin(), Pos), '\n') + 1; - auto Interp = clang::Interpreter::create(std::move(*CI)); - - if (auto Err = Interp.takeError()) { - // log the error and returns an empty vector; - ErrRes = std::move(Err); - - return {}; - } - - codeComplete( - const_cast<clang::CompilerInstance *>((*Interp)->getCompilerInstance()), - Buffer, Lines, Pos + 1, MainInterp.getCompilerInstance(), Results); - - size_t space_pos = Buffer.rfind(" "); - llvm::StringRef s; - if (space_pos == llvm::StringRef::npos) { - s = Buffer; - } else { - s = Buffer.substr(space_pos + 1); - } - - for (auto c : convertToCodeCompleteStrings(Results)) { - if (c.find(s) == 0) - Comps.push_back(llvm::LineEditor::Completion(c.substr(s.size()), c)); - } - return Comps; -} - llvm::ExitOnError ExitOnErr; int main(int argc, const char **argv) { ExitOnErr.setBanner("clang-repl: "); @@ -199,7 +133,6 @@ int main(int argc, const char **argv) { DeviceCI->LoadRequestedPlugins(); std::unique_ptr<clang::Interpreter> Interp; - if (CudaEnabled) { Interp = ExitOnErr( clang::Interpreter::createWithCUDA(std::move(CI), std::move(DeviceCI))); @@ -222,8 +155,8 @@ int main(int argc, const char **argv) { if (OptInputs.empty()) { llvm::LineEditor LE("clang-repl"); + // FIXME: Add LE.setListCompleter std::string Input; - LE.setListCompleter(ReplListCompleter(CB, *Interp)); while (std::optional<std::string> Line = LE.readLine()) { llvm::StringRef L = *Line; L = L.trim(); @@ -235,10 +168,10 @@ int main(int argc, const char **argv) { } Input += L; + if (Input == R"(%quit)") { break; - } - if (Input == R"(%undo)") { + } else if (Input == R"(%undo)") { if (auto Err = Interp->Undo()) { llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: "); HasError = true; diff --git a/clang/tools/libclang/CIndexCodeCompletion.cpp b/clang/tools/libclang/CIndexCodeCompletion.cpp index 196c64e6172274..01bad3d6259128 100644 --- a/clang/tools/libclang/CIndexCodeCompletion.cpp +++ b/clang/tools/libclang/CIndexCodeCompletion.cpp @@ -11,8 +11,8 @@ // //===----------------------------------------------------------------------===// -#include "CIndexDiagnostic.h" #include "CIndexer.h" +#include "CIndexDiagnostic.h" #include "CLog.h" #include "CXCursor.h" #include "CXSourceLocation.h" @@ -25,7 +25,6 @@ #include "clang/Basic/SourceManager.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CompilerInstance.h" -#include "clang/Frontend/FrontendActions.h" #include "clang/Sema/CodeCompleteConsumer.h" #include "clang/Sema/Sema.h" #include "llvm/ADT/SmallString.h" @@ -42,6 +41,7 @@ #include <cstdlib> #include <string> + #ifdef UDP_CODE_COMPLETION_LOGGER #include "clang/Basic/Version.h" #include <arpa/inet.h> @@ -543,7 +543,6 @@ static unsigned long long getContextsForContextKind( case CodeCompletionContext::CCC_PreprocessorExpression: case CodeCompletionContext::CCC_PreprocessorDirective: case CodeCompletionContext::CCC_Attribute: - case CodeCompletionContext::CCC_TopLevelOrExpression: case CodeCompletionContext::CCC_TypeQualifiers: { //Only Clang results should be accepted, so we'll set all of the other //context bits to 0 (i.e. the empty set) diff --git a/clang/unittests/Interpreter/CMakeLists.txt b/clang/unittests/Interpreter/CMakeLists.txt index 712641afb976dd..698494b9897f57 100644 --- a/clang/unittests/Interpreter/CMakeLists.txt +++ b/clang/unittests/Interpreter/CMakeLists.txt @@ -9,7 +9,6 @@ set(LLVM_LINK_COMPONENTS add_clang_unittest(ClangReplInterpreterTests IncrementalProcessingTest.cpp InterpreterTest.cpp - CodeCompletionTest.cpp ) target_link_libraries(ClangReplInterpreterTests PUBLIC clangAST diff --git a/clang/unittests/Interpreter/CodeCompletionTest.cpp b/clang/unittests/Interpreter/CodeCompletionTest.cpp deleted file mode 100644 index c7434ae1503c71..00000000000000 --- a/clang/unittests/Interpreter/CodeCompletionTest.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "clang/Interpreter/CodeCompletion.h" -#include "clang/Frontend/CompilerInstance.h" -#include "clang/Interpreter/Interpreter.h" -#include "clang/Sema/CodeCompleteConsumer.h" -#include "llvm/LineEditor/LineEditor.h" -#include "llvm/Support/Error.h" -#include "llvm/Support/raw_ostream.h" - -#include "gmock/gmock.h" -#include "gtest/gtest.h" - -using namespace clang; -namespace { -auto CB = clang::IncrementalCompilerBuilder(); - -static std::unique_ptr<Interpreter> createInterpreter() { - auto CI = cantFail(CB.CreateCpp()); - return cantFail(clang::Interpreter::create(std::move(CI))); -} - -static std::vector<std::string> runComp(clang::Interpreter &MainInterp, - llvm::StringRef Prefix, - llvm::Error &ErrR) { - auto CI = CB.CreateCpp(); - if (auto Err = CI.takeError()) { - ErrR = std::move(Err); - return {}; - } - - auto Interp = clang::Interpreter::create(std::move(*CI)); - if (auto Err = Interp.takeError()) { - // log the error and returns an empty vector; - ErrR = std::move(Err); - - return {}; - } - - std::vector<clang::CodeCompletionResult> Results; - - codeComplete( - const_cast<clang::CompilerInstance *>((*Interp)->getCompilerInstance()), - Prefix, 1, Prefix.size(), MainInterp.getCompilerInstance(), Results); - - std::vector<std::string> Comps; - for (auto c : convertToCodeCompleteStrings(Results)) { - if (c.find(Prefix) == 0) - Comps.push_back(c.substr(Prefix.size())); - } - - return Comps; -} - -TEST(CodeCompletionTest, Sanity) { - auto Interp = createInterpreter(); - if (auto R = Interp->ParseAndExecute("int foo = 12;")) { - consumeError(std::move(R)); - return; - } - auto Err = llvm::Error::success(); - auto comps = runComp(*Interp, "f", Err); - EXPECT_EQ((size_t)2, comps.size()); // foo and float - EXPECT_EQ(comps[0], std::string("oo")); - EXPECT_EQ((bool)Err, false); -} - -TEST(CodeCompletionTest, SanityNoneValid) { - auto Interp = createInterpreter(); - if (auto R = Interp->ParseAndExecute("int foo = 12;")) { - consumeError(std::move(R)); - return; - } - auto Err = llvm::Error::success(); - auto comps = runComp(*Interp, "babanana", Err); - EXPECT_EQ((size_t)0, comps.size()); // foo and float - EXPECT_EQ((bool)Err, false); -} - -TEST(CodeCompletionTest, TwoDecls) { - auto Interp = createInterpreter(); - if (auto R = Interp->ParseAndExecute("int application = 12;")) { - consumeError(std::move(R)); - return; - } - if (auto R = Interp->ParseAndExecute("int apple = 12;")) { - consumeError(std::move(R)); - return; - } - auto Err = llvm::Error::success(); - auto comps = runComp(*Interp, "app", Err); - EXPECT_EQ((size_t)2, comps.size()); - EXPECT_EQ((bool)Err, false); -} - -TEST(CodeCompletionTest, CompFunDeclsNoError) { - auto Interp = createInterpreter(); - auto Err = llvm::Error::success(); - auto comps = runComp(*Interp, "void app(", Err); - EXPECT_EQ((bool)Err, false); -} - -} // anonymous namespace _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits