comparison src/testdir/test_ins_complete.vim @ 26441:65ab0b035dd8 v8.2.3751

patch 8.2.3751: cannot assign a lambda to an option that takes a function Commit: https://github.com/vim/vim/commit/6409553b6e3b4de4e1d72b8ee5445595214581ff Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Mon Dec 6 11:03:55 2021 +0000 patch 8.2.3751: cannot assign a lambda to an option that takes a function Problem: Cannot assign a lambda to an option that takes a function. Solution: Automatically convert the lambda to a string. (Yegappan Lakshmanan, closes #9286)
author Bram Moolenaar <Bram@vim.org>
date Mon, 06 Dec 2021 12:15:04 +0100
parents 8f17f8f327f3
children 65b4109a4297
comparison
equal deleted inserted replaced
26440:f6f5f604c17c 26441:65ab0b035dd8
883 call assert_equal([[1, ''], [0, 'one']], g:MycompleteFunc1_args) 883 call assert_equal([[1, ''], [0, 'one']], g:MycompleteFunc1_args)
884 bw! 884 bw!
885 885
886 " Using a funcref variable to set 'completefunc' 886 " Using a funcref variable to set 'completefunc'
887 let Fn = function('MycompleteFunc1') 887 let Fn = function('MycompleteFunc1')
888 let &completefunc = string(Fn) 888 let &completefunc = Fn
889 new | only 889 new | only
890 call setline(1, 'two') 890 call setline(1, 'two')
891 let g:MycompleteFunc1_args = [] 891 let g:MycompleteFunc1_args = []
892 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 892 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
893 call assert_equal([[1, ''], [0, 'two']], g:MycompleteFunc1_args) 893 call assert_equal([[1, ''], [0, 'two']], g:MycompleteFunc1_args)
894 call assert_fails('let &completefunc = Fn', 'E729:') 894 bw!
895
896 " Using string(funcref_variable) to set 'completefunc'
897 let Fn = function('MycompleteFunc1')
898 let &completefunc = string(Fn)
899 new | only
900 call setline(1, 'two')
901 let g:MycompleteFunc1_args = []
902 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
903 call assert_equal([[1, ''], [0, 'two']], g:MycompleteFunc1_args)
895 bw! 904 bw!
896 905
897 " Test for using a funcref() 906 " Test for using a funcref()
898 func MycompleteFunc2(findstart, base) 907 func MycompleteFunc2(findstart, base)
899 call add(g:MycompleteFunc2_args, [a:findstart, a:base]) 908 call add(g:MycompleteFunc2_args, [a:findstart, a:base])
907 call assert_equal([[1, ''], [0, 'three']], g:MycompleteFunc2_args) 916 call assert_equal([[1, ''], [0, 'three']], g:MycompleteFunc2_args)
908 bw! 917 bw!
909 918
910 " Using a funcref variable to set 'completefunc' 919 " Using a funcref variable to set 'completefunc'
911 let Fn = funcref('MycompleteFunc2') 920 let Fn = funcref('MycompleteFunc2')
912 let &completefunc = string(Fn) 921 let &completefunc = Fn
913 new | only 922 new | only
914 call setline(1, 'four') 923 call setline(1, 'four')
915 let g:MycompleteFunc2_args = [] 924 let g:MycompleteFunc2_args = []
916 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 925 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
917 call assert_equal([[1, ''], [0, 'four']], g:MycompleteFunc2_args) 926 call assert_equal([[1, ''], [0, 'four']], g:MycompleteFunc2_args)
918 call assert_fails('let &completefunc = Fn', 'E729:') 927 bw!
928
929 " Using a string(funcref_variable) to set 'completefunc'
930 let Fn = funcref('MycompleteFunc2')
931 let &completefunc = string(Fn)
932 new | only
933 call setline(1, 'four')
934 let g:MycompleteFunc2_args = []
935 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
936 call assert_equal([[1, ''], [0, 'four']], g:MycompleteFunc2_args)
919 bw! 937 bw!
920 938
921 " Test for using a lambda function 939 " Test for using a lambda function
922 func MycompleteFunc3(findstart, base) 940 func MycompleteFunc3(findstart, base)
923 call add(g:MycompleteFunc3_args, [a:findstart, a:base]) 941 call add(g:MycompleteFunc3_args, [a:findstart, a:base])
930 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 948 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
931 call assert_equal([[1, ''], [0, 'five']], g:MycompleteFunc3_args) 949 call assert_equal([[1, ''], [0, 'five']], g:MycompleteFunc3_args)
932 bw! 950 bw!
933 951
934 " Set 'completefunc' to a lambda expression 952 " Set 'completefunc' to a lambda expression
935 let &completefunc = '{a, b -> MycompleteFunc3(a, b)}' 953 let &completefunc = {a, b -> MycompleteFunc3(a, b)}
936 new | only 954 new | only
937 call setline(1, 'six') 955 call setline(1, 'six')
938 let g:MycompleteFunc3_args = [] 956 let g:MycompleteFunc3_args = []
939 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 957 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
940 call assert_equal([[1, ''], [0, 'six']], g:MycompleteFunc3_args) 958 call assert_equal([[1, ''], [0, 'six']], g:MycompleteFunc3_args)
941 bw! 959 bw!
942 960
961 " Set 'completefunc' to string(lambda_expression)
962 let &completefunc = '{a, b -> MycompleteFunc3(a, b)}'
963 new | only
964 call setline(1, 'six')
965 let g:MycompleteFunc3_args = []
966 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
967 call assert_equal([[1, ''], [0, 'six']], g:MycompleteFunc3_args)
968 bw!
969
943 " Set 'completefunc' to a variable with a lambda expression 970 " Set 'completefunc' to a variable with a lambda expression
944 let Lambda = {a, b -> MycompleteFunc3(a, b)} 971 let Lambda = {a, b -> MycompleteFunc3(a, b)}
945 let &completefunc = string(Lambda) 972 let &completefunc = Lambda
946 new | only 973 new | only
947 call setline(1, 'seven') 974 call setline(1, 'seven')
948 let g:MycompleteFunc3_args = [] 975 let g:MycompleteFunc3_args = []
949 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 976 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
950 call assert_equal([[1, ''], [0, 'seven']], g:MycompleteFunc3_args) 977 call assert_equal([[1, ''], [0, 'seven']], g:MycompleteFunc3_args)
951 call assert_fails('let &completefunc = Lambda', 'E729:') 978 bw!
979
980 " Set 'completefunc' to a string(variable with a lambda expression)
981 let Lambda = {a, b -> MycompleteFunc3(a, b)}
982 let &completefunc = string(Lambda)
983 new | only
984 call setline(1, 'seven')
985 let g:MycompleteFunc3_args = []
986 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
987 call assert_equal([[1, ''], [0, 'seven']], g:MycompleteFunc3_args)
952 bw! 988 bw!
953 989
954 " Test for using a lambda function with incorrect return value 990 " Test for using a lambda function with incorrect return value
955 let Lambda = {s -> strlen(s)} 991 let Lambda = {s -> strlen(s)}
956 let &completefunc = string(Lambda) 992 let &completefunc = Lambda
957 new | only 993 new | only
958 call setline(1, 'eight') 994 call setline(1, 'eight')
959 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 995 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
960 bw! 996 bw!
961 997
963 set completefunc='' 999 set completefunc=''
964 set completefunc& 1000 set completefunc&
965 1001
966 call assert_fails("set completefunc=function('abc')", "E700:") 1002 call assert_fails("set completefunc=function('abc')", "E700:")
967 call assert_fails("set completefunc=funcref('abc')", "E700:") 1003 call assert_fails("set completefunc=funcref('abc')", "E700:")
968 let &completefunc = "{a -> 'abc'}" 1004 let &completefunc = {a -> 'abc'}
969 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 1005 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
970 1006
971 " Vim9 tests 1007 " Vim9 tests
972 let lines =<< trim END 1008 let lines =<< trim END
973 vim9script 1009 vim9script
988 # Test for using a lambda 1024 # Test for using a lambda
989 def LambdaComplete1(findstart: number, base: string): any 1025 def LambdaComplete1(findstart: number, base: string): any
990 add(g:LambdaComplete1_args, [findstart, base]) 1026 add(g:LambdaComplete1_args, [findstart, base])
991 return findstart ? 0 : [] 1027 return findstart ? 0 : []
992 enddef 1028 enddef
1029 &completefunc = (a, b) => LambdaComplete1(a, b)
1030 new | only
1031 setline(1, 'two')
1032 g:LambdaComplete1_args = []
1033 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1034 assert_equal([[1, ''], [0, 'two']], g:LambdaComplete1_args)
1035 bw!
1036
1037 # Test for using a string(lambda)
993 &completefunc = '(a, b) => LambdaComplete1(a, b)' 1038 &completefunc = '(a, b) => LambdaComplete1(a, b)'
994 new | only 1039 new | only
995 setline(1, 'two') 1040 setline(1, 'two')
996 g:LambdaComplete1_args = [] 1041 g:LambdaComplete1_args = []
997 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 1042 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1001 # Test for using a variable with a lambda expression 1046 # Test for using a variable with a lambda expression
1002 var Fn: func = (findstart, base) => { 1047 var Fn: func = (findstart, base) => {
1003 add(g:LambdaComplete2_args, [findstart, base]) 1048 add(g:LambdaComplete2_args, [findstart, base])
1004 return findstart ? 0 : [] 1049 return findstart ? 0 : []
1005 } 1050 }
1051 &completefunc = Fn
1052 new | only
1053 setline(1, 'three')
1054 g:LambdaComplete2_args = []
1055 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1056 assert_equal([[1, ''], [0, 'three']], g:LambdaComplete2_args)
1057 bw!
1058
1059 # Test for using a string(variable with a lambda expression)
1006 &completefunc = string(Fn) 1060 &completefunc = string(Fn)
1007 new | only 1061 new | only
1008 setline(1, 'three') 1062 setline(1, 'three')
1009 g:LambdaComplete2_args = [] 1063 g:LambdaComplete2_args = []
1010 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 1064 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1043 call assert_equal([[1, ''], [0, 'one']], g:MyomniFunc1_args) 1097 call assert_equal([[1, ''], [0, 'one']], g:MyomniFunc1_args)
1044 bw! 1098 bw!
1045 1099
1046 " Using a funcref variable to set 'omnifunc' 1100 " Using a funcref variable to set 'omnifunc'
1047 let Fn = function('MyomniFunc1') 1101 let Fn = function('MyomniFunc1')
1048 let &omnifunc = string(Fn) 1102 let &omnifunc = Fn
1049 new | only 1103 new | only
1050 call setline(1, 'two') 1104 call setline(1, 'two')
1051 let g:MyomniFunc1_args = [] 1105 let g:MyomniFunc1_args = []
1052 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1106 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1053 call assert_equal([[1, ''], [0, 'two']], g:MyomniFunc1_args) 1107 call assert_equal([[1, ''], [0, 'two']], g:MyomniFunc1_args)
1054 call assert_fails('let &omnifunc = Fn', 'E729:') 1108 bw!
1109
1110 " Using a string(funcref_variable) to set 'omnifunc'
1111 let Fn = function('MyomniFunc1')
1112 let &omnifunc = string(Fn)
1113 new | only
1114 call setline(1, 'two')
1115 let g:MyomniFunc1_args = []
1116 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1117 call assert_equal([[1, ''], [0, 'two']], g:MyomniFunc1_args)
1055 bw! 1118 bw!
1056 1119
1057 " Test for using a funcref() 1120 " Test for using a funcref()
1058 func MyomniFunc2(findstart, base) 1121 func MyomniFunc2(findstart, base)
1059 call add(g:MyomniFunc2_args, [a:findstart, a:base]) 1122 call add(g:MyomniFunc2_args, [a:findstart, a:base])
1067 call assert_equal([[1, ''], [0, 'three']], g:MyomniFunc2_args) 1130 call assert_equal([[1, ''], [0, 'three']], g:MyomniFunc2_args)
1068 bw! 1131 bw!
1069 1132
1070 " Using a funcref variable to set 'omnifunc' 1133 " Using a funcref variable to set 'omnifunc'
1071 let Fn = funcref('MyomniFunc2') 1134 let Fn = funcref('MyomniFunc2')
1072 let &omnifunc = string(Fn) 1135 let &omnifunc = Fn
1073 new | only 1136 new | only
1074 call setline(1, 'four') 1137 call setline(1, 'four')
1075 let g:MyomniFunc2_args = [] 1138 let g:MyomniFunc2_args = []
1076 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1139 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1077 call assert_equal([[1, ''], [0, 'four']], g:MyomniFunc2_args) 1140 call assert_equal([[1, ''], [0, 'four']], g:MyomniFunc2_args)
1078 call assert_fails('let &omnifunc = Fn', 'E729:') 1141 bw!
1142
1143 " Using a string(funcref_variable) to set 'omnifunc'
1144 let Fn = funcref('MyomniFunc2')
1145 let &omnifunc = string(Fn)
1146 new | only
1147 call setline(1, 'four')
1148 let g:MyomniFunc2_args = []
1149 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1150 call assert_equal([[1, ''], [0, 'four']], g:MyomniFunc2_args)
1079 bw! 1151 bw!
1080 1152
1081 " Test for using a lambda function 1153 " Test for using a lambda function
1082 func MyomniFunc3(findstart, base) 1154 func MyomniFunc3(findstart, base)
1083 call add(g:MyomniFunc3_args, [a:findstart, a:base]) 1155 call add(g:MyomniFunc3_args, [a:findstart, a:base])
1090 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1162 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1091 call assert_equal([[1, ''], [0, 'five']], g:MyomniFunc3_args) 1163 call assert_equal([[1, ''], [0, 'five']], g:MyomniFunc3_args)
1092 bw! 1164 bw!
1093 1165
1094 " Set 'omnifunc' to a lambda expression 1166 " Set 'omnifunc' to a lambda expression
1095 let &omnifunc = '{a, b -> MyomniFunc3(a, b)}' 1167 let &omnifunc = {a, b -> MyomniFunc3(a, b)}
1096 new | only 1168 new | only
1097 call setline(1, 'six') 1169 call setline(1, 'six')
1098 let g:MyomniFunc3_args = [] 1170 let g:MyomniFunc3_args = []
1099 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1171 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1100 call assert_equal([[1, ''], [0, 'six']], g:MyomniFunc3_args) 1172 call assert_equal([[1, ''], [0, 'six']], g:MyomniFunc3_args)
1101 bw! 1173 bw!
1102 1174
1175 " Set 'omnifunc' to a string(lambda_expression)
1176 let &omnifunc = '{a, b -> MyomniFunc3(a, b)}'
1177 new | only
1178 call setline(1, 'six')
1179 let g:MyomniFunc3_args = []
1180 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1181 call assert_equal([[1, ''], [0, 'six']], g:MyomniFunc3_args)
1182 bw!
1183
1103 " Set 'omnifunc' to a variable with a lambda expression 1184 " Set 'omnifunc' to a variable with a lambda expression
1104 let Lambda = {a, b -> MyomniFunc3(a, b)} 1185 let Lambda = {a, b -> MyomniFunc3(a, b)}
1105 let &omnifunc = string(Lambda) 1186 let &omnifunc = Lambda
1106 new | only 1187 new | only
1107 call setline(1, 'seven') 1188 call setline(1, 'seven')
1108 let g:MyomniFunc3_args = [] 1189 let g:MyomniFunc3_args = []
1109 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1190 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1110 call assert_equal([[1, ''], [0, 'seven']], g:MyomniFunc3_args) 1191 call assert_equal([[1, ''], [0, 'seven']], g:MyomniFunc3_args)
1111 call assert_fails('let &omnifunc = Lambda', 'E729:') 1192 bw!
1193
1194 " Set 'omnifunc' to a string(variable with a lambda expression)
1195 let Lambda = {a, b -> MyomniFunc3(a, b)}
1196 let &omnifunc = string(Lambda)
1197 new | only
1198 call setline(1, 'seven')
1199 let g:MyomniFunc3_args = []
1200 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1201 call assert_equal([[1, ''], [0, 'seven']], g:MyomniFunc3_args)
1112 bw! 1202 bw!
1113 1203
1114 " Test for using a lambda function with incorrect return value 1204 " Test for using a lambda function with incorrect return value
1115 let Lambda = {s -> strlen(s)} 1205 let Lambda = {s -> strlen(s)}
1116 let &omnifunc = string(Lambda) 1206 let &omnifunc = Lambda
1117 new | only 1207 new | only
1118 call setline(1, 'eight') 1208 call setline(1, 'eight')
1119 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1209 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1120 bw! 1210 bw!
1121 1211
1123 set omnifunc='' 1213 set omnifunc=''
1124 set omnifunc& 1214 set omnifunc&
1125 1215
1126 call assert_fails("set omnifunc=function('abc')", "E700:") 1216 call assert_fails("set omnifunc=function('abc')", "E700:")
1127 call assert_fails("set omnifunc=funcref('abc')", "E700:") 1217 call assert_fails("set omnifunc=funcref('abc')", "E700:")
1128 let &omnifunc = "{a -> 'abc'}" 1218 let &omnifunc = {a -> 'abc'}
1129 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1219 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1130 1220
1131 " Vim9 tests 1221 " Vim9 tests
1132 let lines =<< trim END 1222 let lines =<< trim END
1133 vim9script 1223 vim9script
1148 # Test for using a lambda 1238 # Test for using a lambda
1149 def MyomniFunc2(findstart: number, base: string): any 1239 def MyomniFunc2(findstart: number, base: string): any
1150 add(g:MyomniFunc2_args, [findstart, base]) 1240 add(g:MyomniFunc2_args, [findstart, base])
1151 return findstart ? 0 : [] 1241 return findstart ? 0 : []
1152 enddef 1242 enddef
1243 &omnifunc = (a, b) => MyomniFunc2(a, b)
1244 new | only
1245 setline(1, 'two')
1246 g:MyomniFunc2_args = []
1247 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1248 assert_equal([[1, ''], [0, 'two']], g:MyomniFunc2_args)
1249 bw!
1250
1251 # Test for using a string(lambda)
1153 &omnifunc = '(a, b) => MyomniFunc2(a, b)' 1252 &omnifunc = '(a, b) => MyomniFunc2(a, b)'
1154 new | only 1253 new | only
1155 setline(1, 'two') 1254 setline(1, 'two')
1156 g:MyomniFunc2_args = [] 1255 g:MyomniFunc2_args = []
1157 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1256 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1158 assert_equal([[1, ''], [0, 'two']], g:MyomniFunc2_args) 1257 assert_equal([[1, ''], [0, 'two']], g:MyomniFunc2_args)
1159 bw! 1258 bw!
1160 1259
1161 # Test for using a variable with a lambda expression 1260 # Test for using a variable with a lambda expression
1162 var Fn: func = (a, b) => MyomniFunc2(a, b) 1261 var Fn: func = (a, b) => MyomniFunc2(a, b)
1262 &omnifunc = Fn
1263 new | only
1264 setline(1, 'three')
1265 g:MyomniFunc2_args = []
1266 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1267 assert_equal([[1, ''], [0, 'three']], g:MyomniFunc2_args)
1268 bw!
1269
1270 # Test for using a string(variable with a lambda expression)
1163 &omnifunc = string(Fn) 1271 &omnifunc = string(Fn)
1164 new | only 1272 new | only
1165 setline(1, 'three') 1273 setline(1, 'three')
1166 g:MyomniFunc2_args = [] 1274 g:MyomniFunc2_args = []
1167 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1275 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1200 call assert_equal([[1, ''], [0, 'one']], g:MytsrFunc1_args) 1308 call assert_equal([[1, ''], [0, 'one']], g:MytsrFunc1_args)
1201 bw! 1309 bw!
1202 1310
1203 " Using a funcref variable to set 'thesaurusfunc' 1311 " Using a funcref variable to set 'thesaurusfunc'
1204 let Fn = function('MytsrFunc1') 1312 let Fn = function('MytsrFunc1')
1205 let &thesaurusfunc = string(Fn) 1313 let &thesaurusfunc = Fn
1206 new | only 1314 new | only
1207 call setline(1, 'two') 1315 call setline(1, 'two')
1208 let g:MytsrFunc1_args = [] 1316 let g:MytsrFunc1_args = []
1209 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1317 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1210 call assert_equal([[1, ''], [0, 'two']], g:MytsrFunc1_args) 1318 call assert_equal([[1, ''], [0, 'two']], g:MytsrFunc1_args)
1211 call assert_fails('let &thesaurusfunc = Fn', 'E729:') 1319 bw!
1320
1321 " Using a string(funcref_variable) to set 'thesaurusfunc'
1322 let Fn = function('MytsrFunc1')
1323 let &thesaurusfunc = string(Fn)
1324 new | only
1325 call setline(1, 'two')
1326 let g:MytsrFunc1_args = []
1327 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1328 call assert_equal([[1, ''], [0, 'two']], g:MytsrFunc1_args)
1212 bw! 1329 bw!
1213 1330
1214 " Test for using a funcref() 1331 " Test for using a funcref()
1215 func MytsrFunc2(findstart, base) 1332 func MytsrFunc2(findstart, base)
1216 call add(g:MytsrFunc2_args, [a:findstart, a:base]) 1333 call add(g:MytsrFunc2_args, [a:findstart, a:base])
1224 call assert_equal([[1, ''], [0, 'three']], g:MytsrFunc2_args) 1341 call assert_equal([[1, ''], [0, 'three']], g:MytsrFunc2_args)
1225 bw! 1342 bw!
1226 1343
1227 " Using a funcref variable to set 'thesaurusfunc' 1344 " Using a funcref variable to set 'thesaurusfunc'
1228 let Fn = funcref('MytsrFunc2') 1345 let Fn = funcref('MytsrFunc2')
1229 let &thesaurusfunc = string(Fn) 1346 let &thesaurusfunc = Fn
1230 new | only 1347 new | only
1231 call setline(1, 'four') 1348 call setline(1, 'four')
1232 let g:MytsrFunc2_args = [] 1349 let g:MytsrFunc2_args = []
1233 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1350 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1234 call assert_equal([[1, ''], [0, 'four']], g:MytsrFunc2_args) 1351 call assert_equal([[1, ''], [0, 'four']], g:MytsrFunc2_args)
1235 call assert_fails('let &thesaurusfunc = Fn', 'E729:') 1352 bw!
1353
1354 " Using a string(funcref_variable) to set 'thesaurusfunc'
1355 let Fn = funcref('MytsrFunc2')
1356 let &thesaurusfunc = string(Fn)
1357 new | only
1358 call setline(1, 'four')
1359 let g:MytsrFunc2_args = []
1360 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1361 call assert_equal([[1, ''], [0, 'four']], g:MytsrFunc2_args)
1236 bw! 1362 bw!
1237 1363
1238 " Test for using a lambda function 1364 " Test for using a lambda function
1239 func MytsrFunc3(findstart, base) 1365 func MytsrFunc3(findstart, base)
1240 call add(g:MytsrFunc3_args, [a:findstart, a:base]) 1366 call add(g:MytsrFunc3_args, [a:findstart, a:base])
1247 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1373 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1248 call assert_equal([[1, ''], [0, 'five']], g:MytsrFunc3_args) 1374 call assert_equal([[1, ''], [0, 'five']], g:MytsrFunc3_args)
1249 bw! 1375 bw!
1250 1376
1251 " Set 'thesaurusfunc' to a lambda expression 1377 " Set 'thesaurusfunc' to a lambda expression
1252 let &thesaurusfunc = '{a, b -> MytsrFunc3(a, b)}' 1378 let &thesaurusfunc = {a, b -> MytsrFunc3(a, b)}
1253 new | only 1379 new | only
1254 call setline(1, 'six') 1380 call setline(1, 'six')
1255 let g:MytsrFunc3_args = [] 1381 let g:MytsrFunc3_args = []
1256 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1382 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1257 call assert_equal([[1, ''], [0, 'six']], g:MytsrFunc3_args) 1383 call assert_equal([[1, ''], [0, 'six']], g:MytsrFunc3_args)
1258 bw! 1384 bw!
1259 1385
1386 " Set 'thesaurusfunc' to a string(lambda expression)
1387 let &thesaurusfunc = '{a, b -> MytsrFunc3(a, b)}'
1388 new | only
1389 call setline(1, 'six')
1390 let g:MytsrFunc3_args = []
1391 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1392 call assert_equal([[1, ''], [0, 'six']], g:MytsrFunc3_args)
1393 bw!
1394
1260 " Set 'thesaurusfunc' to a variable with a lambda expression 1395 " Set 'thesaurusfunc' to a variable with a lambda expression
1261 let Lambda = {a, b -> MytsrFunc3(a, b)} 1396 let Lambda = {a, b -> MytsrFunc3(a, b)}
1262 let &thesaurusfunc = string(Lambda) 1397 let &thesaurusfunc = Lambda
1263 new | only 1398 new | only
1264 call setline(1, 'seven') 1399 call setline(1, 'seven')
1265 let g:MytsrFunc3_args = [] 1400 let g:MytsrFunc3_args = []
1266 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1401 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1267 call assert_equal([[1, ''], [0, 'seven']], g:MytsrFunc3_args) 1402 call assert_equal([[1, ''], [0, 'seven']], g:MytsrFunc3_args)
1268 call assert_fails('let &thesaurusfunc = Lambda', 'E729:') 1403 bw!
1404
1405 " Set 'thesaurusfunc' to a string(variable with a lambda expression)
1406 let Lambda = {a, b -> MytsrFunc3(a, b)}
1407 let &thesaurusfunc = string(Lambda)
1408 new | only
1409 call setline(1, 'seven')
1410 let g:MytsrFunc3_args = []
1411 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1412 call assert_equal([[1, ''], [0, 'seven']], g:MytsrFunc3_args)
1269 bw! 1413 bw!
1270 1414
1271 " Test for using a lambda function with incorrect return value 1415 " Test for using a lambda function with incorrect return value
1272 let Lambda = {s -> strlen(s)} 1416 let Lambda = {s -> strlen(s)}
1273 let &thesaurusfunc = string(Lambda) 1417 let &thesaurusfunc = Lambda
1274 new | only 1418 new | only
1275 call setline(1, 'eight') 1419 call setline(1, 'eight')
1276 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1420 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1277 bw! 1421 bw!
1278 1422
1280 set thesaurusfunc='' 1424 set thesaurusfunc=''
1281 set thesaurusfunc& 1425 set thesaurusfunc&
1282 1426
1283 call assert_fails("set thesaurusfunc=function('abc')", "E700:") 1427 call assert_fails("set thesaurusfunc=function('abc')", "E700:")
1284 call assert_fails("set thesaurusfunc=funcref('abc')", "E700:") 1428 call assert_fails("set thesaurusfunc=funcref('abc')", "E700:")
1285 let &thesaurusfunc = "{a -> 'abc'}" 1429 let &thesaurusfunc = {a -> 'abc'}
1286 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1430 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1287 1431
1288 " Vim9 tests 1432 " Vim9 tests
1289 let lines =<< trim END 1433 let lines =<< trim END
1290 vim9script 1434 vim9script
1305 # Test for using a lambda 1449 # Test for using a lambda
1306 def MytsrFunc2(findstart: number, base: string): any 1450 def MytsrFunc2(findstart: number, base: string): any
1307 add(g:MytsrFunc2_args, [findstart, base]) 1451 add(g:MytsrFunc2_args, [findstart, base])
1308 return findstart ? 0 : [] 1452 return findstart ? 0 : []
1309 enddef 1453 enddef
1454 &thesaurusfunc = (a, b) => MytsrFunc2(a, b)
1455 new | only
1456 setline(1, 'two')
1457 g:MytsrFunc2_args = []
1458 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1459 assert_equal([[1, ''], [0, 'two']], g:MytsrFunc2_args)
1460 bw!
1461
1462 # Test for using a string(lambda)
1310 &thesaurusfunc = '(a, b) => MytsrFunc2(a, b)' 1463 &thesaurusfunc = '(a, b) => MytsrFunc2(a, b)'
1311 new | only 1464 new | only
1312 setline(1, 'two') 1465 setline(1, 'two')
1313 g:MytsrFunc2_args = [] 1466 g:MytsrFunc2_args = []
1314 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1467 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1315 assert_equal([[1, ''], [0, 'two']], g:MytsrFunc2_args) 1468 assert_equal([[1, ''], [0, 'two']], g:MytsrFunc2_args)
1316 bw! 1469 bw!
1317 1470
1318 # Test for using a variable with a lambda expression 1471 # Test for using a variable with a lambda expression
1319 var Fn: func = (a, b) => MytsrFunc2(a, b) 1472 var Fn: func = (a, b) => MytsrFunc2(a, b)
1473 &thesaurusfunc = Fn
1474 new | only
1475 setline(1, 'three')
1476 g:MytsrFunc2_args = []
1477 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1478 assert_equal([[1, ''], [0, 'three']], g:MytsrFunc2_args)
1479 bw!
1480
1481 # Test for using a string(variable with a lambda expression)
1320 &thesaurusfunc = string(Fn) 1482 &thesaurusfunc = string(Fn)
1321 new | only 1483 new | only
1322 setline(1, 'three') 1484 setline(1, 'three')
1323 g:MytsrFunc2_args = [] 1485 g:MytsrFunc2_args = []
1324 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1486 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')