rust-analyzer/crates/ra_lsp_server/src/main.rs
Ville Penttinen 0dcb1cb569 Add showWorkspaceLoadedNotification to vscode client
This allows users to control whether or not they want to see the "workspace
loaded" notification.

This is done on the server side using InitializationOptions which are provided
by the client. By default show_workspace_loaded is true, meaning the
notification is sent.
2019-03-06 11:34:38 +02:00

44 lines
1.5 KiB
Rust

use serde::Deserialize;
use flexi_logger::{Duplicate, Logger};
use gen_lsp_server::{run_server, stdio_transport};
use ra_lsp_server::{Result, InitializationOptions};
fn main() -> Result<()> {
::std::env::set_var("RUST_BACKTRACE", "short");
let logger = Logger::with_env_or_str("error").duplicate_to_stderr(Duplicate::All);
match ::std::env::var("RA_INTERNAL_MODE") {
Ok(ref v) if v == "1" => logger.log_to_file().directory("log").start()?,
_ => logger.start()?,
};
log::info!("lifecycle: server started");
match ::std::panic::catch_unwind(main_inner) {
Ok(res) => {
log::info!("lifecycle: terminating process with {:?}", res);
res
}
Err(_) => {
log::error!("server panicked");
failure::bail!("server panicked")
}
}
}
fn main_inner() -> Result<()> {
let (receiver, sender, threads) = stdio_transport();
let cwd = ::std::env::current_dir()?;
run_server(ra_lsp_server::server_capabilities(), receiver, sender, |params, r, s| {
let root = params.root_uri.and_then(|it| it.to_file_path().ok()).unwrap_or(cwd);
let opts = params
.initialization_options
.and_then(|v| InitializationOptions::deserialize(v).ok())
.unwrap_or(InitializationOptions::default());
ra_lsp_server::main_loop(root, opts, r, s)
})?;
log::info!("shutting down IO...");
threads.join()?;
log::info!("... IO is down");
Ok(())
}