[clang] f94a937 - Revert "[clang-repl] support code completion at a REPL."

Vassil Vassilev via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 23 07:46:26 PDT 2023


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


        


More information about the cfe-commits mailing list