Auto merge of #15071 - matklad:no-regex, r=matklad

internal: remove spurious regex dependency

- replace tokio's env-filter with a smaller&simpler targets filter
- reshuffle logging infra a bit to make sure there's only a single place where we read environmental variables
- use anyhow::Result in rust-analyzer binary
This commit is contained in:
bors 2023-06-19 10:51:03 +00:00
commit 00b9d9faf4
14 changed files with 196 additions and 241 deletions

37
Cargo.lock generated
View file

@ -967,15 +967,6 @@ dependencies = [
"url", "url",
] ]
[[package]]
name = "matchers"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
dependencies = [
"regex-automata",
]
[[package]] [[package]]
name = "mbe" name = "mbe"
version = "0.0.0" version = "0.0.0"
@ -1438,30 +1429,6 @@ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
] ]
[[package]]
name = "regex"
version = "1.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d"
dependencies = [
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
dependencies = [
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]] [[package]]
name = "rowan" name = "rowan"
version = "0.15.11" version = "0.15.11"
@ -1953,12 +1920,8 @@ version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
dependencies = [ dependencies = [
"matchers",
"once_cell",
"regex",
"sharded-slab", "sharded-slab",
"thread_local", "thread_local",
"tracing",
"tracing-core", "tracing-core",
"tracing-log", "tracing-log",
] ]

View file

@ -47,7 +47,6 @@ limit.workspace = true
expect-test = "1.4.0" expect-test = "1.4.0"
tracing = "0.1.35" tracing = "0.1.35"
tracing-subscriber = { version = "0.3.16", default-features = false, features = [ tracing-subscriber = { version = "0.3.16", default-features = false, features = [
"env-filter",
"registry", "registry",
] } ] }
tracing-tree = "0.2.1" tracing-tree = "0.2.1"

View file

@ -30,7 +30,7 @@ use syntax::{
ast::{self, AstNode, HasName}, ast::{self, AstNode, HasName},
SyntaxNode, SyntaxNode,
}; };
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; use tracing_subscriber::{layer::SubscriberExt, Registry};
use tracing_tree::HierarchicalLayer; use tracing_tree::HierarchicalLayer;
use triomphe::Arc; use triomphe::Arc;
@ -52,7 +52,8 @@ fn setup_tracing() -> Option<tracing::subscriber::DefaultGuard> {
return None; return None;
} }
let filter = EnvFilter::from_env("CHALK_DEBUG"); let filter: tracing_subscriber::filter::Targets =
env::var("CHALK_DEBUG").ok().and_then(|it| it.parse().ok()).unwrap_or_default();
let layer = HierarchicalLayer::default() let layer = HierarchicalLayer::default()
.with_indent_lines(true) .with_indent_lines(true)
.with_ansi(false) .with_ansi(false)

View file

@ -37,7 +37,6 @@ mimalloc = { version = "0.1.30", default-features = false, optional = true }
lsp-server = { version = "0.7.0", path = "../../lib/lsp-server" } lsp-server = { version = "0.7.0", path = "../../lib/lsp-server" }
tracing = "0.1.35" tracing = "0.1.35"
tracing-subscriber = { version = "0.3.16", default-features = false, features = [ tracing-subscriber = { version = "0.3.16", default-features = false, features = [
"env-filter",
"registry", "registry",
"fmt", "fmt",
"tracing-log", "tracing-log",

View file

@ -8,10 +8,11 @@ use std::{
sync::Arc, sync::Arc,
}; };
use rust_analyzer::Result; use anyhow::Context;
use tracing::{level_filters::LevelFilter, Event, Subscriber}; use tracing::{level_filters::LevelFilter, Event, Subscriber};
use tracing_log::NormalizeEvent; use tracing_log::NormalizeEvent;
use tracing_subscriber::{ use tracing_subscriber::{
filter::Targets,
fmt::{ fmt::{
format::Writer, writer::BoxMakeWriter, FmtContext, FormatEvent, FormatFields, format::Writer, writer::BoxMakeWriter, FmtContext, FormatEvent, FormatFields,
FormattedFields, MakeWriter, FormattedFields, MakeWriter,
@ -19,13 +20,14 @@ use tracing_subscriber::{
layer::SubscriberExt, layer::SubscriberExt,
registry::LookupSpan, registry::LookupSpan,
util::SubscriberInitExt, util::SubscriberInitExt,
EnvFilter, Registry, Registry,
}; };
use tracing_tree::HierarchicalLayer; use tracing_tree::HierarchicalLayer;
pub(crate) struct Logger { pub(crate) struct LoggerConfig {
filter: EnvFilter, pub(crate) log_file: Option<File>,
file: Option<File>, pub(crate) filter: String,
pub(crate) chalk_filter: Option<String>,
} }
struct MakeWriterStderr; struct MakeWriterStderr;
@ -38,62 +40,42 @@ impl<'a> MakeWriter<'a> for MakeWriterStderr {
} }
} }
impl Logger { impl LoggerConfig {
pub(crate) fn new(file: Option<File>, filter: Option<&str>) -> Logger { pub(crate) fn init(self) -> anyhow::Result<()> {
let filter = filter.map_or(EnvFilter::default(), EnvFilter::new); let mut filter: Targets = self
.filter
.parse()
.with_context(|| format!("invalid log filter: `{}`", self.filter))?;
Logger { filter, file } let mut chalk_layer = None;
} if let Some(chalk_filter) = self.chalk_filter {
let level: LevelFilter =
chalk_filter.parse().with_context(|| "invalid chalk log filter")?;
chalk_layer = Some(
HierarchicalLayer::default()
.with_indent_lines(true)
.with_ansi(false)
.with_indent_amount(2)
.with_writer(io::stderr),
);
filter = filter
.with_target("chalk_solve", level)
.with_target("chalk_ir", level)
.with_target("chalk_recursive", level);
};
pub(crate) fn install(self) -> Result<()> { let writer = match self.log_file {
// The meaning of CHALK_DEBUG I suspected is to tell chalk crates
// (i.e. chalk-solve, chalk-ir, chalk-recursive) how to filter tracing
// logs. But now we can only have just one filter, which means we have to
// merge chalk filter to our main filter (from RA_LOG env).
//
// The acceptable syntax of CHALK_DEBUG is `target[span{field=value}]=level`.
// As the value should only affect chalk crates, we'd better manually
// specify the target. And for simplicity, CHALK_DEBUG only accept the value
// that specify level.
let chalk_level_dir = std::env::var("CHALK_DEBUG")
.map(|val| {
val.parse::<LevelFilter>().expect(
"invalid CHALK_DEBUG value, expect right log level (like debug or trace)",
)
})
.ok();
let chalk_layer = HierarchicalLayer::default()
.with_indent_lines(true)
.with_ansi(false)
.with_indent_amount(2)
.with_writer(io::stderr);
let writer = match self.file {
Some(file) => BoxMakeWriter::new(Arc::new(file)), Some(file) => BoxMakeWriter::new(Arc::new(file)),
None => BoxMakeWriter::new(io::stderr), None => BoxMakeWriter::new(io::stderr),
}; };
let ra_fmt_layer = let ra_fmt_layer =
tracing_subscriber::fmt::layer().event_format(LoggerFormatter).with_writer(writer); tracing_subscriber::fmt::layer().event_format(LoggerFormatter).with_writer(writer);
match chalk_level_dir { let registry = Registry::default().with(filter).with(ra_fmt_layer);
Some(val) => { match chalk_layer {
Registry::default() Some(chalk_layer) => registry.with(chalk_layer).init(),
.with( None => registry.init(),
self.filter }
.add_directive(format!("chalk_solve={val}").parse()?)
.add_directive(format!("chalk_ir={val}").parse()?)
.add_directive(format!("chalk_recursive={val}").parse()?),
)
.with(ra_fmt_layer)
.with(chalk_layer)
.init();
}
None => {
Registry::default().with(self.filter).with(ra_fmt_layer).init();
}
};
Ok(()) Ok(())
} }
} }

View file

@ -7,14 +7,11 @@
mod logger; mod logger;
mod rustc_wrapper; mod rustc_wrapper;
use std::{ use std::{env, fs, path::PathBuf, process};
env, fs,
path::{Path, PathBuf},
process,
};
use anyhow::Context;
use lsp_server::Connection; use lsp_server::Connection;
use rust_analyzer::{cli::flags, config::Config, from_json, Result}; use rust_analyzer::{cli::flags, config::Config, from_json};
use vfs::AbsPathBuf; use vfs::AbsPathBuf;
#[cfg(all(feature = "mimalloc"))] #[cfg(all(feature = "mimalloc"))]
@ -25,7 +22,7 @@ static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
#[global_allocator] #[global_allocator]
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
fn main() { fn main() -> anyhow::Result<()> {
if std::env::var("RA_RUSTC_WRAPPER").is_ok() { if std::env::var("RA_RUSTC_WRAPPER").is_ok() {
let mut args = std::env::args_os(); let mut args = std::env::args_os();
let _me = args.next().unwrap(); let _me = args.next().unwrap();
@ -41,14 +38,7 @@ fn main() {
} }
let flags = flags::RustAnalyzer::from_env_or_exit(); let flags = flags::RustAnalyzer::from_env_or_exit();
if let Err(err) = try_main(flags) {
tracing::error!("Unexpected error: {}", err);
eprintln!("{err}");
process::exit(101);
}
}
fn try_main(flags: flags::RustAnalyzer) -> Result<()> {
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
if flags.wait_dbg || env::var("RA_WAIT_DBG").is_ok() { if flags.wait_dbg || env::var("RA_WAIT_DBG").is_ok() {
#[allow(unused_mut)] #[allow(unused_mut)]
@ -58,14 +48,8 @@ fn try_main(flags: flags::RustAnalyzer) -> Result<()> {
} }
} }
let mut log_file = flags.log_file.as_deref(); setup_logging(flags.log_file.clone())?;
let env_log_file = env::var("RA_LOG_FILE").ok();
if let Some(env_log_file) = env_log_file.as_deref() {
log_file = Some(Path::new(env_log_file));
}
setup_logging(log_file)?;
let verbosity = flags.verbosity(); let verbosity = flags.verbosity();
match flags.subcommand { match flags.subcommand {
@ -102,7 +86,7 @@ fn try_main(flags: flags::RustAnalyzer) -> Result<()> {
Ok(()) Ok(())
} }
fn setup_logging(log_file: Option<&Path>) -> Result<()> { fn setup_logging(log_file_flag: Option<PathBuf>) -> anyhow::Result<()> {
if cfg!(windows) { if cfg!(windows) {
// This is required so that windows finds our pdb that is placed right beside the exe. // This is required so that windows finds our pdb that is placed right beside the exe.
// By default it doesn't look at the folder the exe resides in, only in the current working // By default it doesn't look at the folder the exe resides in, only in the current working
@ -115,23 +99,42 @@ fn setup_logging(log_file: Option<&Path>) -> Result<()> {
} }
} }
} }
if env::var("RUST_BACKTRACE").is_err() { if env::var("RUST_BACKTRACE").is_err() {
env::set_var("RUST_BACKTRACE", "short"); env::set_var("RUST_BACKTRACE", "short");
} }
let log_file = env::var("RA_LOG_FILE").ok().map(PathBuf::from).or(log_file_flag);
let log_file = match log_file { let log_file = match log_file {
Some(path) => { Some(path) => {
if let Some(parent) = path.parent() { if let Some(parent) = path.parent() {
let _ = fs::create_dir_all(parent); let _ = fs::create_dir_all(parent);
} }
Some(fs::File::create(path)?) Some(
fs::File::create(&path)
.with_context(|| format!("can't create log file at {}", path.display()))?,
)
} }
None => None, None => None,
}; };
let filter = env::var("RA_LOG").ok();
// deliberately enable all `error` logs if the user has not set RA_LOG, as there is usually useful logger::LoggerConfig {
// information in there for debugging log_file,
logger::Logger::new(log_file, filter.as_deref().or(Some("error"))).install()?; // Deliberately enable all `error` logs if the user has not set RA_LOG, as there is usually
// useful information in there for debugging.
filter: env::var("RA_LOG").ok().unwrap_or_else(|| "error".to_string()),
// The meaning of CHALK_DEBUG I suspected is to tell chalk crates
// (i.e. chalk-solve, chalk-ir, chalk-recursive) how to filter tracing
// logs. But now we can only have just one filter, which means we have to
// merge chalk filter to our main filter (from RA_LOG env).
//
// The acceptable syntax of CHALK_DEBUG is `target[span{field=value}]=level`.
// As the value should only affect chalk crates, we'd better manually
// specify the target. And for simplicity, CHALK_DEBUG only accept the value
// that specify level.
chalk_filter: env::var("CHALK_DEBUG").ok(),
}
.init()?;
profile::init(); profile::init();
@ -146,8 +149,8 @@ const STACK_SIZE: usize = 1024 * 1024 * 8;
fn with_extra_thread( fn with_extra_thread(
thread_name: impl Into<String>, thread_name: impl Into<String>,
thread_intent: stdx::thread::ThreadIntent, thread_intent: stdx::thread::ThreadIntent,
f: impl FnOnce() -> Result<()> + Send + 'static, f: impl FnOnce() -> anyhow::Result<()> + Send + 'static,
) -> Result<()> { ) -> anyhow::Result<()> {
let handle = stdx::thread::Builder::new(thread_intent) let handle = stdx::thread::Builder::new(thread_intent)
.name(thread_name.into()) .name(thread_name.into())
.stack_size(STACK_SIZE) .stack_size(STACK_SIZE)
@ -158,7 +161,7 @@ fn with_extra_thread(
Ok(()) Ok(())
} }
fn run_server() -> Result<()> { fn run_server() -> anyhow::Result<()> {
tracing::info!("server version {} will start", rust_analyzer::version()); tracing::info!("server version {} will start", rust_analyzer::version());
let (connection, io_threads) = Connection::stdio(); let (connection, io_threads) = Connection::stdio();

View file

@ -10,7 +10,7 @@ use crate::{
global_state::{GlobalState, GlobalStateSnapshot}, global_state::{GlobalState, GlobalStateSnapshot},
main_loop::Task, main_loop::Task,
version::version, version::version,
LspError, Result, LspError,
}; };
/// A visitor for routing a raw JSON request to an appropriate handler function. /// A visitor for routing a raw JSON request to an appropriate handler function.
@ -38,7 +38,7 @@ impl<'a> RequestDispatcher<'a> {
/// guarded by `catch_unwind`, so, please, don't make bugs :-) /// guarded by `catch_unwind`, so, please, don't make bugs :-)
pub(crate) fn on_sync_mut<R>( pub(crate) fn on_sync_mut<R>(
&mut self, &mut self,
f: fn(&mut GlobalState, R::Params) -> Result<R::Result>, f: fn(&mut GlobalState, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request, R: lsp_types::request::Request,
@ -63,7 +63,7 @@ impl<'a> RequestDispatcher<'a> {
/// Dispatches the request onto the current thread. /// Dispatches the request onto the current thread.
pub(crate) fn on_sync<R>( pub(crate) fn on_sync<R>(
&mut self, &mut self,
f: fn(GlobalStateSnapshot, R::Params) -> Result<R::Result>, f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request, R: lsp_types::request::Request,
@ -92,7 +92,7 @@ impl<'a> RequestDispatcher<'a> {
/// without retrying it if it panics. /// without retrying it if it panics.
pub(crate) fn on_no_retry<R>( pub(crate) fn on_no_retry<R>(
&mut self, &mut self,
f: fn(GlobalStateSnapshot, R::Params) -> Result<R::Result>, f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request + 'static, R: lsp_types::request::Request + 'static,
@ -128,7 +128,7 @@ impl<'a> RequestDispatcher<'a> {
/// Dispatches a non-latency-sensitive request onto the thread pool. /// Dispatches a non-latency-sensitive request onto the thread pool.
pub(crate) fn on<R>( pub(crate) fn on<R>(
&mut self, &mut self,
f: fn(GlobalStateSnapshot, R::Params) -> Result<R::Result>, f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request + 'static, R: lsp_types::request::Request + 'static,
@ -141,7 +141,7 @@ impl<'a> RequestDispatcher<'a> {
/// Dispatches a latency-sensitive request onto the thread pool. /// Dispatches a latency-sensitive request onto the thread pool.
pub(crate) fn on_latency_sensitive<R>( pub(crate) fn on_latency_sensitive<R>(
&mut self, &mut self,
f: fn(GlobalStateSnapshot, R::Params) -> Result<R::Result>, f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request + 'static, R: lsp_types::request::Request + 'static,
@ -156,7 +156,7 @@ impl<'a> RequestDispatcher<'a> {
/// We can't run this on the main thread though as we invoke rustfmt which may take arbitrary time to complete! /// We can't run this on the main thread though as we invoke rustfmt which may take arbitrary time to complete!
pub(crate) fn on_fmt_thread<R>( pub(crate) fn on_fmt_thread<R>(
&mut self, &mut self,
f: fn(GlobalStateSnapshot, R::Params) -> Result<R::Result>, f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request + 'static, R: lsp_types::request::Request + 'static,
@ -181,7 +181,7 @@ impl<'a> RequestDispatcher<'a> {
fn on_with_thread_intent<const MAIN_POOL: bool, R>( fn on_with_thread_intent<const MAIN_POOL: bool, R>(
&mut self, &mut self,
intent: ThreadIntent, intent: ThreadIntent,
f: fn(GlobalStateSnapshot, R::Params) -> Result<R::Result>, f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
) -> &mut Self ) -> &mut Self
where where
R: lsp_types::request::Request + 'static, R: lsp_types::request::Request + 'static,
@ -245,7 +245,7 @@ impl<'a> RequestDispatcher<'a> {
fn thread_result_to_response<R>( fn thread_result_to_response<R>(
id: lsp_server::RequestId, id: lsp_server::RequestId,
result: thread::Result<Result<R::Result>>, result: thread::Result<anyhow::Result<R::Result>>,
) -> Result<lsp_server::Response, Cancelled> ) -> Result<lsp_server::Response, Cancelled>
where where
R: lsp_types::request::Request, R: lsp_types::request::Request,
@ -277,7 +277,7 @@ where
fn result_to_response<R>( fn result_to_response<R>(
id: lsp_server::RequestId, id: lsp_server::RequestId,
result: Result<R::Result>, result: anyhow::Result<R::Result>,
) -> Result<lsp_server::Response, Cancelled> ) -> Result<lsp_server::Response, Cancelled>
where where
R: lsp_types::request::Request, R: lsp_types::request::Request,
@ -289,7 +289,7 @@ where
Err(e) => match e.downcast::<LspError>() { Err(e) => match e.downcast::<LspError>() {
Ok(lsp_error) => lsp_server::Response::new_err(id, lsp_error.code, lsp_error.message), Ok(lsp_error) => lsp_server::Response::new_err(id, lsp_error.code, lsp_error.message),
Err(e) => match e.downcast::<Cancelled>() { Err(e) => match e.downcast::<Cancelled>() {
Ok(cancelled) => return Err(*cancelled), Ok(cancelled) => return Err(cancelled),
Err(e) => lsp_server::Response::new_err( Err(e) => lsp_server::Response::new_err(
id, id,
lsp_server::ErrorCode::InternalError as i32, lsp_server::ErrorCode::InternalError as i32,
@ -309,8 +309,8 @@ pub(crate) struct NotificationDispatcher<'a> {
impl<'a> NotificationDispatcher<'a> { impl<'a> NotificationDispatcher<'a> {
pub(crate) fn on_sync_mut<N>( pub(crate) fn on_sync_mut<N>(
&mut self, &mut self,
f: fn(&mut GlobalState, N::Params) -> Result<()>, f: fn(&mut GlobalState, N::Params) -> anyhow::Result<()>,
) -> Result<&mut Self> ) -> anyhow::Result<&mut Self>
where where
N: lsp_types::notification::Notification, N: lsp_types::notification::Notification,
N::Params: DeserializeOwned + Send, N::Params: DeserializeOwned + Send,

View file

@ -14,19 +14,21 @@ use crate::{
line_index::{LineIndex, PositionEncoding}, line_index::{LineIndex, PositionEncoding},
lsp_ext, lsp_ext,
lsp_utils::invalid_params_error, lsp_utils::invalid_params_error,
Result,
}; };
pub(crate) fn abs_path(url: &lsp_types::Url) -> Result<AbsPathBuf> { pub(crate) fn abs_path(url: &lsp_types::Url) -> anyhow::Result<AbsPathBuf> {
let path = url.to_file_path().map_err(|()| "url is not a file")?; let path = url.to_file_path().map_err(|()| anyhow::format_err!("url is not a file"))?;
Ok(AbsPathBuf::try_from(path).unwrap()) Ok(AbsPathBuf::try_from(path).unwrap())
} }
pub(crate) fn vfs_path(url: &lsp_types::Url) -> Result<vfs::VfsPath> { pub(crate) fn vfs_path(url: &lsp_types::Url) -> anyhow::Result<vfs::VfsPath> {
abs_path(url).map(vfs::VfsPath::from) abs_path(url).map(vfs::VfsPath::from)
} }
pub(crate) fn offset(line_index: &LineIndex, position: lsp_types::Position) -> Result<TextSize> { pub(crate) fn offset(
line_index: &LineIndex,
position: lsp_types::Position,
) -> anyhow::Result<TextSize> {
let line_col = match line_index.encoding { let line_col = match line_index.encoding {
PositionEncoding::Utf8 => LineCol { line: position.line, col: position.character }, PositionEncoding::Utf8 => LineCol { line: position.line, col: position.character },
PositionEncoding::Wide(enc) => { PositionEncoding::Wide(enc) => {
@ -42,7 +44,10 @@ pub(crate) fn offset(line_index: &LineIndex, position: lsp_types::Position) -> R
Ok(text_size) Ok(text_size)
} }
pub(crate) fn text_range(line_index: &LineIndex, range: lsp_types::Range) -> Result<TextRange> { pub(crate) fn text_range(
line_index: &LineIndex,
range: lsp_types::Range,
) -> anyhow::Result<TextRange> {
let start = offset(line_index, range.start)?; let start = offset(line_index, range.start)?;
let end = offset(line_index, range.end)?; let end = offset(line_index, range.end)?;
match end < start { match end < start {
@ -51,14 +56,14 @@ pub(crate) fn text_range(line_index: &LineIndex, range: lsp_types::Range) -> Res
} }
} }
pub(crate) fn file_id(snap: &GlobalStateSnapshot, url: &lsp_types::Url) -> Result<FileId> { pub(crate) fn file_id(snap: &GlobalStateSnapshot, url: &lsp_types::Url) -> anyhow::Result<FileId> {
snap.url_to_file_id(url) snap.url_to_file_id(url)
} }
pub(crate) fn file_position( pub(crate) fn file_position(
snap: &GlobalStateSnapshot, snap: &GlobalStateSnapshot,
tdpp: lsp_types::TextDocumentPositionParams, tdpp: lsp_types::TextDocumentPositionParams,
) -> Result<FilePosition> { ) -> anyhow::Result<FilePosition> {
let file_id = file_id(snap, &tdpp.text_document.uri)?; let file_id = file_id(snap, &tdpp.text_document.uri)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
let offset = offset(&line_index, tdpp.position)?; let offset = offset(&line_index, tdpp.position)?;
@ -69,7 +74,7 @@ pub(crate) fn file_range(
snap: &GlobalStateSnapshot, snap: &GlobalStateSnapshot,
text_document_identifier: lsp_types::TextDocumentIdentifier, text_document_identifier: lsp_types::TextDocumentIdentifier,
range: lsp_types::Range, range: lsp_types::Range,
) -> Result<FileRange> { ) -> anyhow::Result<FileRange> {
file_range_uri(snap, &text_document_identifier.uri, range) file_range_uri(snap, &text_document_identifier.uri, range)
} }
@ -77,7 +82,7 @@ pub(crate) fn file_range_uri(
snap: &GlobalStateSnapshot, snap: &GlobalStateSnapshot,
document: &lsp_types::Url, document: &lsp_types::Url,
range: lsp_types::Range, range: lsp_types::Range,
) -> Result<FileRange> { ) -> anyhow::Result<FileRange> {
let file_id = file_id(snap, document)?; let file_id = file_id(snap, document)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
let range = text_range(&line_index, range)?; let range = text_range(&line_index, range)?;
@ -101,7 +106,7 @@ pub(crate) fn assist_kind(kind: lsp_types::CodeActionKind) -> Option<AssistKind>
pub(crate) fn annotation( pub(crate) fn annotation(
snap: &GlobalStateSnapshot, snap: &GlobalStateSnapshot,
code_lens: lsp_types::CodeLens, code_lens: lsp_types::CodeLens,
) -> Result<Option<Annotation>> { ) -> anyhow::Result<Option<Annotation>> {
let data = let data =
code_lens.data.ok_or_else(|| invalid_params_error("code lens without data".to_string()))?; code_lens.data.ok_or_else(|| invalid_params_error("code lens without data".to_string()))?;
let resolve = from_json::<lsp_ext::CodeLensResolveData>("CodeLensResolveData", &data)?; let resolve = from_json::<lsp_ext::CodeLensResolveData>("CodeLensResolveData", &data)?;

View file

@ -30,7 +30,6 @@ use crate::{
reload::{self, SourceRootConfig}, reload::{self, SourceRootConfig},
task_pool::TaskPool, task_pool::TaskPool,
to_proto::url_from_abs_path, to_proto::url_from_abs_path,
Result,
}; };
// Enforces drop order // Enforces drop order
@ -422,7 +421,7 @@ impl Drop for GlobalState {
} }
impl GlobalStateSnapshot { impl GlobalStateSnapshot {
pub(crate) fn url_to_file_id(&self, url: &Url) -> Result<FileId> { pub(crate) fn url_to_file_id(&self, url: &Url) -> anyhow::Result<FileId> {
url_to_file_id(&self.vfs.read().0, url) url_to_file_id(&self.vfs.read().0, url)
} }
@ -481,8 +480,8 @@ pub(crate) fn file_id_to_url(vfs: &vfs::Vfs, id: FileId) -> Url {
url_from_abs_path(path) url_from_abs_path(path)
} }
pub(crate) fn url_to_file_id(vfs: &vfs::Vfs, url: &Url) -> Result<FileId> { pub(crate) fn url_to_file_id(vfs: &vfs::Vfs, url: &Url) -> anyhow::Result<FileId> {
let path = from_proto::vfs_path(url)?; let path = from_proto::vfs_path(url)?;
let res = vfs.file_id(&path).ok_or_else(|| format!("file not found: {path}"))?; let res = vfs.file_id(&path).ok_or_else(|| anyhow::format_err!("file not found: {path}"))?;
Ok(res) Ok(res)
} }

View file

@ -14,10 +14,10 @@ use vfs::{AbsPathBuf, ChangeKind, VfsPath};
use crate::{ use crate::{
config::Config, from_proto, global_state::GlobalState, lsp_ext::RunFlycheckParams, config::Config, from_proto, global_state::GlobalState, lsp_ext::RunFlycheckParams,
lsp_utils::apply_document_changes, mem_docs::DocumentData, reload, Result, lsp_utils::apply_document_changes, mem_docs::DocumentData, reload,
}; };
pub(crate) fn handle_cancel(state: &mut GlobalState, params: CancelParams) -> Result<()> { pub(crate) fn handle_cancel(state: &mut GlobalState, params: CancelParams) -> anyhow::Result<()> {
let id: lsp_server::RequestId = match params.id { let id: lsp_server::RequestId = match params.id {
lsp_types::NumberOrString::Number(id) => id.into(), lsp_types::NumberOrString::Number(id) => id.into(),
lsp_types::NumberOrString::String(id) => id.into(), lsp_types::NumberOrString::String(id) => id.into(),
@ -29,7 +29,7 @@ pub(crate) fn handle_cancel(state: &mut GlobalState, params: CancelParams) -> Re
pub(crate) fn handle_work_done_progress_cancel( pub(crate) fn handle_work_done_progress_cancel(
state: &mut GlobalState, state: &mut GlobalState,
params: WorkDoneProgressCancelParams, params: WorkDoneProgressCancelParams,
) -> Result<()> { ) -> anyhow::Result<()> {
if let lsp_types::NumberOrString::String(s) = &params.token { if let lsp_types::NumberOrString::String(s) = &params.token {
if let Some(id) = s.strip_prefix("rust-analyzer/flycheck/") { if let Some(id) = s.strip_prefix("rust-analyzer/flycheck/") {
if let Ok(id) = u32::from_str_radix(id, 10) { if let Ok(id) = u32::from_str_radix(id, 10) {
@ -49,7 +49,7 @@ pub(crate) fn handle_work_done_progress_cancel(
pub(crate) fn handle_did_open_text_document( pub(crate) fn handle_did_open_text_document(
state: &mut GlobalState, state: &mut GlobalState,
params: DidOpenTextDocumentParams, params: DidOpenTextDocumentParams,
) -> Result<()> { ) -> anyhow::Result<()> {
let _p = profile::span("handle_did_open_text_document"); let _p = profile::span("handle_did_open_text_document");
if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) { if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) {
@ -68,7 +68,7 @@ pub(crate) fn handle_did_open_text_document(
pub(crate) fn handle_did_change_text_document( pub(crate) fn handle_did_change_text_document(
state: &mut GlobalState, state: &mut GlobalState,
params: DidChangeTextDocumentParams, params: DidChangeTextDocumentParams,
) -> Result<()> { ) -> anyhow::Result<()> {
let _p = profile::span("handle_did_change_text_document"); let _p = profile::span("handle_did_change_text_document");
if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) { if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) {
@ -100,7 +100,7 @@ pub(crate) fn handle_did_change_text_document(
pub(crate) fn handle_did_close_text_document( pub(crate) fn handle_did_close_text_document(
state: &mut GlobalState, state: &mut GlobalState,
params: DidCloseTextDocumentParams, params: DidCloseTextDocumentParams,
) -> Result<()> { ) -> anyhow::Result<()> {
let _p = profile::span("handle_did_close_text_document"); let _p = profile::span("handle_did_close_text_document");
if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) { if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) {
@ -120,7 +120,7 @@ pub(crate) fn handle_did_close_text_document(
pub(crate) fn handle_did_save_text_document( pub(crate) fn handle_did_save_text_document(
state: &mut GlobalState, state: &mut GlobalState,
params: DidSaveTextDocumentParams, params: DidSaveTextDocumentParams,
) -> Result<()> { ) -> anyhow::Result<()> {
if let Ok(vfs_path) = from_proto::vfs_path(&params.text_document.uri) { if let Ok(vfs_path) = from_proto::vfs_path(&params.text_document.uri) {
// Re-fetch workspaces if a workspace related file has changed // Re-fetch workspaces if a workspace related file has changed
if let Some(abs_path) = vfs_path.as_path() { if let Some(abs_path) = vfs_path.as_path() {
@ -146,7 +146,7 @@ pub(crate) fn handle_did_save_text_document(
pub(crate) fn handle_did_change_configuration( pub(crate) fn handle_did_change_configuration(
state: &mut GlobalState, state: &mut GlobalState,
_params: DidChangeConfigurationParams, _params: DidChangeConfigurationParams,
) -> Result<()> { ) -> anyhow::Result<()> {
// As stated in https://github.com/microsoft/language-server-protocol/issues/676, // As stated in https://github.com/microsoft/language-server-protocol/issues/676,
// this notification's parameters should be ignored and the actual config queried separately. // this notification's parameters should be ignored and the actual config queried separately.
state.send_request::<lsp_types::request::WorkspaceConfiguration>( state.send_request::<lsp_types::request::WorkspaceConfiguration>(
@ -186,7 +186,7 @@ pub(crate) fn handle_did_change_configuration(
pub(crate) fn handle_did_change_workspace_folders( pub(crate) fn handle_did_change_workspace_folders(
state: &mut GlobalState, state: &mut GlobalState,
params: DidChangeWorkspaceFoldersParams, params: DidChangeWorkspaceFoldersParams,
) -> Result<()> { ) -> anyhow::Result<()> {
let config = Arc::make_mut(&mut state.config); let config = Arc::make_mut(&mut state.config);
for workspace in params.event.removed { for workspace in params.event.removed {
@ -214,7 +214,7 @@ pub(crate) fn handle_did_change_workspace_folders(
pub(crate) fn handle_did_change_watched_files( pub(crate) fn handle_did_change_watched_files(
state: &mut GlobalState, state: &mut GlobalState,
params: DidChangeWatchedFilesParams, params: DidChangeWatchedFilesParams,
) -> Result<()> { ) -> anyhow::Result<()> {
for change in params.changes { for change in params.changes {
if let Ok(path) = from_proto::abs_path(&change.uri) { if let Ok(path) = from_proto::abs_path(&change.uri) {
state.loader.handle.invalidate(path); state.loader.handle.invalidate(path);
@ -302,13 +302,13 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
} }
} }
pub(crate) fn handle_cancel_flycheck(state: &mut GlobalState, _: ()) -> Result<()> { pub(crate) fn handle_cancel_flycheck(state: &mut GlobalState, _: ()) -> anyhow::Result<()> {
let _p = profile::span("handle_stop_flycheck"); let _p = profile::span("handle_stop_flycheck");
state.flycheck.iter().for_each(|flycheck| flycheck.cancel()); state.flycheck.iter().for_each(|flycheck| flycheck.cancel());
Ok(()) Ok(())
} }
pub(crate) fn handle_clear_flycheck(state: &mut GlobalState, _: ()) -> Result<()> { pub(crate) fn handle_clear_flycheck(state: &mut GlobalState, _: ()) -> anyhow::Result<()> {
let _p = profile::span("handle_clear_flycheck"); let _p = profile::span("handle_clear_flycheck");
state.diagnostics.clear_check_all(); state.diagnostics.clear_check_all();
Ok(()) Ok(())
@ -317,7 +317,7 @@ pub(crate) fn handle_clear_flycheck(state: &mut GlobalState, _: ()) -> Result<()
pub(crate) fn handle_run_flycheck( pub(crate) fn handle_run_flycheck(
state: &mut GlobalState, state: &mut GlobalState,
params: RunFlycheckParams, params: RunFlycheckParams,
) -> Result<()> { ) -> anyhow::Result<()> {
let _p = profile::span("handle_run_flycheck"); let _p = profile::span("handle_run_flycheck");
if let Some(text_document) = params.text_document { if let Some(text_document) = params.text_document {
if let Ok(vfs_path) = from_proto::vfs_path(&text_document.uri) { if let Ok(vfs_path) = from_proto::vfs_path(&text_document.uri) {

View file

@ -43,10 +43,10 @@ use crate::{
FetchDependencyListResult, PositionOrRange, ViewCrateGraphParams, WorkspaceSymbolParams, FetchDependencyListResult, PositionOrRange, ViewCrateGraphParams, WorkspaceSymbolParams,
}, },
lsp_utils::{all_edits_are_disjoint, invalid_params_error}, lsp_utils::{all_edits_are_disjoint, invalid_params_error},
to_proto, LspError, Result, to_proto, LspError,
}; };
pub(crate) fn handle_workspace_reload(state: &mut GlobalState, _: ()) -> Result<()> { pub(crate) fn handle_workspace_reload(state: &mut GlobalState, _: ()) -> anyhow::Result<()> {
// FIXME: use `Arc::from_iter` when it becomes available // FIXME: use `Arc::from_iter` when it becomes available
state.proc_macro_clients = Arc::from(Vec::new()); state.proc_macro_clients = Arc::from(Vec::new());
state.proc_macro_changed = false; state.proc_macro_changed = false;
@ -55,7 +55,7 @@ pub(crate) fn handle_workspace_reload(state: &mut GlobalState, _: ()) -> Result<
Ok(()) Ok(())
} }
pub(crate) fn handle_proc_macros_rebuild(state: &mut GlobalState, _: ()) -> Result<()> { pub(crate) fn handle_proc_macros_rebuild(state: &mut GlobalState, _: ()) -> anyhow::Result<()> {
// FIXME: use `Arc::from_iter` when it becomes available // FIXME: use `Arc::from_iter` when it becomes available
state.proc_macro_clients = Arc::from(Vec::new()); state.proc_macro_clients = Arc::from(Vec::new());
state.proc_macro_changed = false; state.proc_macro_changed = false;
@ -67,7 +67,7 @@ pub(crate) fn handle_proc_macros_rebuild(state: &mut GlobalState, _: ()) -> Resu
pub(crate) fn handle_analyzer_status( pub(crate) fn handle_analyzer_status(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::AnalyzerStatusParams, params: lsp_ext::AnalyzerStatusParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_analyzer_status"); let _p = profile::span("handle_analyzer_status");
let mut buf = String::new(); let mut buf = String::new();
@ -112,7 +112,7 @@ pub(crate) fn handle_analyzer_status(
Ok(buf) Ok(buf)
} }
pub(crate) fn handle_memory_usage(state: &mut GlobalState, _: ()) -> Result<String> { pub(crate) fn handle_memory_usage(state: &mut GlobalState, _: ()) -> anyhow::Result<String> {
let _p = profile::span("handle_memory_usage"); let _p = profile::span("handle_memory_usage");
let mem = state.analysis_host.per_query_memory_usage(); let mem = state.analysis_host.per_query_memory_usage();
@ -125,7 +125,7 @@ pub(crate) fn handle_memory_usage(state: &mut GlobalState, _: ()) -> Result<Stri
Ok(out) Ok(out)
} }
pub(crate) fn handle_shuffle_crate_graph(state: &mut GlobalState, _: ()) -> Result<()> { pub(crate) fn handle_shuffle_crate_graph(state: &mut GlobalState, _: ()) -> anyhow::Result<()> {
state.analysis_host.shuffle_crate_graph(); state.analysis_host.shuffle_crate_graph();
Ok(()) Ok(())
} }
@ -133,7 +133,7 @@ pub(crate) fn handle_shuffle_crate_graph(state: &mut GlobalState, _: ()) -> Resu
pub(crate) fn handle_syntax_tree( pub(crate) fn handle_syntax_tree(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::SyntaxTreeParams, params: lsp_ext::SyntaxTreeParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_syntax_tree"); let _p = profile::span("handle_syntax_tree");
let id = from_proto::file_id(&snap, &params.text_document.uri)?; let id = from_proto::file_id(&snap, &params.text_document.uri)?;
let line_index = snap.file_line_index(id)?; let line_index = snap.file_line_index(id)?;
@ -145,7 +145,7 @@ pub(crate) fn handle_syntax_tree(
pub(crate) fn handle_view_hir( pub(crate) fn handle_view_hir(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_view_hir"); let _p = profile::span("handle_view_hir");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
let res = snap.analysis.view_hir(position)?; let res = snap.analysis.view_hir(position)?;
@ -155,7 +155,7 @@ pub(crate) fn handle_view_hir(
pub(crate) fn handle_view_mir( pub(crate) fn handle_view_mir(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_view_mir"); let _p = profile::span("handle_view_mir");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
let res = snap.analysis.view_mir(position)?; let res = snap.analysis.view_mir(position)?;
@ -165,7 +165,7 @@ pub(crate) fn handle_view_mir(
pub(crate) fn handle_interpret_function( pub(crate) fn handle_interpret_function(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_interpret_function"); let _p = profile::span("handle_interpret_function");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
let res = snap.analysis.interpret_function(position)?; let res = snap.analysis.interpret_function(position)?;
@ -175,7 +175,7 @@ pub(crate) fn handle_interpret_function(
pub(crate) fn handle_view_file_text( pub(crate) fn handle_view_file_text(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentIdentifier, params: lsp_types::TextDocumentIdentifier,
) -> Result<String> { ) -> anyhow::Result<String> {
let file_id = from_proto::file_id(&snap, &params.uri)?; let file_id = from_proto::file_id(&snap, &params.uri)?;
Ok(snap.analysis.file_text(file_id)?.to_string()) Ok(snap.analysis.file_text(file_id)?.to_string())
} }
@ -183,7 +183,7 @@ pub(crate) fn handle_view_file_text(
pub(crate) fn handle_view_item_tree( pub(crate) fn handle_view_item_tree(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::ViewItemTreeParams, params: lsp_ext::ViewItemTreeParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_view_item_tree"); let _p = profile::span("handle_view_item_tree");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let res = snap.analysis.view_item_tree(file_id)?; let res = snap.analysis.view_item_tree(file_id)?;
@ -193,16 +193,16 @@ pub(crate) fn handle_view_item_tree(
pub(crate) fn handle_view_crate_graph( pub(crate) fn handle_view_crate_graph(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: ViewCrateGraphParams, params: ViewCrateGraphParams,
) -> Result<String> { ) -> anyhow::Result<String> {
let _p = profile::span("handle_view_crate_graph"); let _p = profile::span("handle_view_crate_graph");
let dot = snap.analysis.view_crate_graph(params.full)??; let dot = snap.analysis.view_crate_graph(params.full)?.map_err(anyhow::Error::msg)?;
Ok(dot) Ok(dot)
} }
pub(crate) fn handle_expand_macro( pub(crate) fn handle_expand_macro(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::ExpandMacroParams, params: lsp_ext::ExpandMacroParams,
) -> Result<Option<lsp_ext::ExpandedMacro>> { ) -> anyhow::Result<Option<lsp_ext::ExpandedMacro>> {
let _p = profile::span("handle_expand_macro"); let _p = profile::span("handle_expand_macro");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
@ -215,11 +215,11 @@ pub(crate) fn handle_expand_macro(
pub(crate) fn handle_selection_range( pub(crate) fn handle_selection_range(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::SelectionRangeParams, params: lsp_types::SelectionRangeParams,
) -> Result<Option<Vec<lsp_types::SelectionRange>>> { ) -> anyhow::Result<Option<Vec<lsp_types::SelectionRange>>> {
let _p = profile::span("handle_selection_range"); let _p = profile::span("handle_selection_range");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
let res: Result<Vec<lsp_types::SelectionRange>> = params let res: anyhow::Result<Vec<lsp_types::SelectionRange>> = params
.positions .positions
.into_iter() .into_iter()
.map(|position| { .map(|position| {
@ -258,7 +258,7 @@ pub(crate) fn handle_selection_range(
pub(crate) fn handle_matching_brace( pub(crate) fn handle_matching_brace(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::MatchingBraceParams, params: lsp_ext::MatchingBraceParams,
) -> Result<Vec<Position>> { ) -> anyhow::Result<Vec<Position>> {
let _p = profile::span("handle_matching_brace"); let _p = profile::span("handle_matching_brace");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
@ -281,7 +281,7 @@ pub(crate) fn handle_matching_brace(
pub(crate) fn handle_join_lines( pub(crate) fn handle_join_lines(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::JoinLinesParams, params: lsp_ext::JoinLinesParams,
) -> Result<Vec<lsp_types::TextEdit>> { ) -> anyhow::Result<Vec<lsp_types::TextEdit>> {
let _p = profile::span("handle_join_lines"); let _p = profile::span("handle_join_lines");
let config = snap.config.join_lines(); let config = snap.config.join_lines();
@ -306,7 +306,7 @@ pub(crate) fn handle_join_lines(
pub(crate) fn handle_on_enter( pub(crate) fn handle_on_enter(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<Option<Vec<lsp_ext::SnippetTextEdit>>> { ) -> anyhow::Result<Option<Vec<lsp_ext::SnippetTextEdit>>> {
let _p = profile::span("handle_on_enter"); let _p = profile::span("handle_on_enter");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
let edit = match snap.analysis.on_enter(position)? { let edit = match snap.analysis.on_enter(position)? {
@ -321,7 +321,7 @@ pub(crate) fn handle_on_enter(
pub(crate) fn handle_on_type_formatting( pub(crate) fn handle_on_type_formatting(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::DocumentOnTypeFormattingParams, params: lsp_types::DocumentOnTypeFormattingParams,
) -> Result<Option<Vec<lsp_ext::SnippetTextEdit>>> { ) -> anyhow::Result<Option<Vec<lsp_ext::SnippetTextEdit>>> {
let _p = profile::span("handle_on_type_formatting"); let _p = profile::span("handle_on_type_formatting");
let mut position = from_proto::file_position(&snap, params.text_document_position)?; let mut position = from_proto::file_position(&snap, params.text_document_position)?;
let line_index = snap.file_line_index(position.file_id)?; let line_index = snap.file_line_index(position.file_id)?;
@ -361,7 +361,7 @@ pub(crate) fn handle_on_type_formatting(
pub(crate) fn handle_document_symbol( pub(crate) fn handle_document_symbol(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::DocumentSymbolParams, params: lsp_types::DocumentSymbolParams,
) -> Result<Option<lsp_types::DocumentSymbolResponse>> { ) -> anyhow::Result<Option<lsp_types::DocumentSymbolResponse>> {
let _p = profile::span("handle_document_symbol"); let _p = profile::span("handle_document_symbol");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
@ -450,7 +450,7 @@ pub(crate) fn handle_document_symbol(
pub(crate) fn handle_workspace_symbol( pub(crate) fn handle_workspace_symbol(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: WorkspaceSymbolParams, params: WorkspaceSymbolParams,
) -> Result<Option<Vec<SymbolInformation>>> { ) -> anyhow::Result<Option<Vec<SymbolInformation>>> {
let _p = profile::span("handle_workspace_symbol"); let _p = profile::span("handle_workspace_symbol");
let config = snap.config.workspace_symbol(); let config = snap.config.workspace_symbol();
@ -513,7 +513,10 @@ pub(crate) fn handle_workspace_symbol(
(all_symbols, libs) (all_symbols, libs)
} }
fn exec_query(snap: &GlobalStateSnapshot, query: Query) -> Result<Vec<SymbolInformation>> { fn exec_query(
snap: &GlobalStateSnapshot,
query: Query,
) -> anyhow::Result<Vec<SymbolInformation>> {
let mut res = Vec::new(); let mut res = Vec::new();
for nav in snap.analysis.symbol_search(query)? { for nav in snap.analysis.symbol_search(query)? {
let container_name = nav.container_name.as_ref().map(|v| v.to_string()); let container_name = nav.container_name.as_ref().map(|v| v.to_string());
@ -542,7 +545,7 @@ pub(crate) fn handle_workspace_symbol(
pub(crate) fn handle_will_rename_files( pub(crate) fn handle_will_rename_files(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::RenameFilesParams, params: lsp_types::RenameFilesParams,
) -> Result<Option<lsp_types::WorkspaceEdit>> { ) -> anyhow::Result<Option<lsp_types::WorkspaceEdit>> {
let _p = profile::span("handle_will_rename_files"); let _p = profile::span("handle_will_rename_files");
let source_changes: Vec<SourceChange> = params let source_changes: Vec<SourceChange> = params
@ -604,7 +607,7 @@ pub(crate) fn handle_will_rename_files(
pub(crate) fn handle_goto_definition( pub(crate) fn handle_goto_definition(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::GotoDefinitionParams, params: lsp_types::GotoDefinitionParams,
) -> Result<Option<lsp_types::GotoDefinitionResponse>> { ) -> anyhow::Result<Option<lsp_types::GotoDefinitionResponse>> {
let _p = profile::span("handle_goto_definition"); let _p = profile::span("handle_goto_definition");
let position = from_proto::file_position(&snap, params.text_document_position_params)?; let position = from_proto::file_position(&snap, params.text_document_position_params)?;
let nav_info = match snap.analysis.goto_definition(position)? { let nav_info = match snap.analysis.goto_definition(position)? {
@ -619,7 +622,7 @@ pub(crate) fn handle_goto_definition(
pub(crate) fn handle_goto_declaration( pub(crate) fn handle_goto_declaration(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::request::GotoDeclarationParams, params: lsp_types::request::GotoDeclarationParams,
) -> Result<Option<lsp_types::request::GotoDeclarationResponse>> { ) -> anyhow::Result<Option<lsp_types::request::GotoDeclarationResponse>> {
let _p = profile::span("handle_goto_declaration"); let _p = profile::span("handle_goto_declaration");
let position = from_proto::file_position(&snap, params.text_document_position_params.clone())?; let position = from_proto::file_position(&snap, params.text_document_position_params.clone())?;
let nav_info = match snap.analysis.goto_declaration(position)? { let nav_info = match snap.analysis.goto_declaration(position)? {
@ -634,7 +637,7 @@ pub(crate) fn handle_goto_declaration(
pub(crate) fn handle_goto_implementation( pub(crate) fn handle_goto_implementation(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::request::GotoImplementationParams, params: lsp_types::request::GotoImplementationParams,
) -> Result<Option<lsp_types::request::GotoImplementationResponse>> { ) -> anyhow::Result<Option<lsp_types::request::GotoImplementationResponse>> {
let _p = profile::span("handle_goto_implementation"); let _p = profile::span("handle_goto_implementation");
let position = from_proto::file_position(&snap, params.text_document_position_params)?; let position = from_proto::file_position(&snap, params.text_document_position_params)?;
let nav_info = match snap.analysis.goto_implementation(position)? { let nav_info = match snap.analysis.goto_implementation(position)? {
@ -649,7 +652,7 @@ pub(crate) fn handle_goto_implementation(
pub(crate) fn handle_goto_type_definition( pub(crate) fn handle_goto_type_definition(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::request::GotoTypeDefinitionParams, params: lsp_types::request::GotoTypeDefinitionParams,
) -> Result<Option<lsp_types::request::GotoTypeDefinitionResponse>> { ) -> anyhow::Result<Option<lsp_types::request::GotoTypeDefinitionResponse>> {
let _p = profile::span("handle_goto_type_definition"); let _p = profile::span("handle_goto_type_definition");
let position = from_proto::file_position(&snap, params.text_document_position_params)?; let position = from_proto::file_position(&snap, params.text_document_position_params)?;
let nav_info = match snap.analysis.goto_type_definition(position)? { let nav_info = match snap.analysis.goto_type_definition(position)? {
@ -664,7 +667,7 @@ pub(crate) fn handle_goto_type_definition(
pub(crate) fn handle_parent_module( pub(crate) fn handle_parent_module(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<Option<lsp_types::GotoDefinitionResponse>> { ) -> anyhow::Result<Option<lsp_types::GotoDefinitionResponse>> {
let _p = profile::span("handle_parent_module"); let _p = profile::span("handle_parent_module");
if let Ok(file_path) = &params.text_document.uri.to_file_path() { if let Ok(file_path) = &params.text_document.uri.to_file_path() {
if file_path.file_name().unwrap_or_default() == "Cargo.toml" { if file_path.file_name().unwrap_or_default() == "Cargo.toml" {
@ -731,7 +734,7 @@ pub(crate) fn handle_parent_module(
pub(crate) fn handle_runnables( pub(crate) fn handle_runnables(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::RunnablesParams, params: lsp_ext::RunnablesParams,
) -> Result<Vec<lsp_ext::Runnable>> { ) -> anyhow::Result<Vec<lsp_ext::Runnable>> {
let _p = profile::span("handle_runnables"); let _p = profile::span("handle_runnables");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let line_index = snap.file_line_index(file_id)?; let line_index = snap.file_line_index(file_id)?;
@ -826,7 +829,7 @@ fn should_skip_for_offset(runnable: &Runnable, offset: Option<TextSize>) -> bool
pub(crate) fn handle_related_tests( pub(crate) fn handle_related_tests(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<Vec<lsp_ext::TestInfo>> { ) -> anyhow::Result<Vec<lsp_ext::TestInfo>> {
let _p = profile::span("handle_related_tests"); let _p = profile::span("handle_related_tests");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
@ -844,7 +847,7 @@ pub(crate) fn handle_related_tests(
pub(crate) fn handle_completion( pub(crate) fn handle_completion(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::CompletionParams, params: lsp_types::CompletionParams,
) -> Result<Option<lsp_types::CompletionResponse>> { ) -> anyhow::Result<Option<lsp_types::CompletionResponse>> {
let _p = profile::span("handle_completion"); let _p = profile::span("handle_completion");
let text_document_position = params.text_document_position.clone(); let text_document_position = params.text_document_position.clone();
let position = from_proto::file_position(&snap, params.text_document_position)?; let position = from_proto::file_position(&snap, params.text_document_position)?;
@ -872,7 +875,7 @@ pub(crate) fn handle_completion(
pub(crate) fn handle_completion_resolve( pub(crate) fn handle_completion_resolve(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
mut original_completion: CompletionItem, mut original_completion: CompletionItem,
) -> Result<CompletionItem> { ) -> anyhow::Result<CompletionItem> {
let _p = profile::span("handle_completion_resolve"); let _p = profile::span("handle_completion_resolve");
if !all_edits_are_disjoint(&original_completion, &[]) { if !all_edits_are_disjoint(&original_completion, &[]) {
@ -928,7 +931,7 @@ pub(crate) fn handle_completion_resolve(
pub(crate) fn handle_folding_range( pub(crate) fn handle_folding_range(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: FoldingRangeParams, params: FoldingRangeParams,
) -> Result<Option<Vec<FoldingRange>>> { ) -> anyhow::Result<Option<Vec<FoldingRange>>> {
let _p = profile::span("handle_folding_range"); let _p = profile::span("handle_folding_range");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let folds = snap.analysis.folding_ranges(file_id)?; let folds = snap.analysis.folding_ranges(file_id)?;
@ -945,7 +948,7 @@ pub(crate) fn handle_folding_range(
pub(crate) fn handle_signature_help( pub(crate) fn handle_signature_help(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::SignatureHelpParams, params: lsp_types::SignatureHelpParams,
) -> Result<Option<lsp_types::SignatureHelp>> { ) -> anyhow::Result<Option<lsp_types::SignatureHelp>> {
let _p = profile::span("handle_signature_help"); let _p = profile::span("handle_signature_help");
let position = from_proto::file_position(&snap, params.text_document_position_params)?; let position = from_proto::file_position(&snap, params.text_document_position_params)?;
let help = match snap.analysis.signature_help(position)? { let help = match snap.analysis.signature_help(position)? {
@ -960,7 +963,7 @@ pub(crate) fn handle_signature_help(
pub(crate) fn handle_hover( pub(crate) fn handle_hover(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::HoverParams, params: lsp_ext::HoverParams,
) -> Result<Option<lsp_ext::Hover>> { ) -> anyhow::Result<Option<lsp_ext::Hover>> {
let _p = profile::span("handle_hover"); let _p = profile::span("handle_hover");
let range = match params.position { let range = match params.position {
PositionOrRange::Position(position) => Range::new(position, position), PositionOrRange::Position(position) => Range::new(position, position),
@ -997,7 +1000,7 @@ pub(crate) fn handle_hover(
pub(crate) fn handle_prepare_rename( pub(crate) fn handle_prepare_rename(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<Option<PrepareRenameResponse>> { ) -> anyhow::Result<Option<PrepareRenameResponse>> {
let _p = profile::span("handle_prepare_rename"); let _p = profile::span("handle_prepare_rename");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
@ -1011,7 +1014,7 @@ pub(crate) fn handle_prepare_rename(
pub(crate) fn handle_rename( pub(crate) fn handle_rename(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: RenameParams, params: RenameParams,
) -> Result<Option<WorkspaceEdit>> { ) -> anyhow::Result<Option<WorkspaceEdit>> {
let _p = profile::span("handle_rename"); let _p = profile::span("handle_rename");
let position = from_proto::file_position(&snap, params.text_document_position)?; let position = from_proto::file_position(&snap, params.text_document_position)?;
@ -1034,7 +1037,7 @@ pub(crate) fn handle_rename(
pub(crate) fn handle_references( pub(crate) fn handle_references(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::ReferenceParams, params: lsp_types::ReferenceParams,
) -> Result<Option<Vec<Location>>> { ) -> anyhow::Result<Option<Vec<Location>>> {
let _p = profile::span("handle_references"); let _p = profile::span("handle_references");
let position = from_proto::file_position(&snap, params.text_document_position)?; let position = from_proto::file_position(&snap, params.text_document_position)?;
@ -1077,7 +1080,7 @@ pub(crate) fn handle_references(
pub(crate) fn handle_formatting( pub(crate) fn handle_formatting(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::DocumentFormattingParams, params: lsp_types::DocumentFormattingParams,
) -> Result<Option<Vec<lsp_types::TextEdit>>> { ) -> anyhow::Result<Option<Vec<lsp_types::TextEdit>>> {
let _p = profile::span("handle_formatting"); let _p = profile::span("handle_formatting");
run_rustfmt(&snap, params.text_document, None) run_rustfmt(&snap, params.text_document, None)
@ -1086,7 +1089,7 @@ pub(crate) fn handle_formatting(
pub(crate) fn handle_range_formatting( pub(crate) fn handle_range_formatting(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::DocumentRangeFormattingParams, params: lsp_types::DocumentRangeFormattingParams,
) -> Result<Option<Vec<lsp_types::TextEdit>>> { ) -> anyhow::Result<Option<Vec<lsp_types::TextEdit>>> {
let _p = profile::span("handle_range_formatting"); let _p = profile::span("handle_range_formatting");
run_rustfmt(&snap, params.text_document, Some(params.range)) run_rustfmt(&snap, params.text_document, Some(params.range))
@ -1095,7 +1098,7 @@ pub(crate) fn handle_range_formatting(
pub(crate) fn handle_code_action( pub(crate) fn handle_code_action(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::CodeActionParams, params: lsp_types::CodeActionParams,
) -> Result<Option<Vec<lsp_ext::CodeAction>>> { ) -> anyhow::Result<Option<Vec<lsp_ext::CodeAction>>> {
let _p = profile::span("handle_code_action"); let _p = profile::span("handle_code_action");
if !snap.config.code_action_literals() { if !snap.config.code_action_literals() {
@ -1158,7 +1161,7 @@ pub(crate) fn handle_code_action(
pub(crate) fn handle_code_action_resolve( pub(crate) fn handle_code_action_resolve(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
mut code_action: lsp_ext::CodeAction, mut code_action: lsp_ext::CodeAction,
) -> Result<lsp_ext::CodeAction> { ) -> anyhow::Result<lsp_ext::CodeAction> {
let _p = profile::span("handle_code_action_resolve"); let _p = profile::span("handle_code_action_resolve");
let params = match code_action.data.take() { let params = match code_action.data.take() {
Some(it) => it, Some(it) => it,
@ -1219,7 +1222,7 @@ pub(crate) fn handle_code_action_resolve(
Ok(code_action) Ok(code_action)
} }
fn parse_action_id(action_id: &str) -> Result<(usize, SingleResolve), String> { fn parse_action_id(action_id: &str) -> anyhow::Result<(usize, SingleResolve), String> {
let id_parts = action_id.split(':').collect::<Vec<_>>(); let id_parts = action_id.split(':').collect::<Vec<_>>();
match id_parts.as_slice() { match id_parts.as_slice() {
[assist_id_string, assist_kind_string, index_string] => { [assist_id_string, assist_kind_string, index_string] => {
@ -1237,7 +1240,7 @@ fn parse_action_id(action_id: &str) -> Result<(usize, SingleResolve), String> {
pub(crate) fn handle_code_lens( pub(crate) fn handle_code_lens(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::CodeLensParams, params: lsp_types::CodeLensParams,
) -> Result<Option<Vec<CodeLens>>> { ) -> anyhow::Result<Option<Vec<CodeLens>>> {
let _p = profile::span("handle_code_lens"); let _p = profile::span("handle_code_lens");
let lens_config = snap.config.lens(); let lens_config = snap.config.lens();
@ -1280,7 +1283,7 @@ pub(crate) fn handle_code_lens(
pub(crate) fn handle_code_lens_resolve( pub(crate) fn handle_code_lens_resolve(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
code_lens: CodeLens, code_lens: CodeLens,
) -> Result<CodeLens> { ) -> anyhow::Result<CodeLens> {
let Some(annotation) = from_proto::annotation(&snap, code_lens.clone())? else { return Ok(code_lens) }; let Some(annotation) = from_proto::annotation(&snap, code_lens.clone())? else { return Ok(code_lens) };
let annotation = snap.analysis.resolve_annotation(annotation)?; let annotation = snap.analysis.resolve_annotation(annotation)?;
@ -1301,7 +1304,7 @@ pub(crate) fn handle_code_lens_resolve(
pub(crate) fn handle_document_highlight( pub(crate) fn handle_document_highlight(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::DocumentHighlightParams, params: lsp_types::DocumentHighlightParams,
) -> Result<Option<Vec<lsp_types::DocumentHighlight>>> { ) -> anyhow::Result<Option<Vec<lsp_types::DocumentHighlight>>> {
let _p = profile::span("handle_document_highlight"); let _p = profile::span("handle_document_highlight");
let position = from_proto::file_position(&snap, params.text_document_position_params)?; let position = from_proto::file_position(&snap, params.text_document_position_params)?;
let line_index = snap.file_line_index(position.file_id)?; let line_index = snap.file_line_index(position.file_id)?;
@ -1323,7 +1326,7 @@ pub(crate) fn handle_document_highlight(
pub(crate) fn handle_ssr( pub(crate) fn handle_ssr(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::SsrParams, params: lsp_ext::SsrParams,
) -> Result<lsp_types::WorkspaceEdit> { ) -> anyhow::Result<lsp_types::WorkspaceEdit> {
let _p = profile::span("handle_ssr"); let _p = profile::span("handle_ssr");
let selections = params let selections = params
.selections .selections
@ -1343,7 +1346,7 @@ pub(crate) fn handle_ssr(
pub(crate) fn handle_inlay_hints( pub(crate) fn handle_inlay_hints(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: InlayHintParams, params: InlayHintParams,
) -> Result<Option<Vec<InlayHint>>> { ) -> anyhow::Result<Option<Vec<InlayHint>>> {
let _p = profile::span("handle_inlay_hints"); let _p = profile::span("handle_inlay_hints");
let document_uri = &params.text_document.uri; let document_uri = &params.text_document.uri;
let FileRange { file_id, range } = from_proto::file_range( let FileRange { file_id, range } = from_proto::file_range(
@ -1365,7 +1368,7 @@ pub(crate) fn handle_inlay_hints(
pub(crate) fn handle_inlay_hints_resolve( pub(crate) fn handle_inlay_hints_resolve(
_snap: GlobalStateSnapshot, _snap: GlobalStateSnapshot,
hint: InlayHint, hint: InlayHint,
) -> Result<InlayHint> { ) -> anyhow::Result<InlayHint> {
let _p = profile::span("handle_inlay_hints_resolve"); let _p = profile::span("handle_inlay_hints_resolve");
Ok(hint) Ok(hint)
} }
@ -1373,7 +1376,7 @@ pub(crate) fn handle_inlay_hints_resolve(
pub(crate) fn handle_call_hierarchy_prepare( pub(crate) fn handle_call_hierarchy_prepare(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: CallHierarchyPrepareParams, params: CallHierarchyPrepareParams,
) -> Result<Option<Vec<CallHierarchyItem>>> { ) -> anyhow::Result<Option<Vec<CallHierarchyItem>>> {
let _p = profile::span("handle_call_hierarchy_prepare"); let _p = profile::span("handle_call_hierarchy_prepare");
let position = from_proto::file_position(&snap, params.text_document_position_params)?; let position = from_proto::file_position(&snap, params.text_document_position_params)?;
@ -1395,7 +1398,7 @@ pub(crate) fn handle_call_hierarchy_prepare(
pub(crate) fn handle_call_hierarchy_incoming( pub(crate) fn handle_call_hierarchy_incoming(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: CallHierarchyIncomingCallsParams, params: CallHierarchyIncomingCallsParams,
) -> Result<Option<Vec<CallHierarchyIncomingCall>>> { ) -> anyhow::Result<Option<Vec<CallHierarchyIncomingCall>>> {
let _p = profile::span("handle_call_hierarchy_incoming"); let _p = profile::span("handle_call_hierarchy_incoming");
let item = params.item; let item = params.item;
@ -1430,7 +1433,7 @@ pub(crate) fn handle_call_hierarchy_incoming(
pub(crate) fn handle_call_hierarchy_outgoing( pub(crate) fn handle_call_hierarchy_outgoing(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: CallHierarchyOutgoingCallsParams, params: CallHierarchyOutgoingCallsParams,
) -> Result<Option<Vec<CallHierarchyOutgoingCall>>> { ) -> anyhow::Result<Option<Vec<CallHierarchyOutgoingCall>>> {
let _p = profile::span("handle_call_hierarchy_outgoing"); let _p = profile::span("handle_call_hierarchy_outgoing");
let item = params.item; let item = params.item;
@ -1465,7 +1468,7 @@ pub(crate) fn handle_call_hierarchy_outgoing(
pub(crate) fn handle_semantic_tokens_full( pub(crate) fn handle_semantic_tokens_full(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: SemanticTokensParams, params: SemanticTokensParams,
) -> Result<Option<SemanticTokensResult>> { ) -> anyhow::Result<Option<SemanticTokensResult>> {
let _p = profile::span("handle_semantic_tokens_full"); let _p = profile::span("handle_semantic_tokens_full");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
@ -1495,7 +1498,7 @@ pub(crate) fn handle_semantic_tokens_full(
pub(crate) fn handle_semantic_tokens_full_delta( pub(crate) fn handle_semantic_tokens_full_delta(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: SemanticTokensDeltaParams, params: SemanticTokensDeltaParams,
) -> Result<Option<SemanticTokensFullDeltaResult>> { ) -> anyhow::Result<Option<SemanticTokensFullDeltaResult>> {
let _p = profile::span("handle_semantic_tokens_full_delta"); let _p = profile::span("handle_semantic_tokens_full_delta");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
@ -1535,7 +1538,7 @@ pub(crate) fn handle_semantic_tokens_full_delta(
pub(crate) fn handle_semantic_tokens_range( pub(crate) fn handle_semantic_tokens_range(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: SemanticTokensRangeParams, params: SemanticTokensRangeParams,
) -> Result<Option<SemanticTokensRangeResult>> { ) -> anyhow::Result<Option<SemanticTokensRangeResult>> {
let _p = profile::span("handle_semantic_tokens_range"); let _p = profile::span("handle_semantic_tokens_range");
let frange = from_proto::file_range(&snap, params.text_document, params.range)?; let frange = from_proto::file_range(&snap, params.text_document, params.range)?;
@ -1561,7 +1564,7 @@ pub(crate) fn handle_semantic_tokens_range(
pub(crate) fn handle_open_docs( pub(crate) fn handle_open_docs(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_types::TextDocumentPositionParams, params: lsp_types::TextDocumentPositionParams,
) -> Result<ExternalDocsResponse> { ) -> anyhow::Result<ExternalDocsResponse> {
let _p = profile::span("handle_open_docs"); let _p = profile::span("handle_open_docs");
let position = from_proto::file_position(&snap, params)?; let position = from_proto::file_position(&snap, params)?;
@ -1600,7 +1603,7 @@ pub(crate) fn handle_open_docs(
pub(crate) fn handle_open_cargo_toml( pub(crate) fn handle_open_cargo_toml(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::OpenCargoTomlParams, params: lsp_ext::OpenCargoTomlParams,
) -> Result<Option<lsp_types::GotoDefinitionResponse>> { ) -> anyhow::Result<Option<lsp_types::GotoDefinitionResponse>> {
let _p = profile::span("handle_open_cargo_toml"); let _p = profile::span("handle_open_cargo_toml");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
@ -1618,7 +1621,7 @@ pub(crate) fn handle_open_cargo_toml(
pub(crate) fn handle_move_item( pub(crate) fn handle_move_item(
snap: GlobalStateSnapshot, snap: GlobalStateSnapshot,
params: lsp_ext::MoveItemParams, params: lsp_ext::MoveItemParams,
) -> Result<Vec<lsp_ext::SnippetTextEdit>> { ) -> anyhow::Result<Vec<lsp_ext::SnippetTextEdit>> {
let _p = profile::span("handle_move_item"); let _p = profile::span("handle_move_item");
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?; let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let range = from_proto::file_range(&snap, params.text_document, params.range)?; let range = from_proto::file_range(&snap, params.text_document, params.range)?;
@ -1792,7 +1795,7 @@ fn run_rustfmt(
snap: &GlobalStateSnapshot, snap: &GlobalStateSnapshot,
text_document: TextDocumentIdentifier, text_document: TextDocumentIdentifier,
range: Option<lsp_types::Range>, range: Option<lsp_types::Range>,
) -> Result<Option<Vec<lsp_types::TextEdit>>> { ) -> anyhow::Result<Option<Vec<lsp_types::TextEdit>>> {
let file_id = from_proto::file_id(snap, &text_document.uri)?; let file_id = from_proto::file_id(snap, &text_document.uri)?;
let file = snap.analysis.file_text(file_id)?; let file = snap.analysis.file_text(file_id)?;
@ -1942,7 +1945,7 @@ fn run_rustfmt(
pub(crate) fn fetch_dependency_list( pub(crate) fn fetch_dependency_list(
state: GlobalStateSnapshot, state: GlobalStateSnapshot,
_params: FetchDependencyListParams, _params: FetchDependencyListParams,
) -> Result<FetchDependencyListResult> { ) -> anyhow::Result<FetchDependencyListResult> {
let crates = state.analysis.fetch_crates()?; let crates = state.analysis.fetch_crates()?;
let crate_infos = crates let crate_infos = crates
.into_iter() .into_iter()

View file

@ -54,13 +54,12 @@ use serde::de::DeserializeOwned;
pub use crate::{caps::server_capabilities, main_loop::main_loop, version::version}; pub use crate::{caps::server_capabilities, main_loop::main_loop, version::version};
pub type Error = Box<dyn std::error::Error + Send + Sync>; pub fn from_json<T: DeserializeOwned>(
pub type Result<T, E = Error> = std::result::Result<T, E>; what: &'static str,
json: &serde_json::Value,
pub fn from_json<T: DeserializeOwned>(what: &'static str, json: &serde_json::Value) -> Result<T> { ) -> anyhow::Result<T> {
let res = serde_json::from_value(json.clone()) serde_json::from_value(json.clone())
.map_err(|e| format!("Failed to deserialize {what}: {e}; {json}"))?; .map_err(|e| anyhow::format_err!("Failed to deserialize {what}: {e}; {json}"))
Ok(res)
} }
#[derive(Debug)] #[derive(Debug)]

View file

@ -23,10 +23,9 @@ use crate::{
lsp_ext, lsp_ext,
lsp_utils::{notification_is, Progress}, lsp_utils::{notification_is, Progress},
reload::{BuildDataProgress, ProcMacroProgress, ProjectWorkspaceProgress}, reload::{BuildDataProgress, ProcMacroProgress, ProjectWorkspaceProgress},
Result,
}; };
pub fn main_loop(config: Config, connection: Connection) -> Result<()> { pub fn main_loop(config: Config, connection: Connection) -> anyhow::Result<()> {
tracing::info!("initial config: {:#?}", config); tracing::info!("initial config: {:#?}", config);
// Windows scheduler implements priority boosts: if thread waits for an // Windows scheduler implements priority boosts: if thread waits for an
@ -109,7 +108,7 @@ impl fmt::Debug for Event {
} }
impl GlobalState { impl GlobalState {
fn run(mut self, inbox: Receiver<lsp_server::Message>) -> Result<()> { fn run(mut self, inbox: Receiver<lsp_server::Message>) -> anyhow::Result<()> {
self.update_status_or_notify(); self.update_status_or_notify();
if self.config.did_save_text_document_dynamic_registration() { if self.config.did_save_text_document_dynamic_registration() {
@ -134,7 +133,7 @@ impl GlobalState {
self.handle_event(event)?; self.handle_event(event)?;
} }
Err("client exited without proper shutdown sequence".into()) anyhow::bail!("client exited without proper shutdown sequence")
} }
fn register_did_save_capability(&mut self) { fn register_did_save_capability(&mut self) {
@ -191,7 +190,7 @@ impl GlobalState {
} }
} }
fn handle_event(&mut self, event: Event) -> Result<()> { fn handle_event(&mut self, event: Event) -> anyhow::Result<()> {
let loop_start = Instant::now(); let loop_start = Instant::now();
// NOTE: don't count blocking select! call as a loop-turn time // NOTE: don't count blocking select! call as a loop-turn time
let _p = profile::span("GlobalState::handle_event"); let _p = profile::span("GlobalState::handle_event");
@ -758,7 +757,7 @@ impl GlobalState {
} }
/// Handles an incoming notification. /// Handles an incoming notification.
fn on_notification(&mut self, not: Notification) -> Result<()> { fn on_notification(&mut self, not: Notification) -> anyhow::Result<()> {
use crate::handlers::notification as handlers; use crate::handlers::notification as handlers;
use lsp_types::notification as notifs; use lsp_types::notification as notifs;

View file

@ -78,7 +78,10 @@ impl<'a> Project<'a> {
INIT.call_once(|| { INIT.call_once(|| {
tracing_subscriber::fmt() tracing_subscriber::fmt()
.with_test_writer() .with_test_writer()
.with_env_filter(tracing_subscriber::EnvFilter::from_env("RA_LOG")) // FIXME: I am not smart enough to figure out how to use this with
// `tracing_subscriber::filter::Targets`.
//
// .with_env_filter(tracing_subscriber::EnvFilter::from_env("RA_LOG"))
.init(); .init();
profile::init_from(crate::PROFILE); profile::init_from(crate::PROFILE);
}); });