[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-12-07 Thread Eric Liu via Phabricator via cfe-commits
ioeric updated this revision to Diff 125928.
ioeric added a comment.

- More cleanups and merged with https://reviews.llvm.org/D40897


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D40548

Files:
  clangd/CMakeLists.txt
  clangd/ClangdIndex.cpp
  clangd/ClangdIndex.h
  clangd/ClangdLSPServer.cpp
  clangd/ClangdLSPServer.h
  clangd/ClangdServer.cpp
  clangd/ClangdServer.h
  clangd/ClangdUnit.cpp
  clangd/ClangdUnit.h
  clangd/ClangdUnitStore.cpp
  clangd/ClangdUnitStore.h
  clangd/CodeComplete.cpp
  clangd/CodeComplete.h
  clangd/Symbol.cpp
  clangd/Symbol.h
  clangd/SymbolCompletionInfo.cpp
  clangd/SymbolCompletionInfo.h
  clangd/SymbolIndex.h
  clangd/tool/ClangdMain.cpp

Index: clangd/tool/ClangdMain.cpp
===
--- clangd/tool/ClangdMain.cpp
+++ clangd/tool/ClangdMain.cpp
@@ -90,6 +90,15 @@
 "Trace internal events and timestamps in chrome://tracing JSON format"),
 llvm::cl::init(""), llvm::cl::Hidden);
 
+static llvm::cl::opt EnableIndexBasedCompletion(
+"enable-index-based-completion",
+llvm::cl::desc(
+"Enable index-based global code completion (experimental). Clangd will "
+"use symbols built from ASTs of opened files and additional indexes "
+"(e.g. offline built codebase-wide symbol table) to complete partial "
+"symbols."),
+llvm::cl::init(false));
+
 int main(int argc, char *argv[]) {
   llvm::cl::ParseCommandLineOptions(argc, argv, "clangd");
 
@@ -170,10 +179,14 @@
   clangd::CodeCompleteOptions CCOpts;
   CCOpts.EnableSnippets = EnableSnippets;
   CCOpts.IncludeIneligibleResults = IncludeIneligibleResults;
+  if (EnableIndexBasedCompletion)
+// Disable sema code completion for qualified code completion and use global
+// symbol index instead.
+CCOpts.IncludeGlobals = false;
   // Initialize and run ClangdLSPServer.
   ClangdLSPServer LSPServer(Out, WorkerThreadsCount, StorePreamblesInMemory,
-CCOpts, ResourceDirRef,
-CompileCommandsDirPath);
+CCOpts, ResourceDirRef, CompileCommandsDirPath,
+EnableIndexBasedCompletion, {});
   constexpr int NoShutdownRequestErrorCode = 1;
   llvm::set_thread_name("clangd.main");
   return LSPServer.run(std::cin) ? 0 : NoShutdownRequestErrorCode;
