diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp index 449ac9e3a85bda..c5238e426d6923 100644 --- a/clang-tools-extra/clangd/ClangdLSPServer.cpp +++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -466,32 +466,6 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, if (Server) return Reply(llvm::make_error("server already initialized", ErrorCode::InvalidRequest)); - if (Opts.UseDirBasedCDB) { - DirectoryBasedGlobalCompilationDatabase::Options CDBOpts(TFS); - if (const auto &Dir = Params.initializationOptions.compilationDatabasePath) - CDBOpts.CompileCommandsDir = Dir; - CDBOpts.ContextProvider = Opts.ContextProvider; - BaseCDB = - std::make_unique(CDBOpts); - BaseCDB = getQueryDriverDatabase(llvm::makeArrayRef(Opts.QueryDriverGlobs), - std::move(BaseCDB)); - } - auto Mangler = CommandMangler::detect(); - if (Opts.ResourceDir) - Mangler.ResourceDir = *Opts.ResourceDir; - CDB.emplace(BaseCDB.get(), Params.initializationOptions.fallbackFlags, - tooling::ArgumentsAdjuster(std::move(Mangler))); - { - // Switch caller's context with LSPServer's background context. Since we - // rather want to propagate information from LSPServer's context into the - // Server, CDB, etc. - WithContext MainContext(BackgroundContext.clone()); - llvm::Optional WithOffsetEncoding; - if (Opts.Encoding) - WithOffsetEncoding.emplace(kCurrentOffsetEncoding, *Opts.Encoding); - Server.emplace(*CDB, TFS, Opts, - static_cast(this)); - } Opts.CodeComplete.EnableSnippets = Params.capabilities.CompletionSnippets; Opts.CodeComplete.IncludeFixIts = Params.capabilities.CompletionFixes; @@ -521,6 +495,33 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, BackgroundIndexSkipCreate = Params.capabilities.ImplicitProgressCreation; Opts.ImplicitCancellation = !Params.capabilities.CancelsStaleRequests; + if (Opts.UseDirBasedCDB) { + DirectoryBasedGlobalCompilationDatabase::Options CDBOpts(TFS); + if (const auto &Dir = Params.initializationOptions.compilationDatabasePath) + CDBOpts.CompileCommandsDir = Dir; + CDBOpts.ContextProvider = Opts.ContextProvider; + BaseCDB = + std::make_unique(CDBOpts); + BaseCDB = getQueryDriverDatabase(llvm::makeArrayRef(Opts.QueryDriverGlobs), + std::move(BaseCDB)); + } + auto Mangler = CommandMangler::detect(); + if (Opts.ResourceDir) + Mangler.ResourceDir = *Opts.ResourceDir; + CDB.emplace(BaseCDB.get(), Params.initializationOptions.fallbackFlags, + tooling::ArgumentsAdjuster(std::move(Mangler))); + { + // Switch caller's context with LSPServer's background context. Since we + // rather want to propagate information from LSPServer's context into the + // Server, CDB, etc. + WithContext MainContext(BackgroundContext.clone()); + llvm::Optional WithOffsetEncoding; + if (Opts.Encoding) + WithOffsetEncoding.emplace(kCurrentOffsetEncoding, *Opts.Encoding); + Server.emplace(*CDB, TFS, Opts, + static_cast(this)); + } + llvm::json::Object ServerCaps{ {"textDocumentSync", llvm::json::Object{ diff --git a/clang-tools-extra/clangd/test/folding-range.test b/clang-tools-extra/clangd/test/folding-range.test new file mode 100644 index 00000000000000..758980d2061d23 --- /dev/null +++ b/clang-tools-extra/clangd/test/folding-range.test @@ -0,0 +1,24 @@ +# RUN: clangd -lit-test < %s | FileCheck -strict-whitespace %s +void f() { + +} +--- +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{"textDocument": {"foldingRange": {"lineFoldingOnly": true}}},"trace":"off"}} +--- +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"cpp","text":"void f() {\n\n}\n","uri":"test:///foo.cpp","version":1}}} +--- +{"id":1,"jsonrpc":"2.0","method":"textDocument/foldingRange","params":{"textDocument":{"uri":"test:///foo.cpp"}}} +# CHECK: "id": 1, +# CHECK-NEXT: "jsonrpc": "2.0", +# CHECK-NEXT: "result": [ +# CHECK-NEXT: { +# CHECK-NEXT: "endLine": 1, +# CHECK-NEXT: "kind": "region", +# CHECK-NEXT: "startCharacter": 10, +# CHECK-NEXT: "startLine": 0 +# CHECK-NEXT: } +# CHECK-NEXT: ] +--- +{"jsonrpc":"2.0","id":5,"method":"shutdown"} +--- +{"jsonrpc":"2.0","method":"exit"}