From 2400d70442364769b4ae18315fc178427d2d95a9 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 10 May 2020 06:22:26 +0800 Subject: Update cargo-metadata --- crates/ra_flycheck/Cargo.toml | 2 +- crates/ra_flycheck/src/lib.rs | 2 ++ crates/ra_proc_macro_srv/Cargo.toml | 4 ++-- .../tests/fixtures/test_serialize_proc_macro.txt | 21 +++++---------------- crates/ra_proc_macro_srv/src/tests/mod.rs | 6 +++--- crates/ra_proc_macro_srv/src/tests/utils.rs | 6 +++--- crates/ra_project_model/Cargo.toml | 2 +- crates/ra_project_model/src/cargo_workspace.rs | 14 +++++--------- 8 files changed, 22 insertions(+), 35 deletions(-) (limited to 'crates') diff --git a/crates/ra_flycheck/Cargo.toml b/crates/ra_flycheck/Cargo.toml index d0f7fb2dc..578a45894 100644 --- a/crates/ra_flycheck/Cargo.toml +++ b/crates/ra_flycheck/Cargo.toml @@ -11,7 +11,7 @@ doctest = false crossbeam-channel = "0.4.0" lsp-types = { version = "0.74.0", features = ["proposed"] } log = "0.4.8" -cargo_metadata = "0.9.1" +cargo_metadata = "0.10.0" serde_json = "1.0.48" jod-thread = "0.1.1" ra_env = { path = "../ra_env" } diff --git a/crates/ra_flycheck/src/lib.rs b/crates/ra_flycheck/src/lib.rs index d8b727b0e..39b02ca94 100644 --- a/crates/ra_flycheck/src/lib.rs +++ b/crates/ra_flycheck/src/lib.rs @@ -205,6 +205,8 @@ impl FlycheckThread { } CheckEvent::Msg(Message::BuildScriptExecuted(_msg)) => {} + CheckEvent::Msg(Message::BuildFinished(_)) => {} + CheckEvent::Msg(Message::TextLine(_)) => {} CheckEvent::Msg(Message::Unknown) => {} } } diff --git a/crates/ra_proc_macro_srv/Cargo.toml b/crates/ra_proc_macro_srv/Cargo.toml index 886e14870..bb3003278 100644 --- a/crates/ra_proc_macro_srv/Cargo.toml +++ b/crates/ra_proc_macro_srv/Cargo.toml @@ -18,7 +18,7 @@ memmap = "0.7" test_utils = { path = "../test_utils" } [dev-dependencies] -cargo_metadata = "0.9.1" +cargo_metadata = "0.10.0" difference = "2.0.0" # used as proc macro test target -serde_derive = "=1.0.106" +serde_derive = "1.0.106" diff --git a/crates/ra_proc_macro_srv/src/tests/fixtures/test_serialize_proc_macro.txt b/crates/ra_proc_macro_srv/src/tests/fixtures/test_serialize_proc_macro.txt index 6776f5231..bc010cfe9 100644 --- a/crates/ra_proc_macro_srv/src/tests/fixtures/test_serialize_proc_macro.txt +++ b/crates/ra_proc_macro_srv/src/tests/fixtures/test_serialize_proc_macro.txt @@ -20,26 +20,15 @@ SUBTREE $ PUNCH = [alone] 4294967295 SUBTREE {} 4294967295 PUNCH # [alone] 4294967295 - SUBTREE [] 4294967295 - IDENT allow 4294967295 - SUBTREE () 4294967295 - IDENT unknown_lints 4294967295 - PUNCH # [alone] 4294967295 - SUBTREE [] 4294967295 - IDENT cfg_attr 4294967295 - SUBTREE () 4294967295 - IDENT feature 4294967295 - PUNCH = [alone] 4294967295 - LITERAL "cargo-clippy" 0 - PUNCH , [alone] 4294967295 - IDENT allow 4294967295 - SUBTREE () 4294967295 - IDENT useless_attribute 4294967295 - PUNCH # [alone] 4294967295 SUBTREE [] 4294967295 IDENT allow 4294967295 SUBTREE () 4294967295 IDENT rust_2018_idioms 4294967295 + PUNCH , [alone] 4294967295 + IDENT clippy 4294967295 + PUNCH : [joint] 4294967295 + PUNCH : [alone] 4294967295 + IDENT useless_attribute 4294967295 IDENT extern 4294967295 IDENT crate 4294967295 IDENT serde 4294967295 diff --git a/crates/ra_proc_macro_srv/src/tests/mod.rs b/crates/ra_proc_macro_srv/src/tests/mod.rs index 9cf58511c..82cefbb29 100644 --- a/crates/ra_proc_macro_srv/src/tests/mod.rs +++ b/crates/ra_proc_macro_srv/src/tests/mod.rs @@ -10,7 +10,7 @@ fn test_derive_serialize_proc_macro() { assert_expand( "serde_derive", "Serialize", - "1.0.106", + "1.0", r##"struct Foo {}"##, include_str!("fixtures/test_serialize_proc_macro.txt"), ); @@ -21,7 +21,7 @@ fn test_derive_serialize_proc_macro_failed() { assert_expand( "serde_derive", "Serialize", - "1.0.106", + "1.0", r##" struct {} "##, @@ -37,7 +37,7 @@ SUBTREE $ #[test] fn test_derive_proc_macro_list() { - let res = list("serde_derive", "1.0.106").join("\n"); + let res = list("serde_derive", "1.0").join("\n"); assert_eq_text!( &res, diff --git a/crates/ra_proc_macro_srv/src/tests/utils.rs b/crates/ra_proc_macro_srv/src/tests/utils.rs index 646a427c5..71436eee0 100644 --- a/crates/ra_proc_macro_srv/src/tests/utils.rs +++ b/crates/ra_proc_macro_srv/src/tests/utils.rs @@ -8,7 +8,7 @@ use std::str::FromStr; use test_utils::assert_eq_text; mod fixtures { - use cargo_metadata::{parse_messages, Message}; + use cargo_metadata::Message; use std::process::Command; // Use current project metadata to get the proc-macro dylib path @@ -19,12 +19,12 @@ mod fixtures { .unwrap() .stdout; - for message in parse_messages(command.as_slice()) { + for message in Message::parse_stream(command.as_slice()) { match message.unwrap() { Message::CompilerArtifact(artifact) => { if artifact.target.kind.contains(&"proc-macro".to_string()) { let repr = format!("{} {}", crate_name, version); - if artifact.package_id.repr.starts_with(&repr) { + if artifact.package_id.repr.starts_with(dbg!(&repr)) { return artifact.filenames[0].clone(); } } diff --git a/crates/ra_project_model/Cargo.toml b/crates/ra_project_model/Cargo.toml index 626478468..946deed5d 100644 --- a/crates/ra_project_model/Cargo.toml +++ b/crates/ra_project_model/Cargo.toml @@ -11,7 +11,7 @@ doctest = false log = "0.4.8" rustc-hash = "1.1.0" -cargo_metadata = "0.9.1" +cargo_metadata = "0.10.0" ra_arena = { path = "../ra_arena" } ra_cfg = { path = "../ra_cfg" } diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index eb9f33ee8..9152a6d9d 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs @@ -162,7 +162,7 @@ impl CargoWorkspace { meta.current_dir(parent); } if let Some(target) = cargo_features.target.as_ref() { - meta.other_options(&[String::from("--filter-platform"), target.clone()]); + meta.other_options(vec![String::from("--filter-platform"), target.clone()]); } let meta = meta.exec().with_context(|| { format!("Failed to run `cargo metadata --manifest-path {}`", cargo_toml.display()) @@ -305,19 +305,13 @@ pub fn load_extern_resources( let mut res = ExternResources::default(); - for message in cargo_metadata::parse_messages(output.stdout.as_slice()) { + for message in cargo_metadata::Message::parse_stream(output.stdout.as_slice()) { if let Ok(message) = message { match message { Message::BuildScriptExecuted(BuildScript { package_id, out_dir, cfgs, .. }) => { res.out_dirs.insert(package_id.clone(), out_dir); - res.cfgs.insert( - package_id, - // FIXME: Current `cargo_metadata` uses `PathBuf` instead of `String`, - // change when https://github.com/oli-obk/cargo_metadata/pulls/112 reaches crates.io - cfgs.iter().filter_map(|c| c.to_str().map(|s| s.to_owned())).collect(), - ); + res.cfgs.insert(package_id, cfgs); } - Message::CompilerArtifact(message) => { if message.target.kind.contains(&"proc-macro".to_string()) { let package_id = message.package_id; @@ -330,6 +324,8 @@ pub fn load_extern_resources( } Message::CompilerMessage(_) => (), Message::Unknown => (), + Message::BuildFinished(_) => {} + Message::TextLine(_) => {} } } } -- cgit v1.2.3 From 3de3b52f10d6881a5e6cb5ccc6d6321eea9175fa Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 10 May 2020 06:39:36 +0800 Subject: Remove dbg --- crates/ra_proc_macro_srv/src/tests/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates') diff --git a/crates/ra_proc_macro_srv/src/tests/utils.rs b/crates/ra_proc_macro_srv/src/tests/utils.rs index 71436eee0..84348b5de 100644 --- a/crates/ra_proc_macro_srv/src/tests/utils.rs +++ b/crates/ra_proc_macro_srv/src/tests/utils.rs @@ -24,7 +24,7 @@ mod fixtures { Message::CompilerArtifact(artifact) => { if artifact.target.kind.contains(&"proc-macro".to_string()) { let repr = format!("{} {}", crate_name, version); - if artifact.package_id.repr.starts_with(dbg!(&repr)) { + if artifact.package_id.repr.starts_with(&repr) { return artifact.filenames[0].clone(); } } -- cgit v1.2.3 From 98a7bb24358c0f1e9353195d6933f5973c8edaba Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Sun, 10 May 2020 15:31:51 +0200 Subject: do not remove then block when you unwrap else block #4361 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_assists/src/handlers/unwrap_block.rs | 221 +++++++++++++++++++++---- 1 file changed, 193 insertions(+), 28 deletions(-) (limited to 'crates') diff --git a/crates/ra_assists/src/handlers/unwrap_block.rs b/crates/ra_assists/src/handlers/unwrap_block.rs index eba0631a4..e52ec557e 100644 --- a/crates/ra_assists/src/handlers/unwrap_block.rs +++ b/crates/ra_assists/src/handlers/unwrap_block.rs @@ -1,6 +1,6 @@ use crate::{AssistContext, AssistId, Assists}; -use ast::LoopBodyOwner; +use ast::{ElseBranch, Expr, LoopBodyOwner}; use ra_fmt::unwrap_trivial_block; use ra_syntax::{ast, match_ast, AstNode, TextRange, T}; @@ -25,19 +25,11 @@ pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext) -> Option<()> let l_curly_token = ctx.find_token_at_offset(T!['{'])?; let block = ast::BlockExpr::cast(l_curly_token.parent())?; let parent = block.syntax().parent()?; + let assist_id = AssistId("unwrap_block"); + let assist_label = "Unwrap block"; + let (expr, expr_to_unwrap) = match_ast! { match parent { - ast::IfExpr(if_expr) => { - let expr_to_unwrap = if_expr.blocks().find_map(|expr| extract_expr(ctx.frange.range, expr)); - let expr_to_unwrap = expr_to_unwrap?; - // Find if we are in a else if block - let ancestor = if_expr.syntax().parent().and_then(ast::IfExpr::cast); - - match ancestor { - None => (ast::Expr::IfExpr(if_expr), expr_to_unwrap), - Some(ancestor) => (ast::Expr::IfExpr(ancestor), expr_to_unwrap), - } - }, ast::ForExpr(for_expr) => { let block_expr = for_expr.loop_body()?; let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?; @@ -53,27 +45,62 @@ pub(crate) fn unwrap_block(acc: &mut Assists, ctx: &AssistContext) -> Option<()> let expr_to_unwrap = extract_expr(ctx.frange.range, block_expr)?; (ast::Expr::LoopExpr(loop_expr), expr_to_unwrap) }, + ast::IfExpr(if_expr) => { + let mut resp = None; + + let then_branch = if_expr.then_branch()?; + if then_branch.l_curly_token()?.text_range().contains_range(ctx.frange.range) { + if let Some(ancestor) = if_expr.syntax().parent().and_then(ast::IfExpr::cast) { + // For `else if` blocks + let ancestor_then_branch = ancestor.then_branch()?; + let l_curly_token = then_branch.l_curly_token()?; + + let target = then_branch.syntax().text_range(); + return acc.add(assist_id, assist_label, target, |edit| { + let range_to_del_else_if = TextRange::new(ancestor_then_branch.syntax().text_range().end(), l_curly_token.text_range().start()); + let range_to_del_rest = TextRange::new(then_branch.syntax().text_range().end(), if_expr.syntax().text_range().end()); + + edit.set_cursor(ancestor_then_branch.syntax().text_range().end()); + edit.delete(range_to_del_rest); + edit.delete(range_to_del_else_if); + edit.replace(target, update_expr_string(then_branch.to_string(), &[' ', '{'])); + }); + } else { + resp = Some((ast::Expr::IfExpr(if_expr.clone()), Expr::BlockExpr(then_branch))); + } + } else if let Some(else_branch) = if_expr.else_branch() { + match else_branch { + ElseBranch::Block(else_block) => { + let l_curly_token = else_block.l_curly_token()?; + if l_curly_token.text_range().contains_range(ctx.frange.range) { + let target = else_block.syntax().text_range(); + return acc.add(assist_id, assist_label, target, |edit| { + let range_to_del = TextRange::new(then_branch.syntax().text_range().end(), l_curly_token.text_range().start()); + + edit.set_cursor(then_branch.syntax().text_range().end()); + edit.delete(range_to_del); + edit.replace(target, update_expr_string(else_block.to_string(), &[' ', '{'])); + }); + } + }, + ElseBranch::IfExpr(_) => {}, + } + } + + resp? + }, _ => return None, } }; let target = expr_to_unwrap.syntax().text_range(); - acc.add(AssistId("unwrap_block"), "Unwrap block", target, |edit| { + acc.add(assist_id, assist_label, target, |edit| { edit.set_cursor(expr.syntax().text_range().start()); - let pat_start: &[_] = &[' ', '{', '\n']; - let expr_to_unwrap = expr_to_unwrap.to_string(); - let expr_string = expr_to_unwrap.trim_start_matches(pat_start); - let mut expr_string_lines: Vec<&str> = expr_string.lines().collect(); - expr_string_lines.pop(); // Delete last line - - let expr_string = expr_string_lines - .into_iter() - .map(|line| line.replacen(" ", "", 1)) // Delete indentation - .collect::>() - .join("\n"); - - edit.replace(expr.syntax().text_range(), expr_string); + edit.replace( + expr.syntax().text_range(), + update_expr_string(expr_to_unwrap.to_string(), &[' ', '{', '\n']), + ); }) } @@ -87,6 +114,18 @@ fn extract_expr(cursor_range: TextRange, block: ast::BlockExpr) -> Option String { + let expr_string = expr_str.trim_start_matches(trim_start_pat); + let mut expr_string_lines: Vec<&str> = expr_string.lines().collect(); + expr_string_lines.pop(); // Delete last line + + expr_string_lines + .into_iter() + .map(|line| line.replacen(" ", "", 1)) // Delete indentation + .collect::>() + .join("\n") +} + #[cfg(test)] mod tests { use crate::tests::{check_assist, check_assist_not_applicable}; @@ -142,7 +181,13 @@ mod tests { r#" fn main() { bar(); - <|>println!("bar"); + if true { + foo(); + + //comment + bar(); + }<|> + println!("bar"); } "#, ); @@ -170,7 +215,127 @@ mod tests { r#" fn main() { //bar(); - <|>println!("bar"); + if true { + println!("true"); + + //comment + //bar(); + }<|> + println!("bar"); + } + "#, + ); + } + + #[test] + fn simple_if_else_if_nested() { + check_assist( + unwrap_block, + r#" + fn main() { + //bar(); + if true { + println!("true"); + + //comment + //bar(); + } else if false { + println!("bar"); + } else if true {<|> + println!("foo"); + } + } + "#, + r#" + fn main() { + //bar(); + if true { + println!("true"); + + //comment + //bar(); + } else if false { + println!("bar"); + }<|> + println!("foo"); + } + "#, + ); + } + + #[test] + fn simple_if_else_if_nested_else() { + check_assist( + unwrap_block, + r#" + fn main() { + //bar(); + if true { + println!("true"); + + //comment + //bar(); + } else if false { + println!("bar"); + } else if true { + println!("foo"); + } else {<|> + println!("else"); + } + } + "#, + r#" + fn main() { + //bar(); + if true { + println!("true"); + + //comment + //bar(); + } else if false { + println!("bar"); + } else if true { + println!("foo"); + }<|> + println!("else"); + } + "#, + ); + } + + #[test] + fn simple_if_else_if_nested_middle() { + check_assist( + unwrap_block, + r#" + fn main() { + //bar(); + if true { + println!("true"); + + //comment + //bar(); + } else if false { + println!("bar"); + } else if true {<|> + println!("foo"); + } else { + println!("else"); + } + } + "#, + r#" + fn main() { + //bar(); + if true { + println!("true"); + + //comment + //bar(); + } else if false { + println!("bar"); + }<|> + println!("foo"); } "#, ); -- cgit v1.2.3 From cbbbd4832582256820695bb73fdb4ca125f1b1f9 Mon Sep 17 00:00:00 2001 From: Timo Freiberg Date: Sun, 10 May 2020 18:09:22 +0200 Subject: Omit default types in HirDisplay SourceCode mode --- .../ra_assists/src/handlers/add_explicit_type.rs | 2 +- crates/ra_hir_ty/src/display.rs | 63 ++++++++++++---------- crates/ra_hir_ty/src/tests/display_source_code.rs | 27 ++++++++++ 3 files changed, 64 insertions(+), 28 deletions(-) (limited to 'crates') diff --git a/crates/ra_assists/src/handlers/add_explicit_type.rs b/crates/ra_assists/src/handlers/add_explicit_type.rs index 146cc75df..7ced00626 100644 --- a/crates/ra_assists/src/handlers/add_explicit_type.rs +++ b/crates/ra_assists/src/handlers/add_explicit_type.rs @@ -209,7 +209,7 @@ struct Test { } fn main() { - let test<|>: Test = Test { t: 23, k: 33 }; + let test<|>: Test = Test { t: 23, k: 33 }; }"#, ); } diff --git a/crates/ra_hir_ty/src/display.rs b/crates/ra_hir_ty/src/display.rs index f5edaea8c..b9c4d2e89 100644 --- a/crates/ra_hir_ty/src/display.rs +++ b/crates/ra_hir_ty/src/display.rs @@ -136,6 +136,12 @@ enum DisplayTarget { SourceCode { module_id: ModuleId }, } +impl DisplayTarget { + fn is_source_code(&self) -> bool { + matches!(self, Self::SourceCode {..}) + } +} + #[derive(Debug)] pub enum DisplaySourceCodeError { PathNotFound, @@ -303,37 +309,40 @@ impl HirDisplay for ApplicationTy { if self.parameters.len() > 0 { let mut non_default_parameters = Vec::with_capacity(self.parameters.len()); - let parameters_to_write = if f.omit_verbose_types() { - match self - .ctor - .as_generic_def() - .map(|generic_def_id| f.db.generic_defaults(generic_def_id)) - .filter(|defaults| !defaults.is_empty()) - { - None => self.parameters.0.as_ref(), - Some(default_parameters) => { - for (i, parameter) in self.parameters.iter().enumerate() { - match (parameter, default_parameters.get(i)) { - (&Ty::Unknown, _) | (_, None) => { - non_default_parameters.push(parameter.clone()) - } - (_, Some(default_parameter)) - if parameter != default_parameter => - { - non_default_parameters.push(parameter.clone()) + let parameters_to_write = + if f.display_target.is_source_code() || f.omit_verbose_types() { + match self + .ctor + .as_generic_def() + .map(|generic_def_id| f.db.generic_defaults(generic_def_id)) + .filter(|defaults| !defaults.is_empty()) + { + None => self.parameters.0.as_ref(), + Some(default_parameters) => { + for (i, parameter) in self.parameters.iter().enumerate() { + match (parameter, default_parameters.get(i)) { + (&Ty::Unknown, _) | (_, None) => { + non_default_parameters.push(parameter.clone()) + } + (_, Some(default_parameter)) + if parameter != default_parameter => + { + non_default_parameters.push(parameter.clone()) + } + _ => (), } - _ => (), } + &non_default_parameters } - &non_default_parameters } - } - } else { - self.parameters.0.as_ref() - }; - write!(f, "<")?; - f.write_joined(parameters_to_write, ", ")?; - write!(f, ">")?; + } else { + self.parameters.0.as_ref() + }; + if !parameters_to_write.is_empty() { + write!(f, "<")?; + f.write_joined(parameters_to_write, ", ")?; + write!(f, ">")?; + } } } TypeCtor::AssociatedType(type_alias) => { diff --git a/crates/ra_hir_ty/src/tests/display_source_code.rs b/crates/ra_hir_ty/src/tests/display_source_code.rs index ca1748615..4088b1d22 100644 --- a/crates/ra_hir_ty/src/tests/display_source_code.rs +++ b/crates/ra_hir_ty/src/tests/display_source_code.rs @@ -21,3 +21,30 @@ fn bar() { ); assert_eq!("foo::Foo", displayed_source_at_pos(&db, pos)); } + +#[test] +fn omit_default_type_parameters() { + let (db, pos) = TestDB::with_position( + r" + //- /main.rs + struct Foo { t: T } + fn main() { + let foo = Foo { t: 5 }; + foo<|>; + } + ", + ); + assert_eq!("Foo", displayed_source_at_pos(&db, pos)); + + let (db, pos) = TestDB::with_position( + r" + //- /main.rs + struct Foo { k: K, t: T } + fn main() { + let foo = Foo { k: 400, t: 5 }; + foo<|>; + } + ", + ); + assert_eq!("Foo", displayed_source_at_pos(&db, pos)); +} -- cgit v1.2.3