comparison src/testdir/test_ins_complete.vim @ 26618:b531c26f728b v8.2.3838

patch 8.2.3838: cannot use script-local function for setting *func options Commit: https://github.com/vim/vim/commit/db1a410b610b2c1941311acc57dcc4afec20720e Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Fri Dec 17 16:21:20 2021 +0000 patch 8.2.3838: cannot use script-local function for setting *func options Problem: Cannot use script-local function for setting *func options. Solution: Use the script context. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/9362)
author Bram Moolenaar <Bram@vim.org>
date Fri, 17 Dec 2021 17:30:04 +0100
parents 33d680d372aa
children 80e134cbee4b
comparison
equal deleted inserted replaced
26617:86ca0d6a6a34 26618:b531c26f728b
878 call add(g:CompleteFunc2Args, [a:findstart, a:base]) 878 call add(g:CompleteFunc2Args, [a:findstart, a:base])
879 return a:findstart ? 0 : [] 879 return a:findstart ? 0 : []
880 endfunc 880 endfunc
881 881
882 let lines =<< trim END 882 let lines =<< trim END
883 #" Test for using a function name 883 #" Test for using a global function name
884 LET &completefunc = 'g:CompleteFunc2' 884 LET &completefunc = 'g:CompleteFunc2'
885 new 885 new
886 call setline(1, 'zero') 886 call setline(1, 'global')
887 LET g:CompleteFunc2Args = [] 887 LET g:CompleteFunc2Args = []
888 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 888 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
889 call assert_equal([[1, ''], [0, 'zero']], g:CompleteFunc2Args) 889 call assert_equal([[1, ''], [0, 'global']], g:CompleteFunc2Args)
890 bw! 890 bw!
891 891
892 #" Test for using a function() 892 #" Test for using a function()
893 set completefunc=function('g:CompleteFunc1',\ [10]) 893 set completefunc=function('g:CompleteFunc1',\ [10])
894 new 894 new
1020 call assert_equal([[1, ''], [0, 'five']], g:CompleteFunc2Args) 1020 call assert_equal([[1, ''], [0, 'five']], g:CompleteFunc2Args)
1021 bw! 1021 bw!
1022 END 1022 END
1023 call CheckLegacyAndVim9Success(lines) 1023 call CheckLegacyAndVim9Success(lines)
1024 1024
1025 " Test for using a script-local function name
1026 func s:CompleteFunc3(findstart, base)
1027 call add(g:CompleteFunc3Args, [a:findstart, a:base])
1028 return a:findstart ? 0 : []
1029 endfunc
1030 set completefunc=s:CompleteFunc3
1031 new
1032 call setline(1, 'script1')
1033 let g:CompleteFunc3Args = []
1034 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1035 call assert_equal([[1, ''], [0, 'script1']], g:CompleteFunc3Args)
1036 bw!
1037
1038 let &completefunc = 's:CompleteFunc3'
1039 new
1040 call setline(1, 'script2')
1041 let g:CompleteFunc3Args = []
1042 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1043 call assert_equal([[1, ''], [0, 'script2']], g:CompleteFunc3Args)
1044 bw!
1045 delfunc s:CompleteFunc3
1046
1047 " invalid return value
1025 let &completefunc = {a -> 'abc'} 1048 let &completefunc = {a -> 'abc'}
1026 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 1049 call feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1027 1050
1028 " Using Vim9 lambda expression in legacy context should fail 1051 " Using Vim9 lambda expression in legacy context should fail
1029 set completefunc=(a,\ b)\ =>\ CompleteFunc1(21,\ a,\ b) 1052 set completefunc=(a,\ b)\ =>\ CompleteFunc1(21,\ a,\ b)
1054 1077
1055 " Vim9 tests 1078 " Vim9 tests
1056 let lines =<< trim END 1079 let lines =<< trim END
1057 vim9script 1080 vim9script
1058 1081
1059 # Test for using a def function with completefunc 1082 def Vim9CompleteFunc(callnr: number, findstart: number, base: string): any
1060 def Vim9CompleteFunc(val: number, findstart: number, base: string): any 1083 add(g:Vim9completeFuncArgs, [callnr, findstart, base])
1061 add(g:Vim9completeFuncArgs, [val, findstart, base])
1062 return findstart ? 0 : [] 1084 return findstart ? 0 : []
1063 enddef 1085 enddef
1086
1087 # Test for using a def function with completefunc
1064 set completefunc=function('Vim9CompleteFunc',\ [60]) 1088 set completefunc=function('Vim9CompleteFunc',\ [60])
1065 new | only 1089 new | only
1066 setline(1, 'one') 1090 setline(1, 'one')
1067 g:Vim9completeFuncArgs = [] 1091 g:Vim9completeFuncArgs = []
1068 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x') 1092 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1069 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9completeFuncArgs) 1093 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9completeFuncArgs)
1094 bw!
1095
1096 # Test for using a global function name
1097 &completefunc = g:CompleteFunc2
1098 new | only
1099 setline(1, 'two')
1100 g:CompleteFunc2Args = []
1101 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1102 assert_equal([[1, ''], [0, 'two']], g:CompleteFunc2Args)
1103 bw!
1104
1105 # Test for using a script-local function name
1106 def s:LocalCompleteFunc(findstart: number, base: string): any
1107 add(g:LocalCompleteFuncArgs, [findstart, base])
1108 return findstart ? 0 : []
1109 enddef
1110 &completefunc = s:LocalCompleteFunc
1111 new | only
1112 setline(1, 'three')
1113 g:LocalCompleteFuncArgs = []
1114 feedkeys("A\<C-X>\<C-U>\<Esc>", 'x')
1115 assert_equal([[1, ''], [0, 'three']], g:LocalCompleteFuncArgs)
1070 bw! 1116 bw!
1071 END 1117 END
1072 call CheckScriptSuccess(lines) 1118 call CheckScriptSuccess(lines)
1073 1119
1074 " cleanup 1120 " cleanup
1231 call assert_equal([[1, ''], [0, 'nine']], g:OmniFunc2Args) 1277 call assert_equal([[1, ''], [0, 'nine']], g:OmniFunc2Args)
1232 bw! 1278 bw!
1233 END 1279 END
1234 call CheckLegacyAndVim9Success(lines) 1280 call CheckLegacyAndVim9Success(lines)
1235 1281
1282 " Test for using a script-local function name
1283 func s:OmniFunc3(findstart, base)
1284 call add(g:OmniFunc3Args, [a:findstart, a:base])
1285 return a:findstart ? 0 : []
1286 endfunc
1287 set omnifunc=s:OmniFunc3
1288 new
1289 call setline(1, 'script1')
1290 let g:OmniFunc3Args = []
1291 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1292 call assert_equal([[1, ''], [0, 'script1']], g:OmniFunc3Args)
1293 bw!
1294
1295 let &omnifunc = 's:OmniFunc3'
1296 new
1297 call setline(1, 'script2')
1298 let g:OmniFunc3Args = []
1299 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1300 call assert_equal([[1, ''], [0, 'script2']], g:OmniFunc3Args)
1301 bw!
1302 delfunc s:OmniFunc3
1303
1304 " invalid return value
1236 let &omnifunc = {a -> 'abc'} 1305 let &omnifunc = {a -> 'abc'}
1237 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1306 call feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1238 1307
1239 " Using Vim9 lambda expression in legacy context should fail 1308 " Using Vim9 lambda expression in legacy context should fail
1240 set omnifunc=(a,\ b)\ =>\ OmniFunc1(21,\ a,\ b) 1309 set omnifunc=(a,\ b)\ =>\ OmniFunc1(21,\ a,\ b)
1265 1334
1266 " Vim9 tests 1335 " Vim9 tests
1267 let lines =<< trim END 1336 let lines =<< trim END
1268 vim9script 1337 vim9script
1269 1338
1270 # Test for using a def function with omnifunc 1339 def Vim9omniFunc(callnr: number, findstart: number, base: string): any
1271 def Vim9omniFunc(val: number, findstart: number, base: string): any 1340 add(g:Vim9omniFunc_Args, [callnr, findstart, base])
1272 add(g:Vim9omniFunc_Args, [val, findstart, base])
1273 return findstart ? 0 : [] 1341 return findstart ? 0 : []
1274 enddef 1342 enddef
1343
1344 # Test for using a def function with omnifunc
1275 set omnifunc=function('Vim9omniFunc',\ [60]) 1345 set omnifunc=function('Vim9omniFunc',\ [60])
1276 new | only 1346 new | only
1277 setline(1, 'one') 1347 setline(1, 'one')
1278 g:Vim9omniFunc_Args = [] 1348 g:Vim9omniFunc_Args = []
1279 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x') 1349 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1280 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9omniFunc_Args) 1350 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9omniFunc_Args)
1351 bw!
1352
1353 # Test for using a global function name
1354 &omnifunc = g:OmniFunc2
1355 new | only
1356 setline(1, 'two')
1357 g:OmniFunc2Args = []
1358 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1359 assert_equal([[1, ''], [0, 'two']], g:OmniFunc2Args)
1360 bw!
1361
1362 # Test for using a script-local function name
1363 def s:LocalOmniFunc(findstart: number, base: string): any
1364 add(g:LocalOmniFuncArgs, [findstart, base])
1365 return findstart ? 0 : []
1366 enddef
1367 &omnifunc = s:LocalOmniFunc
1368 new | only
1369 setline(1, 'three')
1370 g:LocalOmniFuncArgs = []
1371 feedkeys("A\<C-X>\<C-O>\<Esc>", 'x')
1372 assert_equal([[1, ''], [0, 'three']], g:LocalOmniFuncArgs)
1281 bw! 1373 bw!
1282 END 1374 END
1283 call CheckScriptSuccess(lines) 1375 call CheckScriptSuccess(lines)
1284 1376
1285 " cleanup 1377 " cleanup
1465 call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:TsrFunc1Args) 1557 call assert_equal([[22, 1, ''], [22, 0, 'sun']], g:TsrFunc1Args)
1466 :%bw! 1558 :%bw!
1467 END 1559 END
1468 call CheckLegacyAndVim9Success(lines) 1560 call CheckLegacyAndVim9Success(lines)
1469 1561
1562 " Test for using a script-local function name
1563 func s:TsrFunc3(findstart, base)
1564 call add(g:TsrFunc3Args, [a:findstart, a:base])
1565 return a:findstart ? 0 : []
1566 endfunc
1567 set tsrfu=s:TsrFunc3
1568 new
1569 call setline(1, 'script1')
1570 let g:TsrFunc3Args = []
1571 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1572 call assert_equal([[1, ''], [0, 'script1']], g:TsrFunc3Args)
1573 bw!
1574
1575 let &tsrfu = 's:TsrFunc3'
1576 new
1577 call setline(1, 'script2')
1578 let g:TsrFunc3Args = []
1579 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1580 call assert_equal([[1, ''], [0, 'script2']], g:TsrFunc3Args)
1581 bw!
1582 delfunc s:TsrFunc3
1583
1584 " invalid return value
1470 let &thesaurusfunc = {a -> 'abc'} 1585 let &thesaurusfunc = {a -> 'abc'}
1471 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1586 call feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1472 1587
1473 " Using Vim9 lambda expression in legacy context should fail 1588 " Using Vim9 lambda expression in legacy context should fail
1474 set thesaurusfunc=(a,\ b)\ =>\ TsrFunc1(21,\ a,\ b) 1589 set thesaurusfunc=(a,\ b)\ =>\ TsrFunc1(21,\ a,\ b)
1512 1627
1513 " Vim9 tests 1628 " Vim9 tests
1514 let lines =<< trim END 1629 let lines =<< trim END
1515 vim9script 1630 vim9script
1516 1631
1517 # Test for using a def function with thesaurusfunc 1632 def Vim9tsrFunc(callnr: number, findstart: number, base: string): any
1518 def Vim9tsrFunc(val: number, findstart: number, base: string): any 1633 add(g:Vim9tsrFunc_Args, [callnr, findstart, base])
1519 add(g:Vim9tsrFunc_Args, [val, findstart, base])
1520 return findstart ? 0 : [] 1634 return findstart ? 0 : []
1521 enddef 1635 enddef
1636
1637 # Test for using a def function with thesaurusfunc
1522 set thesaurusfunc=function('Vim9tsrFunc',\ [60]) 1638 set thesaurusfunc=function('Vim9tsrFunc',\ [60])
1523 new | only 1639 new | only
1524 setline(1, 'one') 1640 setline(1, 'one')
1525 g:Vim9tsrFunc_Args = [] 1641 g:Vim9tsrFunc_Args = []
1526 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x') 1642 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1527 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9tsrFunc_Args) 1643 assert_equal([[60, 1, ''], [60, 0, 'one']], g:Vim9tsrFunc_Args)
1528 bw! 1644 bw!
1645
1646 # Test for using a global function name
1647 &thesaurusfunc = g:TsrFunc2
1648 new | only
1649 setline(1, 'two')
1650 g:TsrFunc2Args = []
1651 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1652 assert_equal([[1, ''], [0, 'two']], g:TsrFunc2Args)
1653 bw!
1654
1655 # Test for using a script-local function name
1656 def s:LocalTsrFunc(findstart: number, base: string): any
1657 add(g:LocalTsrFuncArgs, [findstart, base])
1658 return findstart ? 0 : []
1659 enddef
1660 &thesaurusfunc = s:LocalTsrFunc
1661 new | only
1662 setline(1, 'three')
1663 g:LocalTsrFuncArgs = []
1664 feedkeys("A\<C-X>\<C-T>\<Esc>", 'x')
1665 assert_equal([[1, ''], [0, 'three']], g:LocalTsrFuncArgs)
1666 bw!
1529 END 1667 END
1530 call CheckScriptSuccess(lines) 1668 call CheckScriptSuccess(lines)
1531 1669
1532 " cleanup 1670 " cleanup
1533 set thesaurusfunc& 1671 set thesaurusfunc&