15de12bb7SRiver Riddle //===- TableGenLspServerMain.cpp - TableGen Language Server main ----------===//
25de12bb7SRiver Riddle //
35de12bb7SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45de12bb7SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
55de12bb7SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65de12bb7SRiver Riddle //
75de12bb7SRiver Riddle //===----------------------------------------------------------------------===//
85de12bb7SRiver Riddle
95de12bb7SRiver Riddle #include "mlir/Tools/tblgen-lsp-server/TableGenLspServerMain.h"
105de12bb7SRiver Riddle #include "LSPServer.h"
115de12bb7SRiver Riddle #include "TableGenServer.h"
12*305d7185SRiver Riddle #include "mlir/Tools/lsp-server-support/Logging.h"
13*305d7185SRiver Riddle #include "mlir/Tools/lsp-server-support/Transport.h"
145de12bb7SRiver Riddle #include "llvm/Support/CommandLine.h"
155de12bb7SRiver Riddle #include "llvm/Support/Program.h"
165de12bb7SRiver Riddle
175de12bb7SRiver Riddle using namespace mlir;
185de12bb7SRiver Riddle using namespace mlir::lsp;
195de12bb7SRiver Riddle
TableGenLspServerMain(int argc,char ** argv)205de12bb7SRiver Riddle LogicalResult mlir::TableGenLspServerMain(int argc, char **argv) {
215de12bb7SRiver Riddle llvm::cl::opt<JSONStreamStyle> inputStyle{
225de12bb7SRiver Riddle "input-style",
235de12bb7SRiver Riddle llvm::cl::desc("Input JSON stream encoding"),
245de12bb7SRiver Riddle llvm::cl::values(clEnumValN(JSONStreamStyle::Standard, "standard",
255de12bb7SRiver Riddle "usual LSP protocol"),
265de12bb7SRiver Riddle clEnumValN(JSONStreamStyle::Delimited, "delimited",
275de12bb7SRiver Riddle "messages delimited by `// -----` lines, "
285de12bb7SRiver Riddle "with // comment support")),
295de12bb7SRiver Riddle llvm::cl::init(JSONStreamStyle::Standard),
305de12bb7SRiver Riddle llvm::cl::Hidden,
315de12bb7SRiver Riddle };
325de12bb7SRiver Riddle llvm::cl::opt<bool> litTest{
335de12bb7SRiver Riddle "lit-test",
345de12bb7SRiver Riddle llvm::cl::desc(
355de12bb7SRiver Riddle "Abbreviation for -input-style=delimited -pretty -log=verbose. "
365de12bb7SRiver Riddle "Intended to simplify lit tests"),
375de12bb7SRiver Riddle llvm::cl::init(false),
385de12bb7SRiver Riddle };
395de12bb7SRiver Riddle llvm::cl::opt<Logger::Level> logLevel{
405de12bb7SRiver Riddle "log",
415de12bb7SRiver Riddle llvm::cl::desc("Verbosity of log messages written to stderr"),
425de12bb7SRiver Riddle llvm::cl::values(
435de12bb7SRiver Riddle clEnumValN(Logger::Level::Error, "error", "Error messages only"),
445de12bb7SRiver Riddle clEnumValN(Logger::Level::Info, "info",
455de12bb7SRiver Riddle "High level execution tracing"),
465de12bb7SRiver Riddle clEnumValN(Logger::Level::Debug, "verbose", "Low level details")),
475de12bb7SRiver Riddle llvm::cl::init(Logger::Level::Info),
485de12bb7SRiver Riddle };
495de12bb7SRiver Riddle llvm::cl::opt<bool> prettyPrint{
505de12bb7SRiver Riddle "pretty",
515de12bb7SRiver Riddle llvm::cl::desc("Pretty-print JSON output"),
525de12bb7SRiver Riddle llvm::cl::init(false),
535de12bb7SRiver Riddle };
54dc9fb65cSRiver Riddle llvm::cl::list<std::string> extraIncludeDirs(
55dc9fb65cSRiver Riddle "tablegen-extra-dir", llvm::cl::desc("Extra directory of include files"),
56dc9fb65cSRiver Riddle llvm::cl::value_desc("directory"), llvm::cl::Prefix);
57dc9fb65cSRiver Riddle llvm::cl::list<std::string> compilationDatabases(
58dc9fb65cSRiver Riddle "tablegen-compilation-database",
59dc9fb65cSRiver Riddle llvm::cl::desc("Compilation YAML databases containing additional "
60dc9fb65cSRiver Riddle "compilation information for .td files"));
615de12bb7SRiver Riddle
625de12bb7SRiver Riddle llvm::cl::ParseCommandLineOptions(argc, argv, "TableGen LSP Language Server");
635de12bb7SRiver Riddle
645de12bb7SRiver Riddle if (litTest) {
655de12bb7SRiver Riddle inputStyle = JSONStreamStyle::Delimited;
665de12bb7SRiver Riddle logLevel = Logger::Level::Debug;
675de12bb7SRiver Riddle prettyPrint = true;
685de12bb7SRiver Riddle }
695de12bb7SRiver Riddle
705de12bb7SRiver Riddle // Configure the logger.
715de12bb7SRiver Riddle Logger::setLogLevel(logLevel);
725de12bb7SRiver Riddle
735de12bb7SRiver Riddle // Configure the transport used for communication.
745de12bb7SRiver Riddle llvm::sys::ChangeStdinToBinary();
755de12bb7SRiver Riddle JSONTransport transport(stdin, llvm::outs(), inputStyle, prettyPrint);
765de12bb7SRiver Riddle
775de12bb7SRiver Riddle // Configure the servers and start the main language server.
78dc9fb65cSRiver Riddle TableGenServer::Options options(compilationDatabases, extraIncludeDirs);
79dc9fb65cSRiver Riddle TableGenServer server(options);
805de12bb7SRiver Riddle return runTableGenLSPServer(server, transport);
815de12bb7SRiver Riddle }
82