Add --log-stdin-stdout-to-stderr

Prints messages received and stdin/stdout to stderr. Useful when developing a new client that uses cquery as the backend.
This commit is contained in:
Jacob Dufault 2017-11-29 20:22:10 -08:00
parent f1f2cc3bd1
commit f4acde7588
3 changed files with 30 additions and 3 deletions

View File

@ -52,6 +52,9 @@ std::vector<std::string> kEmptyArgs;
// Expected client version. We show an error if this doesn't match.
const int kExpectedClientVersion = 3;
// If true stdout will be printed to stderr.
bool g_log_stdin_stdout_to_stderr = false;
// Cached completion information, so we can give fast completion results when
// the user erases a character. vscode will resend the completion request if
// that happens.
@ -3027,7 +3030,8 @@ void LaunchStdinLoop(Config* config,
IpcManager* ipc = IpcManager::instance();
std::unique_ptr<BaseIpcMessage> message =
MessageRegistry::instance()->ReadMessageFromStdin();
MessageRegistry::instance()->ReadMessageFromStdin(
g_log_stdin_stdout_to_stderr);
// Message parsing can fail if we don't recognize the method.
if (!message)
@ -3133,6 +3137,12 @@ void LaunchStdoutThread(std::unordered_map<IpcId, Timer>* request_times,
msg->original_ipc_id)));
}
if (g_log_stdin_stdout_to_stderr) {
std::string printed = "[COUT] |" + msg->content + "|\n";
std::cerr << printed;
std::cerr.flush();
}
std::cout << msg->content;
std::cout.flush();
break;
@ -3210,6 +3220,9 @@ int main(int argc, char** argv) {
bool print_help = true;
if (HasOption(options, "--log-stdin-stdout-to-stderr"))
g_log_stdin_stdout_to_stderr = true;
if (HasOption(options, "--test-unit")) {
print_help = false;
doctest::Context context;
@ -3248,6 +3261,10 @@ int main(int argc, char** argv) {
server spec over STDIN and STDOUT.
--test-unit Run unit tests.
--test-index Run index tests.
--log-stdin-stdout-to-stderr
Print stdin and stdout messages to stderr. This is a aid for
developing new language clients, as it makes it easier to
figure out how the client is interacting with cquery.
Configuration:
When opening up a directory, cquery will look for a compile_commands.json

View File

@ -134,7 +134,8 @@ optional<char> ReadCharFromStdinBlocking() {
return c;
}
std::unique_ptr<BaseIpcMessage> MessageRegistry::ReadMessageFromStdin() {
std::unique_ptr<BaseIpcMessage> MessageRegistry::ReadMessageFromStdin(
bool log_stdin_to_stderr) {
optional<std::string> content =
ReadJsonRpcContentFrom(&ReadCharFromStdinBlocking);
if (!content) {
@ -142,6 +143,14 @@ std::unique_ptr<BaseIpcMessage> MessageRegistry::ReadMessageFromStdin() {
exit(1);
}
if (log_stdin_to_stderr) {
// TODO: This should go inside of ReadJsonRpcContentFrom since it does not
// print the header.
std::string printed = "[CIN] |" + *content + "|\n";
std::cerr << printed;
std::cerr.flush();
}
rapidjson::Document document;
document.Parse(content->c_str(), content->length());
assert(!document.HasParseError());

View File

@ -58,7 +58,8 @@ struct MessageRegistry {
};
}
std::unique_ptr<BaseIpcMessage> ReadMessageFromStdin();
std::unique_ptr<BaseIpcMessage> ReadMessageFromStdin(
bool log_stdin_to_stderr);
std::unique_ptr<BaseIpcMessage> Parse(Reader& visitor);
};