]> git.proxmox.com Git - rustc.git/blame - src/tools/rust-analyzer/crates/ide-completion/src/completions/postfix/format_like.rs
New upstream version 1.66.0+dfsg1
[rustc.git] / src / tools / rust-analyzer / crates / ide-completion / src / completions / postfix / format_like.rs
CommitLineData
064997fb
FG
1// Feature: Format String Completion
2//
3// `"Result {result} is {2 + 2}"` is expanded to the `"Result {} is {}", result, 2 + 2`.
4//
5// The following postfix snippets are available:
6//
7// * `format` -> `format!(...)`
8// * `panic` -> `panic!(...)`
9// * `println` -> `println!(...)`
10// * `log`:
11// ** `logd` -> `log::debug!(...)`
12// ** `logt` -> `log::trace!(...)`
13// ** `logi` -> `log::info!(...)`
14// ** `logw` -> `log::warn!(...)`
15// ** `loge` -> `log::error!(...)`
16//
17// image::https://user-images.githubusercontent.com/48062697/113020656-b560f500-917a-11eb-87de-02991f61beb8.gif[]
18
2b03887a
FG
19use ide_db::{
20 syntax_helpers::format_string_exprs::{parse_format_exprs, with_placeholders},
21 SnippetCap,
22};
23use syntax::{ast, AstToken};
064997fb
FG
24
25use crate::{
26 completions::postfix::build_postfix_snippet_builder, context::CompletionContext, Completions,
27};
28
29/// Mapping ("postfix completion item" => "macro to use")
30static KINDS: &[(&str, &str)] = &[
31 ("format", "format!"),
32 ("panic", "panic!"),
33 ("println", "println!"),
34 ("eprintln", "eprintln!"),
35 ("logd", "log::debug!"),
36 ("logt", "log::trace!"),
37 ("logi", "log::info!"),
38 ("logw", "log::warn!"),
39 ("loge", "log::error!"),
40];
41
42pub(crate) fn add_format_like_completions(
43 acc: &mut Completions,
44 ctx: &CompletionContext<'_>,
45 dot_receiver: &ast::Expr,
46 cap: SnippetCap,
47 receiver_text: &ast::String,
48) {
064997fb
FG
49 let postfix_snippet = match build_postfix_snippet_builder(ctx, cap, dot_receiver) {
50 Some(it) => it,
51 None => return,
52 };
064997fb 53
2b03887a
FG
54 if let Ok((out, exprs)) = parse_format_exprs(receiver_text.text()) {
55 let exprs = with_placeholders(exprs);
064997fb 56 for (label, macro_name) in KINDS {
2b03887a 57 let snippet = format!(r#"{}({}, {})"#, macro_name, out, exprs.join(", "));
064997fb
FG
58
59 postfix_snippet(label, macro_name, &snippet).add_to(acc);
60 }
61 }
62}
63
064997fb
FG
64#[cfg(test)]
65mod tests {
66 use super::*;
064997fb
FG
67
68 #[test]
69 fn test_into_suggestion() {
70 let test_vector = &[
71 ("println!", "{}", r#"println!("{}", $1)"#),
72 ("eprintln!", "{}", r#"eprintln!("{}", $1)"#),
73 (
74 "log::info!",
75 "{} {expr} {} {2 + 2}",
76 r#"log::info!("{} {} {} {}", $1, expr, $2, 2 + 2)"#,
77 ),
78 ("format!", "{expr:?}", r#"format!("{:?}", expr)"#),
79 ];
80
81 for (kind, input, output) in test_vector {
2b03887a
FG
82 let (parsed_string, exprs) = parse_format_exprs(input).unwrap();
83 let exprs = with_placeholders(exprs);
84 let snippet = format!(r#"{}("{}", {})"#, kind, parsed_string, exprs.join(", "));
85 assert_eq!(&snippet, output);
064997fb
FG
86 }
87 }
88}