diff --git a/Cargo.lock b/Cargo.lock index 6173741b1a..330bdd1cba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1028,7 +1028,6 @@ dependencies = [ "ra_hir", "ra_ide_db", "ra_prof", - "ra_project_model", "ra_syntax", "ra_text_edit", "rand", diff --git a/crates/ra_ide/Cargo.toml b/crates/ra_ide/Cargo.toml index 486832529c..7235c944c9 100644 --- a/crates/ra_ide/Cargo.toml +++ b/crates/ra_ide/Cargo.toml @@ -21,7 +21,6 @@ rustc-hash = "1.1.0" rand = { version = "0.7.3", features = ["small_rng"] } ra_syntax = { path = "../ra_syntax" } -ra_project_model = { path = "../ra_project_model" } ra_text_edit = { path = "../ra_text_edit" } ra_db = { path = "../ra_db" } ra_ide_db = { path = "../ra_ide_db" } diff --git a/crates/ra_ide/src/inlay_hints.rs b/crates/ra_ide/src/inlay_hints.rs index 0f1c13c149..8454a975b6 100644 --- a/crates/ra_ide/src/inlay_hints.rs +++ b/crates/ra_ide/src/inlay_hints.rs @@ -3,7 +3,6 @@ use hir::{Adt, HirDisplay, Semantics, Type}; use ra_ide_db::RootDatabase; use ra_prof::profile; -use ra_project_model::{InlayHintDisplayType, InlayHintOptions}; use ra_syntax::{ ast::{self, ArgListOwner, AstNode, TypeAscriptionOwner}, match_ast, SmolStr, TextRange, @@ -11,7 +10,19 @@ use ra_syntax::{ use crate::{FileId, FunctionSignature}; -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct InlayConfig { + pub display_type: Vec, + pub max_length: Option, +} + +impl Default for InlayConfig { + fn default() -> Self { + Self { display_type: vec![InlayKind::TypeHint, InlayKind::ParameterHint], max_length: None } + } +} + +#[derive(Clone, Debug, PartialEq, Eq)] pub enum InlayKind { TypeHint, ParameterHint, @@ -27,7 +38,7 @@ pub struct InlayHint { pub(crate) fn inlay_hints( db: &RootDatabase, file_id: FileId, - inlay_hint_opts: &InlayHintOptions, + inlay_hint_opts: &InlayConfig, ) -> Vec { let _p = profile("inlay_hints"); let sema = Semantics::new(db); @@ -50,12 +61,11 @@ pub(crate) fn inlay_hints( fn get_param_name_hints( acc: &mut Vec, sema: &Semantics, - inlay_hint_opts: &InlayHintOptions, + inlay_hint_opts: &InlayConfig, expr: ast::Expr, ) -> Option<()> { - match inlay_hint_opts.display_type { - InlayHintDisplayType::Off | InlayHintDisplayType::TypeHints => return None, - _ => {} + if !inlay_hint_opts.display_type.contains(&InlayKind::ParameterHint) { + return None; } let args = match &expr { @@ -91,12 +101,11 @@ fn get_param_name_hints( fn get_bind_pat_hints( acc: &mut Vec, sema: &Semantics, - inlay_hint_opts: &InlayHintOptions, + inlay_hint_opts: &InlayConfig, pat: ast::BindPat, ) -> Option<()> { - match inlay_hint_opts.display_type { - InlayHintDisplayType::Off | InlayHintDisplayType::ParameterHints => return None, - _ => {} + if !inlay_hint_opts.display_type.contains(&InlayKind::TypeHint) { + return None; } let ty = sema.type_of_pat(&pat.clone().into())?; @@ -214,10 +223,10 @@ fn get_fn_signature(sema: &Semantics, expr: &ast::Expr) -> Option< #[cfg(test)] mod tests { + use crate::inlay_hints::{InlayConfig, InlayKind}; use insta::assert_debug_snapshot; use crate::mock_analysis::single_file; - use ra_project_model::{InlayHintDisplayType, InlayHintOptions}; #[test] fn param_hints_only() { @@ -228,7 +237,7 @@ mod tests { let _x = foo(4, 4); }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions{ display_type: InlayHintDisplayType::ParameterHints, max_length: None}).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig{ display_type: vec![InlayKind::ParameterHint], max_length: None}).unwrap(), @r###" [ InlayHint { range: [106; 107), @@ -252,7 +261,7 @@ mod tests { let _x = foo(4, 4); }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions{ display_type: InlayHintDisplayType::Off, max_length: None}).unwrap(), @r###"[]"###); + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig{ display_type: vec![], max_length: None}).unwrap(), @r###"[]"###); } #[test] @@ -264,7 +273,7 @@ mod tests { let _x = foo(4, 4); }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions{ display_type: InlayHintDisplayType::TypeHints, max_length: None}).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig{ display_type: vec![InlayKind::TypeHint], max_length: None}).unwrap(), @r###" [ InlayHint { range: [97; 99), @@ -288,7 +297,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [69; 71), @@ -345,7 +354,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [193; 197), @@ -425,7 +434,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [21; 30), @@ -489,7 +498,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [21; 30), @@ -539,7 +548,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [188; 192), @@ -634,7 +643,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [188; 192), @@ -729,7 +738,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [252; 256), @@ -801,7 +810,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(Some(8))).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig { display_type: vec![InlayKind::TypeHint, InlayKind::ParameterHint], max_length: Some(8) }).unwrap(), @r###" [ InlayHint { range: [74; 75), @@ -889,7 +898,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(None)).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig::default()).unwrap(), @r###" [ InlayHint { range: [798; 809), @@ -1011,7 +1020,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(Some(8))).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig { display_type: vec![InlayKind::TypeHint, InlayKind::ParameterHint], max_length: Some(8) }).unwrap(), @r###" [] "### ); @@ -1037,7 +1046,7 @@ fn main() { }"#, ); - assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayHintOptions::new(Some(8))).unwrap(), @r###" + assert_debug_snapshot!(analysis.inlay_hints(file_id, &InlayConfig { display_type: vec![InlayKind::TypeHint, InlayKind::ParameterHint], max_length: Some(8) }).unwrap(), @r###" [] "### ); diff --git a/crates/ra_ide/src/lib.rs b/crates/ra_ide/src/lib.rs index 8b1292a41e..a3acfd2253 100644 --- a/crates/ra_ide/src/lib.rs +++ b/crates/ra_ide/src/lib.rs @@ -44,7 +44,6 @@ mod marks; #[cfg(test)] mod test_utils; -use ra_project_model::InlayHintOptions; use std::sync::Arc; use ra_cfg::CfgOptions; @@ -69,7 +68,7 @@ pub use crate::{ expand_macro::ExpandedMacro, folding_ranges::{Fold, FoldKind}, hover::HoverResult, - inlay_hints::{InlayHint, InlayKind}, + inlay_hints::{InlayConfig, InlayHint, InlayKind}, references::{Declaration, Reference, ReferenceAccess, ReferenceKind, ReferenceSearchResult}, runnables::{Runnable, RunnableKind, TestId}, source_change::{FileSystemEdit, SourceChange, SourceFileEdit}, @@ -319,7 +318,7 @@ impl Analysis { pub fn inlay_hints( &self, file_id: FileId, - inlay_hint_opts: &InlayHintOptions, + inlay_hint_opts: &InlayConfig, ) -> Cancelable> { self.with_db(|db| inlay_hints::inlay_hints(db, file_id, inlay_hint_opts)) } diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs index a5012c0efd..036c8719fc 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs @@ -41,12 +41,6 @@ pub struct InlayHintOptions { pub max_length: Option, } -impl InlayHintOptions { - pub fn new(max_length: Option) -> Self { - Self { display_type: InlayHintDisplayType::Full, max_length } - } -} - impl Default for InlayHintOptions { fn default() -> Self { Self { display_type: InlayHintDisplayType::Full, max_length: None } diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 1617eab0b9..2f407723b9 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -7,12 +7,40 @@ //! configure the server itself, feature flags are passed into analysis, and //! tweak things like automatic insertion of `()` in completions. -use ra_project_model::InlayHintOptions; +use ra_ide::{InlayConfig, InlayKind}; use rustc_hash::FxHashMap; use ra_project_model::CargoFeatures; use serde::{Deserialize, Deserializer}; +#[derive(Deserialize)] +#[serde(remote = "InlayKind")] +pub enum InlayKindDef { + TypeHint, + ParameterHint, +} + +// Work-around until better serde support is added +// https://github.com/serde-rs/serde/issues/723#issuecomment-382501277 +fn vec_inlay_kind<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + #[derive(Deserialize)] + struct Wrapper(#[serde(with = "InlayKindDef")] InlayKind); + + let v = Vec::deserialize(deserializer)?; + Ok(v.into_iter().map(|Wrapper(a)| a).collect()) +} + +#[derive(Deserialize)] +#[serde(remote = "InlayConfig")] +pub struct InlayConfigDef { + #[serde(deserialize_with = "vec_inlay_kind")] + pub display_type: Vec, + pub max_length: Option, +} + /// Client provided initialization options #[derive(Deserialize, Clone, Debug, PartialEq, Eq)] #[serde(rename_all = "camelCase", default)] @@ -31,7 +59,8 @@ pub struct ServerConfig { pub lru_capacity: Option, - pub inlay_hint_opts: InlayHintOptions, + #[serde(with = "InlayConfigDef")] + pub inlay_hint_opts: InlayConfig, pub cargo_watch_enable: bool, pub cargo_watch_args: Vec, diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 91fb66abbe..729c384ace 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -177,7 +177,7 @@ pub fn main_loop( .and_then(|it| it.folding_range.as_ref()) .and_then(|it| it.line_folding_only) .unwrap_or(false), - inlay_hint_opts: config.inlay_hint_opts.clone(), + inlay_hint_opts: config.inlay_hint_opts, cargo_watch: CheckOptions { enable: config.cargo_watch_enable, args: config.cargo_watch_args, diff --git a/crates/rust-analyzer/src/main_loop/handlers.rs b/crates/rust-analyzer/src/main_loop/handlers.rs index fcb40432d4..4f58bcb0a1 100644 --- a/crates/rust-analyzer/src/main_loop/handlers.rs +++ b/crates/rust-analyzer/src/main_loop/handlers.rs @@ -997,7 +997,7 @@ pub fn handle_inlay_hints( let analysis = world.analysis(); let line_index = analysis.file_line_index(file_id)?; Ok(analysis - .inlay_hints(file_id, world.options.max_inlay_hint_length)? + .inlay_hints(file_id, &world.options.inlay_hint_opts)? .into_iter() .map(|api_type| InlayHint { label: api_type.label.to_string(), diff --git a/crates/rust-analyzer/src/world.rs b/crates/rust-analyzer/src/world.rs index 8043a6cd3b..6eb1ea7d27 100644 --- a/crates/rust-analyzer/src/world.rs +++ b/crates/rust-analyzer/src/world.rs @@ -13,9 +13,10 @@ use lsp_types::Url; use parking_lot::RwLock; use ra_cargo_watch::{url_from_path_with_drive_lowercasing, CheckOptions, CheckWatcher}; use ra_ide::{ - Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, LibraryData, SourceRootId, + Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, InlayConfig, LibraryData, + SourceRootId, }; -use ra_project_model::{get_rustc_cfg_options, InlayHintOptions, ProjectWorkspace}; +use ra_project_model::{get_rustc_cfg_options, ProjectWorkspace}; use ra_vfs::{LineEndings, RootEntry, Vfs, VfsChange, VfsFile, VfsRoot, VfsTask, Watch}; use relative_path::RelativePathBuf; @@ -32,7 +33,7 @@ pub struct Options { pub publish_decorations: bool, pub supports_location_link: bool, pub line_folding_only: bool, - pub inlay_hint_opts: InlayHintOptions, + pub inlay_hint_opts: InlayConfig, pub rustfmt_args: Vec, pub cargo_watch: CheckOptions, } diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index 5acce0752e..b26bf10dae 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts @@ -27,7 +27,9 @@ export class Config { private static readonly requiresReloadOpts = [ "cargoFeatures", "cargo-watch", - "highlighting.semanticTokens" + "highlighting.semanticTokens", + "inlayHintOpts.maxLength", + "inlayHintOpts.displayType", ] .map(opt => `${Config.rootSection}.${opt}`);