@@ -728,6 +728,363 @@ fn foo(x: Result<i32, ()>) {
728728 ) ;
729729 }
730730
731+ #[ test]
732+ fn test_if_let_with_match_variant_nested_or_literal ( ) {
733+ check_assist (
734+ replace_if_let_with_match,
735+ r#"
736+ //- minicore: result
737+ fn foo(x: Result<&[i32], ()>) {
738+ let foo: Result<&[_], ()> = Ok(&[0, 1, 2]);
739+ $0if let Ok([]) = foo {
740+ ()
741+ } else {
742+ ()
743+ }
744+ }
745+ "# ,
746+ r#"
747+ fn foo(x: Result<&[i32], ()>) {
748+ let foo: Result<&[_], ()> = Ok(&[0, 1, 2]);
749+ match foo {
750+ Ok([]) => (),
751+ _ => (),
752+ }
753+ }
754+ "# ,
755+ ) ;
756+
757+ check_assist (
758+ replace_if_let_with_match,
759+ r#"
760+ //- minicore: result
761+ fn foo(x: Result<&'static str, ()>) {
762+ let bar: Result<&_, ()> = Ok("bar");
763+ $0if let Ok("foo") = bar {
764+ ()
765+ } else {
766+ ()
767+ }
768+ }
769+ "# ,
770+ r#"
771+ fn foo(x: Result<&'static str, ()>) {
772+ let bar: Result<&_, ()> = Ok("bar");
773+ match bar {
774+ Ok("foo") => (),
775+ _ => (),
776+ }
777+ }
778+ "# ,
779+ ) ;
780+
781+ check_assist (
782+ replace_if_let_with_match,
783+ r#"
784+ //- minicore: result
785+ fn foo(x: Result<[&'static str; 2], ()>) {
786+ let foobar: Result<_, ()> = Ok(["foo", "bar"]);
787+ $0if let Ok([_, "bar"]) = foobar {
788+ ()
789+ } else {
790+ ()
791+ }
792+ }
793+ "# ,
794+ r#"
795+ fn foo(x: Result<[&'static str; 2], ()>) {
796+ let foobar: Result<_, ()> = Ok(["foo", "bar"]);
797+ match foobar {
798+ Ok([_, "bar"]) => (),
799+ _ => (),
800+ }
801+ }
802+ "# ,
803+ ) ;
804+
805+ check_assist (
806+ replace_if_let_with_match,
807+ r#"
808+ //- minicore: result
809+ fn foo(x: Result<Option<[&'static str; 2]>, ()>) {
810+ let foobar: Result<_, ()> = Ok(Some(["foo", "bar"]));
811+ $0if let Ok(Some([_, "bar"])) = foobar {
812+ ()
813+ } else {
814+ ()
815+ }
816+ }
817+ "# ,
818+ r#"
819+ fn foo(x: Result<Option<[&'static str; 2]>, ()>) {
820+ let foobar: Result<_, ()> = Ok(Some(["foo", "bar"]));
821+ match foobar {
822+ Ok(Some([_, "bar"])) => (),
823+ _ => (),
824+ }
825+ }
826+ "# ,
827+ ) ;
828+
829+ check_assist (
830+ replace_if_let_with_match,
831+ r#"
832+ //- minicore: result
833+ fn foo(x: Result<(i32, i32, i32), ()>) {
834+ let bar: Result<(i32, i32, i32), ()> = Ok((1, 2, 3));
835+ $0if let Ok((1, second, third)) = bar {
836+ ()
837+ } else {
838+ ()
839+ }
840+ }
841+ "# ,
842+ r#"
843+ fn foo(x: Result<(i32, i32, i32), ()>) {
844+ let bar: Result<(i32, i32, i32), ()> = Ok((1, 2, 3));
845+ match bar {
846+ Ok((1, second, third)) => (),
847+ _ => (),
848+ }
849+ }
850+ "# ,
851+ ) ;
852+
853+ check_assist (
854+ replace_if_let_with_match,
855+ r#"
856+ //- minicore: result
857+ fn foo(x: Result<i32, ()>) {
858+ let bar: Result<i32, ()> = Ok(1);
859+ $0if let Ok(1 | 2) = bar {
860+ ()
861+ } else {
862+ ()
863+ }
864+ }
865+ "# ,
866+ r#"
867+ fn foo(x: Result<i32, ()>) {
868+ let bar: Result<i32, ()> = Ok(1);
869+ match bar {
870+ Ok(1 | 2) => (),
871+ _ => (),
872+ }
873+ }
874+ "# ,
875+ ) ;
876+
877+ check_assist (
878+ replace_if_let_with_match,
879+ r#"
880+ //- minicore: result
881+ fn foo(x: Result<i32, ()>) {
882+ let bar: Result<i32, ()> = Ok(1);
883+ $0if let Ok(1..2) = bar {
884+ ()
885+ } else {
886+ ()
887+ }
888+ }
889+ "# ,
890+ r#"
891+ fn foo(x: Result<i32, ()>) {
892+ let bar: Result<i32, ()> = Ok(1);
893+ match bar {
894+ Ok(1..2) => (),
895+ _ => (),
896+ }
897+ }
898+ "# ,
899+ ) ;
900+
901+ check_assist (
902+ replace_if_let_with_match,
903+ r#"
904+ //- minicore: result
905+ fn foo(x: Result<(i32, i32), ()>) {
906+ let bar: Result<(i32, i32), ()> = Ok((1, 1));
907+ $0if let Ok(((1, 2))) = bar {
908+ ()
909+ } else {
910+ ()
911+ }
912+ }
913+ "# ,
914+ r#"
915+ fn foo(x: Result<(i32, i32), ()>) {
916+ let bar: Result<(i32, i32), ()> = Ok((1, 1));
917+ match bar {
918+ Ok(((1, 2))) => (),
919+ _ => (),
920+ }
921+ }
922+ "# ,
923+ ) ;
924+
925+ check_assist (
926+ replace_if_let_with_match,
927+ r#"
928+ //- minicore: result
929+ fn foo(x: Result<(i32, i32), ()>) {
930+ let bar: Result<(i32, i32), ()> = Ok((1, 1));
931+ $0if let Ok(((a, b))) = bar {
932+ ()
933+ } else {
934+ ()
935+ }
936+ }
937+ "# ,
938+ r#"
939+ fn foo(x: Result<(i32, i32), ()>) {
940+ let bar: Result<(i32, i32), ()> = Ok((1, 1));
941+ match bar {
942+ Ok(((a, b))) => (),
943+ Err(_) => (),
944+ }
945+ }
946+ "# ,
947+ ) ;
948+
949+ check_assist (
950+ replace_if_let_with_match,
951+ r#"
952+ //- minicore: result
953+ fn foo(x: Result<i32, ()>) {
954+ macro_rules! is_42 {
955+ () => {
956+ 42
957+ };
958+ }
959+
960+ let bar: Result<i32, ()> = Ok(1);
961+ $0if let Ok(is_42!()) = bar {
962+ ()
963+ } else {
964+ ()
965+ }
966+ }
967+ "# ,
968+ r#"
969+ fn foo(x: Result<i32, ()>) {
970+ macro_rules! is_42 {
971+ () => {
972+ 42
973+ };
974+ }
975+
976+ let bar: Result<i32, ()> = Ok(1);
977+ match bar {
978+ Ok(is_42!()) => (),
979+ _ => (),
980+ }
981+ }
982+ "# ,
983+ ) ;
984+
985+ check_assist (
986+ replace_if_let_with_match,
987+ r#"
988+ //- minicore: result
989+ enum MyEnum {
990+ Foo,
991+ Bar,
992+ }
993+
994+ fn foo(x: Result<MyEnum, ()>) {
995+ let bar: Result<MyEnum, ()> = Ok(MyEnum::Foo);
996+ $0if let Ok(MyEnum::Foo) = bar {
997+ ()
998+ } else {
999+ ()
1000+ }
1001+ }
1002+ "# ,
1003+ r#"
1004+ enum MyEnum {
1005+ Foo,
1006+ Bar,
1007+ }
1008+
1009+ fn foo(x: Result<MyEnum, ()>) {
1010+ let bar: Result<MyEnum, ()> = Ok(MyEnum::Foo);
1011+ match bar {
1012+ Ok(MyEnum::Foo) => (),
1013+ _ => (),
1014+ }
1015+ }
1016+ "# ,
1017+ ) ;
1018+
1019+ check_assist (
1020+ replace_if_let_with_match,
1021+ r#"
1022+ //- minicore: result
1023+ struct MyStruct {
1024+ foo: i32,
1025+ bar: i32,
1026+ }
1027+
1028+ fn foo(x: Result<MyStruct, ()>) {
1029+ let bar: Result<MyStruct, ()> = Ok(MyStruct { foo: 1, bar: 2 });
1030+ $0if let Ok(MyStruct { foo, bar }) = bar {
1031+ ()
1032+ } else {
1033+ ()
1034+ }
1035+ }
1036+ "# ,
1037+ r#"
1038+ struct MyStruct {
1039+ foo: i32,
1040+ bar: i32,
1041+ }
1042+
1043+ fn foo(x: Result<MyStruct, ()>) {
1044+ let bar: Result<MyStruct, ()> = Ok(MyStruct { foo: 1, bar: 2 });
1045+ match bar {
1046+ Ok(MyStruct { foo, bar }) => (),
1047+ Err(_) => (),
1048+ }
1049+ }
1050+ "# ,
1051+ ) ;
1052+
1053+ check_assist (
1054+ replace_if_let_with_match,
1055+ r#"
1056+ //- minicore: result
1057+ struct MyStruct {
1058+ foo: i32,
1059+ bar: i32,
1060+ }
1061+
1062+ fn foo(x: Result<MyStruct, ()>) {
1063+ let bar: Result<MyStruct, ()> = Ok(MyStruct { foo: 1, bar: 2 });
1064+ $0if let Ok(MyStruct { foo, bar: 12 }) = bar {
1065+ ()
1066+ } else {
1067+ ()
1068+ }
1069+ }
1070+ "# ,
1071+ r#"
1072+ struct MyStruct {
1073+ foo: i32,
1074+ bar: i32,
1075+ }
1076+
1077+ fn foo(x: Result<MyStruct, ()>) {
1078+ let bar: Result<MyStruct, ()> = Ok(MyStruct { foo: 1, bar: 2 });
1079+ match bar {
1080+ Ok(MyStruct { foo, bar: 12 }) => (),
1081+ _ => (),
1082+ }
1083+ }
1084+ "# ,
1085+ ) ;
1086+ }
1087+
7311088 #[ test]
7321089 fn test_replace_match_with_if_let_unwraps_simple_expressions ( ) {
7331090 check_assist (
0 commit comments