mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-11-03 13:13:18 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/master' into sync-from-rust
This commit is contained in:
		
						commit
						8d8292ec60
					
				
							
								
								
									
										37
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										37
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -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",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
				
			|||||||
@ -197,7 +197,11 @@ fn collect_import_map(db: &dyn DefDatabase, krate: CrateId) -> ImportMap {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        let visible_items = mod_data.scope.entries().filter_map(|(name, per_ns)| {
 | 
					        let visible_items = mod_data.scope.entries().filter_map(|(name, per_ns)| {
 | 
				
			||||||
            let per_ns = per_ns.filter_visibility(|vis| vis == Visibility::Public);
 | 
					            let per_ns = per_ns.filter_visibility(|vis| vis == Visibility::Public);
 | 
				
			||||||
            if per_ns.is_none() { None } else { Some((name, per_ns)) }
 | 
					            if per_ns.is_none() {
 | 
				
			||||||
 | 
					                None
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                Some((name, per_ns))
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (name, per_ns) in visible_items {
 | 
					        for (name, per_ns) in visible_items {
 | 
				
			||||||
 | 
				
			|||||||
@ -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"
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
				
			|||||||
@ -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",
 | 
				
			||||||
 | 
				
			|||||||
@ -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(())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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();
 | 
				
			||||||
 | 
				
			|||||||
@ -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,
 | 
				
			||||||
 | 
				
			|||||||
@ -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)?;
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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) = ¶ms.token {
 | 
					    if let lsp_types::NumberOrString::String(s) = ¶ms.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(¶ms.text_document.uri) {
 | 
					    if let Ok(path) = from_proto::vfs_path(¶ms.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(¶ms.text_document.uri) {
 | 
					    if let Ok(path) = from_proto::vfs_path(¶ms.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(¶ms.text_document.uri) {
 | 
					    if let Ok(path) = from_proto::vfs_path(¶ms.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(¶ms.text_document.uri) {
 | 
					    if let Ok(vfs_path) = from_proto::vfs_path(¶ms.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) {
 | 
				
			||||||
 | 
				
			|||||||
@ -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, ¶ms.text_document.uri)?;
 | 
					    let id = from_proto::file_id(&snap, ¶ms.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, ¶ms.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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) = ¶ms.text_document.uri.to_file_path() {
 | 
					    if let Ok(file_path) = ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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 = ¶ms.text_document.uri;
 | 
					    let document_uri = ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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, ¶ms.text_document.uri)?;
 | 
					    let file_id = from_proto::file_id(&snap, ¶ms.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()
 | 
				
			||||||
 | 
				
			|||||||
@ -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)]
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user