sammccall created this revision. sammccall added a reviewer: kadircet. Herald added subscribers: cfe-commits, arphaman, jkorous, MaskRay, ilya-biryukov. Herald added a project: clang.
This simplifies various workflows, particularly in debugging/development. e.g. editors will tend to propagate flags, so you can run `env CLANGD_FLAGS=-input-mirror-file=/tmp/mirror vim foo.cc` rather than change the configuration in a persistent way. (This also gives us a generic lever when we don't know how to customize the flags in some particular LSP client). While here, add a test for this and other startup logging, and fix a couple of direct writes to errs() that should have been logs. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D65153 Files: clang-tools-extra/clangd/index/Serialization.cpp clang-tools-extra/clangd/test/log.test clang-tools-extra/clangd/tool/ClangdMain.cpp Index: clang-tools-extra/clangd/tool/ClangdMain.cpp =================================================================== --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -22,6 +22,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" #include "llvm/Support/Program.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" @@ -342,14 +343,18 @@ llvm::cl::SetVersionPrinter([](llvm::raw_ostream &OS) { OS << clang::getClangToolFullVersion("clangd") << "\n"; }); - llvm::cl::ParseCommandLineOptions( - argc, argv, - "clangd is a language server that provides IDE-like features to editors. " - "\n\nIt should be used via an editor plugin rather than invoked " - "directly. " - "For more information, see:" - "\n\thttps://clang.llvm.org/extra/clangd.html" - "\n\thttps://microsoft.github.io/language-server-protocol/"); + const char *FlagsEnvVar = "CLANGD_FLAGS"; + const char *Overview = + R"(clangd is a language server that provides IDE-like features to editors. + +It should be used via an editor plugin rather than invoked directly. For more information, see: + https://clang.llvm.org/extra/clangd.html + https://microsoft.github.io/language-server-protocol/ + +clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment variable. +)"; + llvm::cl::ParseCommandLineOptions(argc, argv, Overview, + /*Errs=*/nullptr, FlagsEnvVar); if (Test) { Sync = true; InputStyle = JSONStreamStyle::Delimited; @@ -434,6 +439,8 @@ } for (int I = 0; I < argc; ++I) log("argv[{0}]: {1}", I, argv[I]); + if (auto EnvFlags = llvm::sys::Process::GetEnv(FlagsEnvVar)) + log("{0}: {1}", FlagsEnvVar, *EnvFlags); // If --compile-commands-dir arg was invoked, check value and override default // path. Index: clang-tools-extra/clangd/test/log.test =================================================================== --- /dev/null +++ clang-tools-extra/clangd/test/log.test @@ -0,0 +1,9 @@ +# RUN: not env CLANGD_FLAGS=-index-file=no-such-index clangd -lit-test </dev/null 2>&1 >/dev/null | FileCheck %s +CHECK: I[{{.*}}] clangd version {{.*}} +CHECK: Working directory: {{.*}} +CHECK: argv[0]: clangd +CHECK: argv[1]: -lit-test +CHECK: CLANGD_FLAGS: -index-file=no-such-index +CHECK: E[{{.*}}] Can't open no-such-index +CHECK: Starting LSP over stdin/stdout + Index: clang-tools-extra/clangd/index/Serialization.cpp =================================================================== --- clang-tools-extra/clangd/index/Serialization.cpp +++ clang-tools-extra/clangd/index/Serialization.cpp @@ -690,7 +690,7 @@ trace::Span OverallTracer("LoadIndex"); auto Buffer = llvm::MemoryBuffer::getFile(SymbolFilename); if (!Buffer) { - llvm::errs() << "Can't open " << SymbolFilename << "\n"; + elog("Can't open {0}", SymbolFilename); return nullptr; } @@ -707,7 +707,7 @@ if (I->Relations) Relations = std::move(*I->Relations); } else { - llvm::errs() << "Bad Index: " << llvm::toString(I.takeError()) << "\n"; + elog("Bad Index: {0}", I.takeError()); return nullptr; } }
Index: clang-tools-extra/clangd/tool/ClangdMain.cpp =================================================================== --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -22,6 +22,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/Support/Process.h" #include "llvm/Support/Program.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" @@ -342,14 +343,18 @@ llvm::cl::SetVersionPrinter([](llvm::raw_ostream &OS) { OS << clang::getClangToolFullVersion("clangd") << "\n"; }); - llvm::cl::ParseCommandLineOptions( - argc, argv, - "clangd is a language server that provides IDE-like features to editors. " - "\n\nIt should be used via an editor plugin rather than invoked " - "directly. " - "For more information, see:" - "\n\thttps://clang.llvm.org/extra/clangd.html" - "\n\thttps://microsoft.github.io/language-server-protocol/"); + const char *FlagsEnvVar = "CLANGD_FLAGS"; + const char *Overview = + R"(clangd is a language server that provides IDE-like features to editors. + +It should be used via an editor plugin rather than invoked directly. For more information, see: + https://clang.llvm.org/extra/clangd.html + https://microsoft.github.io/language-server-protocol/ + +clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment variable. +)"; + llvm::cl::ParseCommandLineOptions(argc, argv, Overview, + /*Errs=*/nullptr, FlagsEnvVar); if (Test) { Sync = true; InputStyle = JSONStreamStyle::Delimited; @@ -434,6 +439,8 @@ } for (int I = 0; I < argc; ++I) log("argv[{0}]: {1}", I, argv[I]); + if (auto EnvFlags = llvm::sys::Process::GetEnv(FlagsEnvVar)) + log("{0}: {1}", FlagsEnvVar, *EnvFlags); // If --compile-commands-dir arg was invoked, check value and override default // path. Index: clang-tools-extra/clangd/test/log.test =================================================================== --- /dev/null +++ clang-tools-extra/clangd/test/log.test @@ -0,0 +1,9 @@ +# RUN: not env CLANGD_FLAGS=-index-file=no-such-index clangd -lit-test </dev/null 2>&1 >/dev/null | FileCheck %s +CHECK: I[{{.*}}] clangd version {{.*}} +CHECK: Working directory: {{.*}} +CHECK: argv[0]: clangd +CHECK: argv[1]: -lit-test +CHECK: CLANGD_FLAGS: -index-file=no-such-index +CHECK: E[{{.*}}] Can't open no-such-index +CHECK: Starting LSP over stdin/stdout + Index: clang-tools-extra/clangd/index/Serialization.cpp =================================================================== --- clang-tools-extra/clangd/index/Serialization.cpp +++ clang-tools-extra/clangd/index/Serialization.cpp @@ -690,7 +690,7 @@ trace::Span OverallTracer("LoadIndex"); auto Buffer = llvm::MemoryBuffer::getFile(SymbolFilename); if (!Buffer) { - llvm::errs() << "Can't open " << SymbolFilename << "\n"; + elog("Can't open {0}", SymbolFilename); return nullptr; } @@ -707,7 +707,7 @@ if (I->Relations) Relations = std::move(*I->Relations); } else { - llvm::errs() << "Bad Index: " << llvm::toString(I.takeError()) << "\n"; + elog("Bad Index: {0}", I.takeError()); return nullptr; } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits