@@ -728,6 +728,363 @@ fn foo(x: Result<i32, ()>) {
728
728
) ;
729
729
}
730
730
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
+
731
1088
#[ test]
732
1089
fn test_replace_match_with_if_let_unwraps_simple_expressions ( ) {
733
1090
check_assist (
0 commit comments