From ea320141c6f87383880878b91182355c9ad7dc7b Mon Sep 17 00:00:00 2001 From: Igor Aleksanov Date: Sat, 12 Sep 2020 17:14:17 +0300 Subject: Add postfix completion for format-like string literals --- crates/ide/src/completion/complete_postfix.rs | 56 +++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'crates/ide/src/completion/complete_postfix.rs') diff --git a/crates/ide/src/completion/complete_postfix.rs b/crates/ide/src/completion/complete_postfix.rs index 26a5af5b9..73a5f1439 100644 --- a/crates/ide/src/completion/complete_postfix.rs +++ b/crates/ide/src/completion/complete_postfix.rs @@ -6,6 +6,7 @@ use syntax::{ }; use text_edit::TextEdit; +use self::format_like::add_format_like_completions; use crate::{ completion::{ completion_config::SnippetCap, @@ -15,6 +16,8 @@ use crate::{ CompletionItem, CompletionItemKind, }; +mod format_like; + pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { if !ctx.config.enable_postfix_completions { return; @@ -207,6 +210,10 @@ pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { &format!("${{1}}({})", receiver_text), ) .add_to(acc); + + if ctx.is_string_literal { + add_format_like_completions(acc, ctx, &dot_receiver, cap, &receiver_text); + } } fn get_receiver_text(receiver: &ast::Expr, receiver_is_ambiguous_float_literal: bool) -> String { @@ -392,4 +399,53 @@ fn main() { check_edit("dbg", r#"fn main() { &&42.<|> }"#, r#"fn main() { dbg!(&&42) }"#); check_edit("refm", r#"fn main() { &&42.<|> }"#, r#"fn main() { &&&mut 42 }"#); } + + #[test] + fn postfix_completion_for_format_like_strings() { + check_edit( + "fmt", + r#"fn main() { "{some_var:?}".<|> }"#, + r#"fn main() { format!("{:?}", some_var) }"#, + ); + check_edit( + "panic", + r#"fn main() { "Panic with {a}".<|> }"#, + r#"fn main() { panic!("Panic with {}", a) }"#, + ); + check_edit( + "println", + r#"fn main() { "{ 2+2 } { SomeStruct { val: 1, other: 32 } :?}".<|> }"#, + r#"fn main() { println!("{} {:?}", 2+2, SomeStruct { val: 1, other: 32 }) }"#, + ); + check_edit( + "loge", + r#"fn main() { "{2+2}".<|> }"#, + r#"fn main() { log::error!("{}", 2+2) }"#, + ); + check_edit( + "logt", + r#"fn main() { "{2+2}".<|> }"#, + r#"fn main() { log::trace!("{}", 2+2) }"#, + ); + check_edit( + "logd", + r#"fn main() { "{2+2}".<|> }"#, + r#"fn main() { log::debug!("{}", 2+2) }"#, + ); + check_edit( + "logi", + r#"fn main() { "{2+2}".<|> }"#, + r#"fn main() { log::info!("{}", 2+2) }"#, + ); + check_edit( + "logw", + r#"fn main() { "{2+2}".<|> }"#, + r#"fn main() { log::warn!("{}", 2+2) }"#, + ); + check_edit( + "loge", + r#"fn main() { "{2+2}".<|> }"#, + r#"fn main() { log::error!("{}", 2+2) }"#, + ); + } } -- cgit v1.2.3