Index: clangd/SymbolIndex.h
===
--- /dev/null
+++ clangd/SymbolIndex.h
@@ -0,0 +1,60 @@
+//===--- CompletionIndex.h - Index for code completion ---*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SYMBOLINDEX_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SYMBOLINDEX_H
+
+#include "SymbolCompletionInfo.h"
+#include "llvm/Support/Error.h"
+
+namespace clang {
+namespace clangd {
+
+struct CompletionRequest {
+  std::string Query;
+  size_t MaxCandidateCount = UINT_MAX;
+};
+
+/// \brief Signals for scoring completion candidates.
+struct ScoreSignals {
+  // FIXME: add score signals like cross-reference count.
+};
+
+struct CompletionSymbol {
+  ScoreSignals Signals;
+  float SymbolScore;
+
+  std::string USR;
+  index::SymbolKind Kind;
+  std::string QualifiedName;
+
+  SymbolCompletionInfo CompletionInfo;
+};
+
+struct CompletionResult {
+  std::vector Symbols;
+  bool AllMatched;
+};
+
+class SymbolIndex {
+public:
+  virtual ~SymbolIndex() = default;
+
+  virtual llvm::Expected
+  complete(const CompletionRequest ) const = 0;
+
+  // FIXME: add interfaces for more index use cases:
+  //  - Symbol getSymbolInfo(llvm::StringRef USR);
+  //  - getAllOccurrences(llvm::StringRef USR);
+};
+
+} // namespace clangd
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_SYMBOLINDEX_H
Index: clangd/SymbolCompletionInfo.h
===
--- /dev/null
+++ clangd/SymbolCompletionInfo.h
@@ -0,0 +1,31 @@
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_SYMBOLCOMPLETIONINFO_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_SYMBOLCOMPLETIONINFO_H
+
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Decl.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Index/IndexSymbol.h"
+#include "clang/Lex/Preprocessor.h"
+
+namespace clang {
+namespace clangd {
+
+struct SymbolCompletionInfo {
+  static SymbolCompletionInfo create(ASTContext , Preprocessor ,
+ const NamedDecl *ND);
+
+  SymbolCompletionInfo() = default;
+  /// Label that can be be displayed in the completion list.
+  std::string Label;
+  /// Symbol annotation and/or comment for the symbol declaration.
+  std::string Documentation;
+  /// Detail about the symbol like result type.
+  std::string 

[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-12-06 Thread Eric Liu via Phabricator via cfe-commits
ioeric added a comment.

Hi Marc, the patch is not ready for review yet. I am still cleaning up the 
prototype and will let you know when it's ready for review.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D40548



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-12-04 Thread Marc-Andre Laperle via Phabricator via cfe-commits
malaperle added a comment.

Sorry for the delay, I'm looking into this now. I actually don't query (or even 
store!) any symbol names in the index interface now, only Occurrences queried 
by USR which is enough for findReferences and findDefinitions. It looks like 
storing names is the main part in this patch. So our two interfaces have almost 
no overlap :) But as I want to implement "Open Workspace Symbol" soon, I'll try 
to add symbol names too and see how it everything fits and make proposals.

Here's how the index "provider" interface looks like now:

  class ClangdIndexDataOccurrence {
  public:
enum class OccurrenceType {
   OCCURRENCE,
   DEFINITION_OCCURRENCE
 };
  
virtual OccurrenceType getKind() const = 0;
virtual std::string getPath() = 0;
virtual uint32_t getStartOffset(SourceManager ) = 0;
virtual uint32_t getEndOffset(SourceManager ) = 0;
  };
  
  ///An occurrence that also has definition with a body that requires additional
  ///locations to keep track of the beginning and end of the body.
  class ClangdIndexDataDefinitionOccurrence : public ClangdIndexDataOccurrence {
virtual uint32_t getDefStartOffset(SourceManager ) = 0;
virtual uint32_t getDefEndOffset(SourceManager ) = 0;
  };
  
  class ClangdIndexDataProvider {
virtual void foreachOccurrence(const USR& Usr, index::SymbolRoleSet Roles, 
llvm::function_ref Receiver) = 0;
  
// Those are mainly for debug for now. They dump information about file
//dependencies.
virtual void dumpIncludedBy(StringRef File) {}
virtual void dumpInclusions(StringRef File) {}
  };

https://github.com/MarkZ3/clang-tools-extra/blob/IndexFunctionsPrototype/clangd/index/ClangdIndexDataProvider.h

I've successfully implemented this interface with both ClangdIndexDataStorage 
(the storage solution I worked on) and libIndexStore (patch 
https://reviews.llvm.org/D39050, see also 
https://github.com/MarkZ3/clang-tools-extra/tree/IndexWithLibIndexStore, 
WARNING: proof of concept code only)




Comment at: clangd/ASTIndex.h:51
+  llvm::Expected
+  getAllOccurrences(llvm::StringRef UID) const override {
+// FIXME(ioeric): implement this.

UID == usr?


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D40548



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-11-29 Thread Eric Liu via Phabricator via cfe-commits
ioeric updated this revision to Diff 124745.
ioeric added a comment.
Herald added a subscriber: klimek.

Merged with origin/master


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D40548

Files:
  clangd/ASTIndex.cpp
  clangd/ASTIndex.h
  clangd/CMakeLists.txt
  clangd/ClangdIndex.cpp
  clangd/ClangdIndex.h
  clangd/ClangdLSPServer.cpp
  clangd/ClangdLSPServer.h
  clangd/ClangdServer.cpp
  clangd/ClangdServer.h
  clangd/ClangdUnit.cpp
  clangd/ClangdUnit.h
  clangd/ClangdUnitStore.cpp
  clangd/ClangdUnitStore.h
  clangd/SymbolIndex.h
  clangd/tool/ClangdMain.cpp

Index: clangd/tool/ClangdMain.cpp
===
--- clangd/tool/ClangdMain.cpp
+++ clangd/tool/ClangdMain.cpp
@@ -172,8 +172,7 @@
   CCOpts.IncludeIneligibleResults = IncludeIneligibleResults;
   // Initialize and run ClangdLSPServer.
   ClangdLSPServer LSPServer(Out, WorkerThreadsCount, StorePreamblesInMemory,
-CCOpts, ResourceDirRef,
-CompileCommandsDirPath);
+CCOpts, ResourceDirRef, CompileCommandsDirPath, {});
   constexpr int NoShutdownRequestErrorCode = 1;
   llvm::set_thread_name("clangd.main");
   return LSPServer.run(std::cin) ? 0 : NoShutdownRequestErrorCode;
Index: clangd/SymbolIndex.h
===
--- /dev/null
+++ clangd/SymbolIndex.h
@@ -0,0 +1,57 @@
+//===--- CompletionIndex.h - Index for code completion ---*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPLETIONINDEX_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPLETIONINDEX_H
+
+#include "llvm/Support/Error.h"
+
+namespace clang {
+namespace clangd {
+
+struct CompletionRequest {
+  std::string Query;
+  std::vector FixedPrefixes;
+};
+
+struct ScoreSignals {
+  float fuzzy_score;
+};
+
+struct CompletionSymbol {
+  ScoreSignals Signals;
+
+  std::string UID;
+  std::string QualifiedName;
+};
+
+struct CompletionResult {
+  //std::vector Symbol;
+  std::vector Symbols;
+  bool all_matched;
+};
+
+class SymbolIndex {
+public:
+  virtual ~SymbolIndex() = default;
+
+  virtual llvm::Expected
+  complete(const CompletionRequest ) const = 0;
+
+  virtual llvm::Expected
+  getSymbolInfo(llvm::StringRef UID) const = 0;
+
+  virtual llvm::Expected
+  getAllOccurrences(llvm::StringRef UID) const = 0;
+};
+
+} // namespace clangd
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPLETIONINDEX_H
Index: clangd/ClangdUnitStore.h
===
--- clangd/ClangdUnitStore.h
+++ clangd/ClangdUnitStore.h
@@ -12,6 +12,7 @@
 
 #include 
 
+#include "ASTIndex.h"
 #include "ClangdUnit.h"
 #include "GlobalCompilationDatabase.h"
 #include "Path.h"
@@ -25,11 +26,14 @@
 /// Thread-safe mapping from FileNames to CppFile.
 class CppFileCollection {
 public:
+  explicit CppFileCollection(ASTIndexSourcer *IndexSourcer)
+  : IndexSourcer(IndexSourcer) {}
+
   std::shared_ptr
   getOrCreateFile(PathRef File, PathRef ResourceDir,
   GlobalCompilationDatabase , bool StorePreamblesInMemory,
   std::shared_ptr PCHs,
-  clangd::Logger ) {
+  clangd::Logger , ASTIndexSourcer *IndexSourcer) {
 std::lock_guard Lock(Mutex);
 
 auto It = OpenedFiles.find(File);
@@ -39,7 +43,8 @@
   It = OpenedFiles
.try_emplace(File, CppFile::Create(File, std::move(Command),
   StorePreamblesInMemory,
-  std::move(PCHs), Logger))
+  std::move(PCHs), Logger,
+  IndexSourcer))
.first;
 }
 return It->second;
@@ -86,6 +91,7 @@
 
   std::mutex Mutex;
   llvm::StringMap OpenedFiles;
+  ASTIndexSourcer *IndexSourcer;
 };
 } // namespace clangd
 } // namespace clang
Index: clangd/ClangdUnitStore.cpp
===
--- clangd/ClangdUnitStore.cpp
+++ clangd/ClangdUnitStore.cpp
@@ -23,6 +23,7 @@
 
   std::shared_ptr Result = It->second;
   OpenedFiles.erase(It);
+  IndexSourcer->remove(File);
   return Result;
 }
 
