hokein updated this revision to Diff 457972. hokein marked an inline comment as done. hokein added a comment.
address comment: create the ClangdServer when Opts is fully initialized. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D133299/new/ https://reviews.llvm.org/D133299 Files: clang-tools-extra/clangd/ClangdLSPServer.cpp clang-tools-extra/clangd/test/folding-range.test Index: clang-tools-extra/clangd/test/folding-range.test =================================================================== --- /dev/null +++ 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"} Index: clang-tools-extra/clangd/ClangdLSPServer.cpp =================================================================== --- clang-tools-extra/clangd/ClangdLSPServer.cpp +++ clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -466,32 +466,6 @@ if (Server) return Reply(llvm::make_error<LSPError>("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<DirectoryBasedGlobalCompilationDatabase>(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<WithContextValue> WithOffsetEncoding; - if (Opts.Encoding) - WithOffsetEncoding.emplace(kCurrentOffsetEncoding, *Opts.Encoding); - Server.emplace(*CDB, TFS, Opts, - static_cast<ClangdServer::Callbacks *>(this)); - } Opts.CodeComplete.EnableSnippets = Params.capabilities.CompletionSnippets; Opts.CodeComplete.IncludeFixIts = Params.capabilities.CompletionFixes; @@ -521,6 +495,33 @@ 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<DirectoryBasedGlobalCompilationDatabase>(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<WithContextValue> WithOffsetEncoding; + if (Opts.Encoding) + WithOffsetEncoding.emplace(kCurrentOffsetEncoding, *Opts.Encoding); + Server.emplace(*CDB, TFS, Opts, + static_cast<ClangdServer::Callbacks *>(this)); + } + llvm::json::Object ServerCaps{ {"textDocumentSync", llvm::json::Object{
Index: clang-tools-extra/clangd/test/folding-range.test =================================================================== --- /dev/null +++ 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"} Index: clang-tools-extra/clangd/ClangdLSPServer.cpp =================================================================== --- clang-tools-extra/clangd/ClangdLSPServer.cpp +++ clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -466,32 +466,6 @@ if (Server) return Reply(llvm::make_error<LSPError>("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<DirectoryBasedGlobalCompilationDatabase>(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<WithContextValue> WithOffsetEncoding; - if (Opts.Encoding) - WithOffsetEncoding.emplace(kCurrentOffsetEncoding, *Opts.Encoding); - Server.emplace(*CDB, TFS, Opts, - static_cast<ClangdServer::Callbacks *>(this)); - } Opts.CodeComplete.EnableSnippets = Params.capabilities.CompletionSnippets; Opts.CodeComplete.IncludeFixIts = Params.capabilities.CompletionFixes; @@ -521,6 +495,33 @@ 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<DirectoryBasedGlobalCompilationDatabase>(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<WithContextValue> WithOffsetEncoding; + if (Opts.Encoding) + WithOffsetEncoding.emplace(kCurrentOffsetEncoding, *Opts.Encoding); + Server.emplace(*CDB, TFS, Opts, + static_cast<ClangdServer::Callbacks *>(this)); + } + llvm::json::Object ServerCaps{ {"textDocumentSync", llvm::json::Object{
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits