90 lines · cpp
1//===- MlirLspServerMain.cpp - MLIR Language Server main ------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir/Tools/mlir-lsp-server/MlirLspServerMain.h"10#include "LSPServer.h"11#include "MLIRServer.h"12#include "llvm/Support/CommandLine.h"13#include "llvm/Support/LSP/Logging.h"14#include "llvm/Support/LSP/Transport.h"15#include "llvm/Support/Program.h"16 17using namespace mlir;18using namespace mlir::lsp;19 20using llvm::lsp::JSONStreamStyle;21using llvm::lsp::JSONTransport;22using llvm::lsp::Logger;23 24LogicalResult mlir::MlirLspServerMain(int argc, char **argv,25 DialectRegistryFn registry_fn) {26 llvm::cl::opt<JSONStreamStyle> inputStyle{27 "input-style",28 llvm::cl::desc("Input JSON stream encoding"),29 llvm::cl::values(clEnumValN(JSONStreamStyle::Standard, "standard",30 "usual LSP protocol"),31 clEnumValN(JSONStreamStyle::Delimited, "delimited",32 "messages delimited by `// -----` lines, "33 "with // comment support")),34 llvm::cl::init(JSONStreamStyle::Standard),35 llvm::cl::Hidden,36 };37 llvm::cl::opt<bool> litTest{38 "lit-test",39 llvm::cl::desc(40 "Abbreviation for -input-style=delimited -pretty -log=verbose. "41 "Intended to simplify lit tests"),42 llvm::cl::init(false),43 };44 llvm::cl::opt<Logger::Level> logLevel{45 "log",46 llvm::cl::desc("Verbosity of log messages written to stderr"),47 llvm::cl::values(48 clEnumValN(Logger::Level::Error, "error", "Error messages only"),49 clEnumValN(Logger::Level::Info, "info",50 "High level execution tracing"),51 clEnumValN(Logger::Level::Debug, "verbose", "Low level details")),52 llvm::cl::init(Logger::Level::Info),53 };54 llvm::cl::opt<bool> prettyPrint{55 "pretty",56 llvm::cl::desc("Pretty-print JSON output"),57 llvm::cl::init(false),58 };59 llvm::cl::ParseCommandLineOptions(argc, argv, "MLIR LSP Language Server");60 61 if (litTest) {62 inputStyle = JSONStreamStyle::Delimited;63 logLevel = Logger::Level::Debug;64 prettyPrint = true;65 }66 67 // Configure the logger.68 Logger::setLogLevel(logLevel);69 70 // Configure the transport used for communication.71 llvm::sys::ChangeStdinToBinary();72 JSONTransport transport(stdin, llvm::outs(), inputStyle, prettyPrint);73 74 // Register the additionally supported URI schemes for the MLIR server.75 URIForFile::registerSupportedScheme("mlir.bytecode-mlir");76 77 // Configure the servers and start the main language server.78 MLIRServer server(registry_fn);79 return runMlirLSPServer(server, transport);80}81 82llvm::LogicalResult mlir::MlirLspServerMain(int argc, char **argv,83 DialectRegistry ®istry) {84 auto registry_fn =85 [®istry](const lsp::URIForFile &uri) -> DialectRegistry & {86 return registry;87 };88 return MlirLspServerMain(argc, argv, registry_fn);89}90