std::thread HotReloadThread([&Index, &Status, &FS]() {
llvm::vfs::Status LastStatus = *Status;
- static constexpr auto RefreshFrequency = std::chrono::seconds(90);
+ static constexpr auto RefreshFrequency = std::chrono::seconds(30);
while (!clang::clangd::shutdownRequested()) {
hotReload(*Index, llvm::StringRef(IndexPath), LastStatus, FS);
std::this_thread::sleep_for(RefreshFrequency);
set(CLANGD_TEST_DEPS
clangd
ClangdTests
- # No tests for these, but we should still make sure they build.
clangd-indexer
+ # No tests for it, but we should still make sure they build.
dexp
)
lit.llvm.initialize(lit_config, config)
lit.llvm.llvm_config.use_clang()
+lit.llvm.llvm_config.use_default_substitutions()
config.name = 'Clangd'
config.suffixes = ['.test']
if config.clangd_build_xpc:
config.available_features.add('clangd-xpc-support')
+
+if config.clangd_enable_remote:
+ config.available_features.add('clangd-remote-index')
config.llvm_libs_dir = "@LLVM_LIBS_DIR@"
config.target_triple = "@TARGET_TRIPLE@"
config.host_triple = "@LLVM_HOST_TRIPLE@"
+config.python_executable = "@Python3_EXECUTABLE@"
# Support substitution of the tools and libs dirs with user parameters. This is
# used when we can't determine the tool dir at configuration time.
config.clangd_source_dir = "@CMAKE_CURRENT_SOURCE_DIR@/.."
config.clangd_binary_dir = "@CMAKE_CURRENT_BINARY_DIR@/.."
config.clangd_build_xpc = @CLANGD_BUILD_XPC@
+config.clangd_enable_remote = @CLANGD_ENABLE_REMOTE@
# Delegate logic to lit.cfg.py.
lit_config.load_config(config, "@CMAKE_CURRENT_SOURCE_DIR@/lit.cfg.py")
--- /dev/null
+namespace clang {
+namespace clangd {
+namespace remote {
+int getFoo(bool Argument);
+char Character;
+} // namespace remote
+} // namespace clangd
+} // namespace clang
+
+namespace llvm {} // namespace llvm
--- /dev/null
+#include "Header.h"
+
+namespace {} // namespace
--- /dev/null
+# RUN: rm -rf %t
+# RUN: clangd-indexer %S/Inputs/Source.cpp > %t.idx
+# RUN: %python %S/pipeline_helper.py --input-file-name=%s --project-root=%S --index-file=%t.idx | FileCheck %s
+# REQUIRES: clangd-remote-index
+
+{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
+# CHECK: "id": 0,
+# CHECK-NEXT: "jsonrpc": "2.0",
+---
+{"jsonrpc":"2.0","id":1,"method":"workspace/symbol","params":{"query":"Character"}}
+# CHECK: "id": 1,
+# CHECK-NEXT: "jsonrpc": "2.0",
+# CHECK-NEXT: "result": [
+# CHECK-NEXT: {
+# CHECK-NEXT: "containerName": "clang::clangd::remote",
+# CHECK-NEXT: "kind": 13,
+# CHECK-NEXT: "location": {
+# CHECK-NEXT: "range": {
+# CHECK-NEXT: "end": {
+# CHECK-NEXT: "character": {{.*}},
+# CHECK-NEXT: "line": {{.*}}
+# CHECK-NEXT: },
+# CHECK-NEXT: "start": {
+# CHECK-NEXT: "character": {{.*}},
+# CHECK-NEXT: "line": {{.*}}
+# CHECK-NEXT: }
+# CHECK-NEXT: },
+# CHECK-NEXT: "uri": "file://{{.*}}/Header.h"
+# CHECK-NEXT: },
+# CHECK-NEXT: "name": "Character",
+# CHECK-NEXT: "score": {{.*}}
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+# CHECK-NEXT:}
+---
+{"jsonrpc":"2.0","id":4,"method":"shutdown"}
+---
+{"jsonrpc":"2.0","method":"exit"}
+---
--- /dev/null
+#!/usr/bin/env python
+#
+#===- pipeline_helper.py - Remote Index pipeline Helper *- python -------*--===#
+#
+# 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
+#
+#===------------------------------------------------------------------------===#
+
+import argparse
+import os
+import subprocess
+from socket import socket
+import sys
+import time
+import signal
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--input-file-name', required=True)
+ parser.add_argument('--project-root', required=True)
+ parser.add_argument('--index-file', required=True)
+
+ args = parser.parse_args()
+
+ # Grab an available port.
+ with socket() as s:
+ s.bind(('localhost', 0))
+ server_address = 'localhost:' + str(s.getsockname()[1])
+
+ index_server_process = subprocess.Popen([
+ 'clangd-index-server', '--server-address=' + server_address,
+ args.index_file, args.project_root
+ ],
+ stderr=subprocess.PIPE)
+
+ # Wait for the server to warm-up.
+ time.sleep(4)
+ found_init_message = False
+ for line in index_server_process.stderr:
+ if b'Server listening' in line:
+ found_init_message = True
+ break
+
+ if not found_init_message:
+ sys.exit(1)
+
+ in_file = open(args.input_file_name)
+
+ clangd_process = subprocess.Popen([
+ 'clangd', '--remote-index-address=' + server_address,
+ '--project-root=' + args.project_root, '--lit-test', '--sync'
+ ],
+ stdin=in_file)
+
+ clangd_process.wait()
+ os.kill(index_server_process.pid, signal.SIGINT)
+
+
+if __name__ == '__main__':
+ main()