xref: /llvm-project/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp (revision 305d718539659fb5fccd9b6e0771bbabc6c3c821)
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