aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_ide/src/hover.rs114
1 files changed, 55 insertions, 59 deletions
diff --git a/crates/ra_ide/src/hover.rs b/crates/ra_ide/src/hover.rs
index e469f4166..933e9b714 100644
--- a/crates/ra_ide/src/hover.rs
+++ b/crates/ra_ide/src/hover.rs
@@ -389,10 +389,9 @@ mod tests {
389 assert_eq!(offset, position.into()); 389 assert_eq!(offset, position.into());
390 } 390 }
391 391
392 fn check_hover_result(ra_fixture: &str, expected: &[&str]) -> (String, Vec<HoverAction>) { 392 fn check_hover_result(ra_fixture: &str, expected: &str) -> (String, Vec<HoverAction>) {
393 let (analysis, position) = analysis_and_position(ra_fixture); 393 let (analysis, position) = analysis_and_position(ra_fixture);
394 let hover = analysis.hover(position).unwrap().unwrap(); 394 let hover = analysis.hover(position).unwrap().unwrap();
395 let expected = expected.join("\n\n___\n");
396 let actual = trim_markup(hover.info.markup.as_str()); 395 let actual = trim_markup(hover.info.markup.as_str());
397 assert_eq!(expected, actual); 396 assert_eq!(expected, actual);
398 397
@@ -423,8 +422,7 @@ fn main() {
423 422
424 #[test] 423 #[test]
425 fn hover_shows_long_type_of_an_expression() { 424 fn hover_shows_long_type_of_an_expression() {
426 check_hover_result( 425 check_hover_result(r#"
427 r#"
428 //- /main.rs 426 //- /main.rs
429 struct Scan<A, B, C> { 427 struct Scan<A, B, C> {
430 a: A, 428 a: A,
@@ -457,9 +455,7 @@ fn main() {
457 let number = 5u32; 455 let number = 5u32;
458 let mut iter<|> = scan(OtherStruct { i: num }, closure, number); 456 let mut iter<|> = scan(OtherStruct { i: num }, closure, number);
459 } 457 }
460 "#, 458 "#, "FakeIter<Scan<OtherStruct<OtherStruct<i32>>, |&mut u32, &u32, &mut u32| -> FakeOption<u32>, u32>>");
461 &["FakeIter<Scan<OtherStruct<OtherStruct<i32>>, |&mut u32, &u32, &mut u32| -> FakeOption<u32>, u32>>"],
462 );
463 } 459 }
464 460
465 #[test] 461 #[test]
@@ -474,7 +470,7 @@ fn main() {
474 let foo_test = fo<|>o(); 470 let foo_test = fo<|>o();
475 } 471 }
476 "#, 472 "#,
477 &["pub fn foo() -> u32"], 473 "pub fn foo() -> u32",
478 ); 474 );
479 475
480 // Multiple candidates but results are ambiguous. 476 // Multiple candidates but results are ambiguous.
@@ -498,7 +494,7 @@ fn main() {
498 let foo_test = fo<|>o(); 494 let foo_test = fo<|>o();
499 } 495 }
500 "#, 496 "#,
501 &["{unknown}"], 497 "{unknown}",
502 ); 498 );
503 } 499 }
504 500
@@ -513,7 +509,7 @@ fn main() {
513 let foo_test = fo<|>o(); 509 let foo_test = fo<|>o();
514 } 510 }
515 "#, 511 "#,
516 &["pub fn foo<'a, T: AsRef<str>>(b: &'a T) -> &'a str"], 512 "pub fn foo<'a, T: AsRef<str>>(b: &'a T) -> &'a str",
517 ); 513 );
518 } 514 }
519 515
@@ -527,7 +523,7 @@ fn main() {
527 fn main() { 523 fn main() {
528 } 524 }
529 "#, 525 "#,
530 &["pub fn foo(a: u32, b: u32) -> u32"], 526 "pub fn foo(a: u32, b: u32) -> u32",
531 ); 527 );
532 } 528 }
533 529
@@ -547,7 +543,7 @@ fn main() {
547 }; 543 };
548 } 544 }
549 "#, 545 "#,
550 &["Foo\n```\n\n```rust\nfield_a: u32"], 546 "Foo\n```\n\n```rust\nfield_a: u32",
551 ); 547 );
552 548
553 // Hovering over the field in the definition 549 // Hovering over the field in the definition
@@ -564,7 +560,7 @@ fn main() {
564 }; 560 };
565 } 561 }
566 "#, 562 "#,
567 &["Foo\n```\n\n```rust\nfield_a: u32"], 563 "Foo\n```\n\n```rust\nfield_a: u32",
568 ); 564 );
569 } 565 }
570 566
@@ -575,7 +571,7 @@ fn main() {
575 //- /main.rs 571 //- /main.rs
576 const foo<|>: u32 = 0; 572 const foo<|>: u32 = 0;
577 "#, 573 "#,
578 &["const foo: u32"], 574 "const foo: u32",
579 ); 575 );
580 576
581 check_hover_result( 577 check_hover_result(
@@ -583,7 +579,7 @@ fn main() {
583 //- /main.rs 579 //- /main.rs
584 static foo<|>: u32 = 0; 580 static foo<|>: u32 = 0;
585 "#, 581 "#,
586 &["static foo: u32"], 582 "static foo: u32",
587 ); 583 );
588 } 584 }
589 585
@@ -600,7 +596,7 @@ struct Test<K, T = u8> {
600fn main() { 596fn main() {
601 let zz<|> = Test { t: 23u8, k: 33 }; 597 let zz<|> = Test { t: 23u8, k: 33 };
602}"#, 598}"#,
603 &["Test<i32, u8>"], 599 "Test<i32, u8>",
604 ); 600 );
605 } 601 }
606 602
@@ -643,7 +639,7 @@ fn main() {
643 Non<|>e 639 Non<|>e
644 } 640 }
645 "#, 641 "#,
646 &[" 642 "
647Option 643Option
648``` 644```
649 645
@@ -654,7 +650,7 @@ ___
654 650
655The None variant 651The None variant
656 " 652 "
657 .trim()], 653 .trim(),
658 ); 654 );
659 655
660 check_hover_result( 656 check_hover_result(
@@ -668,7 +664,7 @@ The None variant
668 let s = Option::Som<|>e(12); 664 let s = Option::Som<|>e(12);
669 } 665 }
670 "#, 666 "#,
671 &[" 667 "
672Option 668Option
673``` 669```
674 670
@@ -679,7 +675,7 @@ ___
679 675
680The Some variant 676The Some variant
681 " 677 "
682 .trim()], 678 .trim(),
683 ); 679 );
684 } 680 }
685 681
@@ -900,7 +896,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
900 } 896 }
901 } 897 }
902 ", 898 ",
903 &["fn foo()"], 899 "fn foo()",
904 ); 900 );
905 901
906 assert_eq!(hover_on, "foo") 902 assert_eq!(hover_on, "foo")
@@ -918,7 +914,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
918 let a = id!(ba<|>r); 914 let a = id!(ba<|>r);
919 } 915 }
920 ", 916 ",
921 &["u32"], 917 "u32",
922 ); 918 );
923 919
924 assert_eq!(hover_on, "bar") 920 assert_eq!(hover_on, "bar")
@@ -939,7 +935,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
939 let a = id!(ba<|>r); 935 let a = id!(ba<|>r);
940 } 936 }
941 ", 937 ",
942 &["u32"], 938 "u32",
943 ); 939 );
944 940
945 assert_eq!(hover_on, "bar") 941 assert_eq!(hover_on, "bar")
@@ -963,7 +959,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
963 let a = id!([0u32, bar(<|>)] ); 959 let a = id!([0u32, bar(<|>)] );
964 } 960 }
965 ", 961 ",
966 &["u32"], 962 "u32",
967 ); 963 );
968 964
969 assert_eq!(hover_on, "bar()") 965 assert_eq!(hover_on, "bar()")
@@ -982,7 +978,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
982 let _ = arr!("Tr<|>acks", &mastered_for_itunes); 978 let _ = arr!("Tr<|>acks", &mastered_for_itunes);
983 } 979 }
984 "#, 980 "#,
985 &["&str"], 981 "&str",
986 ); 982 );
987 983
988 assert_eq!(hover_on, "\"Tracks\""); 984 assert_eq!(hover_on, "\"Tracks\"");
@@ -1001,7 +997,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1001 assert!(ba<|>r()); 997 assert!(ba<|>r());
1002 } 998 }
1003 ", 999 ",
1004 &["fn bar() -> bool"], 1000 "fn bar() -> bool",
1005 ); 1001 );
1006 1002
1007 assert_eq!(hover_on, "bar"); 1003 assert_eq!(hover_on, "bar");
@@ -1035,7 +1031,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1035 fo<|>o(); 1031 fo<|>o();
1036 } 1032 }
1037 ", 1033 ",
1038 &["fn foo()\n```\n___\n\n<- `\u{3000}` here"], 1034 "fn foo()\n```\n___\n\n<- `\u{3000}` here",
1039 ); 1035 );
1040 } 1036 }
1041 1037
@@ -1046,21 +1042,21 @@ fn func(foo: i32) { if true { <|>foo; }; }
1046 //- /lib.rs 1042 //- /lib.rs
1047 async fn foo<|>() {} 1043 async fn foo<|>() {}
1048 ", 1044 ",
1049 &["async fn foo()"], 1045 "async fn foo()",
1050 ); 1046 );
1051 check_hover_result( 1047 check_hover_result(
1052 r" 1048 r"
1053 //- /lib.rs 1049 //- /lib.rs
1054 pub const unsafe fn foo<|>() {} 1050 pub const unsafe fn foo<|>() {}
1055 ", 1051 ",
1056 &["pub const unsafe fn foo()"], 1052 "pub const unsafe fn foo()",
1057 ); 1053 );
1058 check_hover_result( 1054 check_hover_result(
1059 r#" 1055 r#"
1060 //- /lib.rs 1056 //- /lib.rs
1061 pub(crate) async unsafe extern "C" fn foo<|>() {} 1057 pub(crate) async unsafe extern "C" fn foo<|>() {}
1062 "#, 1058 "#,
1063 &[r#"pub(crate) async unsafe extern "C" fn foo()"#], 1059 r#"pub(crate) async unsafe extern "C" fn foo()"#,
1064 ); 1060 );
1065 } 1061 }
1066 1062
@@ -1071,7 +1067,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1071 //- /lib.rs 1067 //- /lib.rs
1072 unsafe trait foo<|>() {} 1068 unsafe trait foo<|>() {}
1073 ", 1069 ",
1074 &["unsafe trait foo"], 1070 "unsafe trait foo",
1075 ); 1071 );
1076 assert_impl_action(&actions[0], 13); 1072 assert_impl_action(&actions[0], 13);
1077 } 1073 }
@@ -1089,7 +1085,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1089 1085
1090 fn my() {} 1086 fn my() {}
1091 ", 1087 ",
1092 &["mod my"], 1088 "mod my",
1093 ); 1089 );
1094 } 1090 }
1095 1091
@@ -1105,7 +1101,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1105 let bar = Ba<|>r; 1101 let bar = Ba<|>r;
1106 } 1102 }
1107 "#, 1103 "#,
1108 &["struct Bar\n```\n___\n\nbar docs"], 1104 "struct Bar\n```\n___\n\nbar docs",
1109 ); 1105 );
1110 } 1106 }
1111 1107
@@ -1121,7 +1117,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1121 let bar = Ba<|>r; 1117 let bar = Ba<|>r;
1122 } 1118 }
1123 "#, 1119 "#,
1124 &["struct Bar\n```\n___\n\nbar docs"], 1120 "struct Bar\n```\n___\n\nbar docs",
1125 ); 1121 );
1126 } 1122 }
1127 1123
@@ -1139,7 +1135,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1139 let bar = Ba<|>r; 1135 let bar = Ba<|>r;
1140 } 1136 }
1141 "#, 1137 "#,
1142 &["struct Bar\n```\n___\n\nbar docs 0\n\nbar docs 1\n\nbar docs 2"], 1138 "struct Bar\n```\n___\n\nbar docs 0\n\nbar docs 1\n\nbar docs 2",
1143 ); 1139 );
1144 } 1140 }
1145 1141
@@ -1167,7 +1163,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1167 bar.fo<|>o(); 1163 bar.fo<|>o();
1168 } 1164 }
1169 "#, 1165 "#,
1170 &["Bar\n```\n\n```rust\nfn foo(&self)\n```\n___\n\n Do the foo"], 1166 "Bar\n```\n\n```rust\nfn foo(&self)\n```\n___\n\n Do the foo",
1171 ); 1167 );
1172 } 1168 }
1173 1169
@@ -1195,7 +1191,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1195 bar.fo<|>o(); 1191 bar.fo<|>o();
1196 } 1192 }
1197 "#, 1193 "#,
1198 &["Bar\n```\n\n```rust\nfn foo(&self)\n```\n___\n\nDo the foo"], 1194 "Bar\n```\n\n```rust\nfn foo(&self)\n```\n___\n\nDo the foo",
1199 ); 1195 );
1200 } 1196 }
1201 1197
@@ -1206,7 +1202,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1206 //- /lib.rs 1202 //- /lib.rs
1207 trait foo<|>() {} 1203 trait foo<|>() {}
1208 ", 1204 ",
1209 &["trait foo"], 1205 "trait foo",
1210 ); 1206 );
1211 assert_impl_action(&actions[0], 6); 1207 assert_impl_action(&actions[0], 6);
1212 } 1208 }
@@ -1218,7 +1214,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1218 //- /lib.rs 1214 //- /lib.rs
1219 struct foo<|>() {} 1215 struct foo<|>() {}
1220 ", 1216 ",
1221 &["struct foo"], 1217 "struct foo",
1222 ); 1218 );
1223 assert_impl_action(&actions[0], 7); 1219 assert_impl_action(&actions[0], 7);
1224 } 1220 }
@@ -1230,7 +1226,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1230 //- /lib.rs 1226 //- /lib.rs
1231 union foo<|>() {} 1227 union foo<|>() {}
1232 ", 1228 ",
1233 &["union foo"], 1229 "union foo",
1234 ); 1230 );
1235 assert_impl_action(&actions[0], 6); 1231 assert_impl_action(&actions[0], 6);
1236 } 1232 }
@@ -1245,7 +1241,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1245 B 1241 B
1246 } 1242 }
1247 ", 1243 ",
1248 &["enum foo"], 1244 "enum foo",
1249 ); 1245 );
1250 assert_impl_action(&actions[0], 5); 1246 assert_impl_action(&actions[0], 5);
1251 } 1247 }
@@ -1258,7 +1254,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1258 #[test] 1254 #[test]
1259 fn foo_<|>test() {} 1255 fn foo_<|>test() {}
1260 ", 1256 ",
1261 &["fn foo_test()"], 1257 "fn foo_test()",
1262 ); 1258 );
1263 assert_debug_snapshot!(actions, 1259 assert_debug_snapshot!(actions,
1264 @r###" 1260 @r###"
@@ -1304,7 +1300,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1304 fn foo_test() {} 1300 fn foo_test() {}
1305 } 1301 }
1306 ", 1302 ",
1307 &["mod tests"], 1303 "mod tests",
1308 ); 1304 );
1309 assert_debug_snapshot!(actions, 1305 assert_debug_snapshot!(actions,
1310 @r###" 1306 @r###"
@@ -1346,7 +1342,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1346 let s<|>t = S{ f1:0 }; 1342 let s<|>t = S{ f1:0 };
1347 } 1343 }
1348 ", 1344 ",
1349 &["S"], 1345 "S",
1350 ); 1346 );
1351 assert_debug_snapshot!(actions, 1347 assert_debug_snapshot!(actions,
1352 @r###" 1348 @r###"
@@ -1390,7 +1386,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1390 let s<|>t = S{ f1:Arg(0) }; 1386 let s<|>t = S{ f1:Arg(0) };
1391 } 1387 }
1392 ", 1388 ",
1393 &["S<Arg>"], 1389 "S<Arg>",
1394 ); 1390 );
1395 assert_debug_snapshot!(actions, 1391 assert_debug_snapshot!(actions,
1396 @r###" 1392 @r###"
@@ -1453,7 +1449,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1453 let s<|>t = S{ f1: S{ f1: Arg(0) } }; 1449 let s<|>t = S{ f1: S{ f1: Arg(0) } };
1454 } 1450 }
1455 ", 1451 ",
1456 &["S<S<Arg>>"], 1452 "S<S<Arg>>",
1457 ); 1453 );
1458 assert_debug_snapshot!(actions, 1454 assert_debug_snapshot!(actions,
1459 @r###" 1455 @r###"
@@ -1519,7 +1515,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1519 let s<|>t = (A(1), B(2), M::C(3) ); 1515 let s<|>t = (A(1), B(2), M::C(3) );
1520 } 1516 }
1521 ", 1517 ",
1522 &["(A, B, C)"], 1518 "(A, B, C)",
1523 ); 1519 );
1524 assert_debug_snapshot!(actions, 1520 assert_debug_snapshot!(actions,
1525 @r###" 1521 @r###"
@@ -1602,7 +1598,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1602 let s<|>t = foo(); 1598 let s<|>t = foo();
1603 } 1599 }
1604 ", 1600 ",
1605 &["impl Foo"], 1601 "impl Foo",
1606 ); 1602 );
1607 assert_debug_snapshot!(actions, 1603 assert_debug_snapshot!(actions,
1608 @r###" 1604 @r###"
@@ -1648,7 +1644,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1648 let s<|>t = foo(); 1644 let s<|>t = foo();
1649 } 1645 }
1650 ", 1646 ",
1651 &["impl Foo<S>"], 1647 "impl Foo<S>",
1652 ); 1648 );
1653 assert_debug_snapshot!(actions, 1649 assert_debug_snapshot!(actions,
1654 @r###" 1650 @r###"
@@ -1713,7 +1709,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1713 let s<|>t = foo(); 1709 let s<|>t = foo();
1714 } 1710 }
1715 ", 1711 ",
1716 &["impl Foo + Bar"], 1712 "impl Foo + Bar",
1717 ); 1713 );
1718 assert_debug_snapshot!(actions, 1714 assert_debug_snapshot!(actions,
1719 @r###" 1715 @r###"
@@ -1780,7 +1776,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1780 let s<|>t = foo(); 1776 let s<|>t = foo();
1781 } 1777 }
1782 ", 1778 ",
1783 &["impl Foo<S1> + Bar<S2>"], 1779 "impl Foo<S1> + Bar<S2>",
1784 ); 1780 );
1785 assert_debug_snapshot!(actions, 1781 assert_debug_snapshot!(actions,
1786 @r###" 1782 @r###"
@@ -1877,7 +1873,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1877 trait Foo {} 1873 trait Foo {}
1878 fn foo(ar<|>g: &impl Foo) {} 1874 fn foo(ar<|>g: &impl Foo) {}
1879 ", 1875 ",
1880 &["&impl Foo"], 1876 "&impl Foo",
1881 ); 1877 );
1882 assert_debug_snapshot!(actions, 1878 assert_debug_snapshot!(actions,
1883 @r###" 1879 @r###"
@@ -1920,7 +1916,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1920 1916
1921 fn foo(ar<|>g: &impl Foo + Bar<S>) {} 1917 fn foo(ar<|>g: &impl Foo + Bar<S>) {}
1922 ", 1918 ",
1923 &["&impl Foo + Bar<S>"], 1919 "&impl Foo + Bar<S>",
1924 ); 1920 );
1925 assert_debug_snapshot!(actions, 1921 assert_debug_snapshot!(actions,
1926 @r###" 1922 @r###"
@@ -1999,7 +1995,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
1999 struct S {} 1995 struct S {}
2000 fn foo(ar<|>g: &impl Foo<S>) {} 1996 fn foo(ar<|>g: &impl Foo<S>) {}
2001 ", 1997 ",
2002 &["&impl Foo<S>"], 1998 "&impl Foo<S>",
2003 ); 1999 );
2004 assert_debug_snapshot!(actions, 2000 assert_debug_snapshot!(actions,
2005 @r###" 2001 @r###"
@@ -2067,7 +2063,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
2067 let s<|>t = foo(); 2063 let s<|>t = foo();
2068 } 2064 }
2069 ", 2065 ",
2070 &["B<dyn Foo>"], 2066 "B<dyn Foo>",
2071 ); 2067 );
2072 assert_debug_snapshot!(actions, 2068 assert_debug_snapshot!(actions,
2073 @r###" 2069 @r###"
@@ -2126,7 +2122,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
2126 trait Foo {} 2122 trait Foo {}
2127 fn foo(ar<|>g: &dyn Foo) {} 2123 fn foo(ar<|>g: &dyn Foo) {}
2128 ", 2124 ",
2129 &["&dyn Foo"], 2125 "&dyn Foo",
2130 ); 2126 );
2131 assert_debug_snapshot!(actions, 2127 assert_debug_snapshot!(actions,
2132 @r###" 2128 @r###"
@@ -2167,7 +2163,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
2167 struct S {} 2163 struct S {}
2168 fn foo(ar<|>g: &dyn Foo<S>) {} 2164 fn foo(ar<|>g: &dyn Foo<S>) {}
2169 ", 2165 ",
2170 &["&dyn Foo<S>"], 2166 "&dyn Foo<S>",
2171 ); 2167 );
2172 assert_debug_snapshot!(actions, 2168 assert_debug_snapshot!(actions,
2173 @r###" 2169 @r###"
@@ -2230,7 +2226,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
2230 2226
2231 fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {} 2227 fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
2232 ", 2228 ",
2233 &["&impl ImplTrait<B<dyn DynTrait<B<S>>>>"], 2229 "&impl ImplTrait<B<dyn DynTrait<B<S>>>>",
2234 ); 2230 );
2235 assert_debug_snapshot!(actions, 2231 assert_debug_snapshot!(actions,
2236 @r###" 2232 @r###"
@@ -2344,7 +2340,7 @@ fn func(foo: i32) { if true { <|>foo; }; }
2344 let s<|>t = test().get(); 2340 let s<|>t = test().get();
2345 } 2341 }
2346 ", 2342 ",
2347 &["Foo::Item<impl Foo>"], 2343 "Foo::Item<impl Foo>",
2348 ); 2344 );
2349 assert_debug_snapshot!(actions, 2345 assert_debug_snapshot!(actions,
2350 @r###" 2346 @r###"