@@ -42,14 +43,15 @@
 It = OpenedFiles
  .try_emplace(File, CppFile::Create(File, std::move(NewCommand),
 StorePreamblesInMemory,
-std::move(PCHs), Logger))
+std::move(PCHs), Logger,
+

[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-11-28 Thread Eric Liu via Phabricator via cfe-commits
ioeric added a comment.

In https://reviews.llvm.org/D40548#937626, @malaperle wrote:

> Hi Eric! As you might know I'm working on persisted indexing. I was wondering 
> which cases needed the index for code completion? Could you give a small 
> example? I thought the AST alone would be sufficient for that. I'll look at 
> this patch more closely a bit later but I can look at what needs to be added 
> in the persisted index interface/data.
>
> If you'd like to see the work in progress, it's here:
>  https://github.com/MarkZ3/clang-tools-extra/blob/IndexFunctionsPrototype
>  
> https://github.com/MarkZ3/clang-tools-extra/blob/IndexFunctionsPrototype/clangd/index/README


Hi Marc! Yes, I was aware of your work. I wanted to upload the prototype early 
on to get discussions started, especially to get alignment with your work on 
work space index.

As Ilya said, we would like clangd to support global code completion and other 
LSP features based on global index (i.e. all symbols in the code base). For 
example, for code completion on scope specifiers "nx::ny::", we want to be able 
to complete "nx::ny::X" even if the symbol is not in the AST yet. However, it 
might not always be feasible to rely on clangd to generate index for a huge 
code base, so we want to be able to support plugging in additional index 
sources. The index can be from opened files in clangd, all files in the project 
(e.g. clangd/ directory), or all files in a huge code base. IIUC, the 
persistent index you are working on would fall into the project index bucket?

This patch tries to define interfaces for all indexes and how they would be 
used/merged in clangd, and we would really like your feedback on it. The code 
completion and AST index changes in the patch are mostly for experimenting with 
the interfaces.


https://reviews.llvm.org/D40548



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-11-28 Thread Ilya Biryukov via Phabricator via cfe-commits
ilya-biryukov added a comment.

In https://reviews.llvm.org/D40548#937626, @malaperle wrote:

> Hi Eric! As you might know I'm working on persisted indexing. I was wondering 
> which cases needed the index for code completion? Could you give a small 
> example? I thought the AST alone would be sufficient for that. I'll look at 
> this patch more closely a bit later but I can look at what needs to be added 
> in the persisted index interface/data.


Just wanted to chime in to give my perspective on some of the work that's being 
done here.

The index would allow to implement a project-wide completion (e.g., even if you 
don't `#include "llvm/ADT/DenseMap.h"`, you'll get completion for `DenseMap` 
and the #include will be added automatically upon completing an item). 
This is not aiming  trying to have persistent indexes, instead trying to figure 
out how the right interfaces and plug things into `ClangdServer` properly, so 
that we can later play around with different implementations of the indexes. 
(I.e., we'll probably have our internal implementation at Google at some point).

I guess the main thing right now would be to align on how the `SymbolIndex` 
interface should look like.




Comment at: clangd/ClangdLSPServer.h:37
+  llvm::Optional CompileCommandsDir,
+  std::vector<
+  std::pair>

Maybe pass a parameter of type `SymbolIndex&` instead of a vector, which is 
used to create `CombinedSymbolIndex` later?
It seems that `ClangdServer` does not really care about the specific index 
implementation that's used (nor should it!)

We could have helper methods to conveniently create `CombinedSymbolIndex` from 
a list of indexes, or even create the default index for clangd. 


https://reviews.llvm.org/D40548



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-11-28 Thread Marc-Andre Laperle via Phabricator via cfe-commits
malaperle added a comment.

Hi Eric! As you might know I'm working on persisted indexing. I was wondering 
which cases needed the index for code completion? Could you give a small 
example? I thought the AST alone would be sufficient for that. I'll look at 
this patch more closely a bit later but I can look at what needs to be added in 
the persisted index interface/data.

If you'd like to see the work in progress, it's here:
https://github.com/MarkZ3/clang-tools-extra/blob/IndexFunctionsPrototype
https://github.com/MarkZ3/clang-tools-extra/blob/IndexFunctionsPrototype/clangd/index/README


https://reviews.llvm.org/D40548



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D40548: [clangd] Prototyping index support and naive index-based global code completion. WIP

2017-11-28 Thread Eric Liu via Phabricator via cfe-commits
ioeric created this revision.
Herald added subscribers: ilya-biryukov, mgorny.

o Experimental interfaces to support use multiple index sources (e.g. AST index,
global index) for code completion, cross-reference finding etc.
o Replace sema code completion for qualified-id with index-based completion.


https://reviews.llvm.org/D40548

Files:
  clangd/ASTIndex.cpp
  clangd/ASTIndex.h
  clangd/CMakeLists.txt
  clangd/ClangdIndex.cpp
  clangd/ClangdIndex.h
  clangd/ClangdLSPServer.cpp
  clangd/ClangdLSPServer.h
  clangd/ClangdServer.cpp
  clangd/ClangdServer.h
  clangd/ClangdUnit.cpp
  clangd/ClangdUnit.h
  clangd/ClangdUnitStore.cpp
  clangd/ClangdUnitStore.h
  clangd/SymbolIndex.h
  clangd/tool/ClangdMain.cpp

Index: clangd/tool/ClangdMain.cpp
===
--- clangd/tool/ClangdMain.cpp
+++ clangd/tool/ClangdMain.cpp
@@ -160,7 +160,7 @@
   // Initialize and run ClangdLSPServer.
   ClangdLSPServer LSPServer(Out, WorkerThreadsCount, StorePreamblesInMemory,
 EnableSnippets, ResourceDirRef,
-CompileCommandsDirPath);
+CompileCommandsDirPath, {});
   constexpr int NoShutdownRequestErrorCode = 1;
   llvm::set_thread_name("clangd.main");
   return LSPServer.run(std::cin) ? 0 : NoShutdownRequestErrorCode;
Index: clangd/SymbolIndex.h
===
--- /dev/null
+++ clangd/SymbolIndex.h
@@ -0,0 +1,57 @@
+//===--- CompletionIndex.h - Index for code completion ---*- C++-*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===--===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPLETIONINDEX_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPLETIONINDEX_H
+
+#include "llvm/Support/Error.h"
+
+namespace clang {
+namespace clangd {
+
+struct CompletionRequest {
+  std::string Query;
+  std::vector FixedPrefixes;
+};
+
+struct ScoreSignals {
+  float fuzzy_score;
+};
+
+struct CompletionSymbol {
+  ScoreSignals Signals;
+
+  std::string UID;
+  std::string QualifiedName;
+};
+
+struct CompletionResult {
+  //std::vector Symbol;
+  std::vector Symbols;
+  bool all_matched;
+};
+
+class SymbolIndex {
+public:
+  virtual ~SymbolIndex() = default;
+
+  virtual llvm::Expected
+  complete(const CompletionRequest ) const = 0;
+
+  virtual llvm::Expected
+  getSymbolInfo(llvm::StringRef UID) const = 0;
+
+  virtual llvm::Expected
+  getAllOccurrences(llvm::StringRef UID) const = 0;
+};
+
+} // namespace clangd
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_COMPLETIONINDEX_H
Index: clangd/ClangdUnitStore.h
===
--- clangd/ClangdUnitStore.h
+++ clangd/ClangdUnitStore.h
@@ -12,6 +12,7 @@
 
 #include 
 
+#include "ASTIndex.h"
 #include "ClangdUnit.h"
 #include "GlobalCompilationDatabase.h"
 #include "Path.h"
@@ -25,11 +26,14 @@
 /// Thread-safe mapping from FileNames to CppFile.
 class CppFileCollection {
 public:
+  explicit CppFileCollection(ASTIndexSourcer *IndexSourcer)
+  : IndexSourcer(IndexSourcer) {}
+
   std::shared_ptr
   getOrCreateFile(PathRef File, PathRef ResourceDir,
   GlobalCompilationDatabase , bool StorePreamblesInMemory,
   std::shared_ptr PCHs,
-  clangd::Logger ) {
+  clangd::Logger , ASTIndexSourcer *IndexSourcer) {
 std::lock_guard Lock(Mutex);
 
 auto It = OpenedFiles.find(File);
@@ -39,7 +43,8 @@
   It = OpenedFiles
.try_emplace(File, CppFile::Create(File, std::move(Command),
   StorePreamblesInMemory,
-  std::move(PCHs), Logger))
+  std::move(PCHs), Logger,
+  IndexSourcer))
.first;
 }
 return It->second;
@@ -86,6 +91,7 @@
 
   std::mutex Mutex;
   llvm::StringMap OpenedFiles;
+  ASTIndexSourcer *IndexSourcer;
 };
 } // namespace clangd
 } // namespace clang
Index: clangd/ClangdUnitStore.cpp
===
--- clangd/ClangdUnitStore.cpp
+++ clangd/ClangdUnitStore.cpp
@@ -23,6 +23,7 @@
 
   std::shared_ptr Result = It->second;
   OpenedFiles.erase(It);
+  IndexSourcer->remove(File);
   return Result;
 }
 
@@ -42,14 +43,15 @@
 It = OpenedFiles
  .try_emplace(File, CppFile::Create(File, std::move(NewCommand),
 StorePreamblesInMemory,
-std::move(PCHs), Logger))
+std::move(PCHs), Logger,
+