comparison src/testdir/test_vim9_builtin.vim @ 27798:324d394e314e v8.2.4425

patch 8.2.4425: map() function does not check function arguments Commit: https://github.com/vim/vim/commit/eddd4fc4f6d9d626374a73861c891f95ef999133 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Feb 20 15:52:28 2022 +0000 patch 8.2.4425: map() function does not check function arguments Problem: map() function does not check function arguments at compile time. Solution: Give an error if the arguments of a map() function are wrong.
author Bram Moolenaar <Bram@vim.org>
date Sun, 20 Feb 2022 17:00:03 +0100
parents fdc841530372
children 6e5d378919c4
comparison
equal deleted inserted replaced
27797:3a242565b8a1 27798:324d394e314e
2287 v9.CheckDefAndScriptSuccess(lines) 2287 v9.CheckDefAndScriptSuccess(lines)
2288 2288
2289 lines =<< trim END 2289 lines =<< trim END
2290 range(3)->map((a, b, c) => a + b + c) 2290 range(3)->map((a, b, c) => a + b + c)
2291 END 2291 END
2292 v9.CheckDefExecAndScriptFailure(lines, 'E1190: One argument too few') 2292 v9.CheckDefAndScriptFailure(lines, ['E176:', 'E1190: One argument too few'])
2293 lines =<< trim END 2293 lines =<< trim END
2294 range(3)->map((a, b, c, d) => a + b + c + d) 2294 range(3)->map((a, b, c, d) => a + b + c + d)
2295 END 2295 END
2296 v9.CheckDefExecAndScriptFailure(lines, 'E1190: 2 arguments too few') 2296 v9.CheckDefAndScriptFailure(lines, ['E176:', 'E1190: 2 arguments too few'])
2297 2297
2298 # declared list cannot change type 2298 # declared list cannot change type
2299 lines =<< trim END 2299 lines =<< trim END
2300 def Map(i: number, v: number): string 2300 def Map(i: number, v: number): string
2301 return 'bad' 2301 return 'bad'
2302 enddef 2302 enddef
2303 var ll: list<number> = [1, 2, 3] 2303 var ll: list<number> = [1, 2, 3]
2304 echo map(ll, Map) 2304 echo map(ll, Map)
2305 END 2305 END
2306 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(...): number but got func(number, number): string', 'E1012: Type mismatch; expected number but got string in map()']) 2306 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?number): number but got func(number, number): string', 'E1012: Type mismatch; expected number but got string in map()'])
2307 2307
2308 # not declared list can change type 2308 # not declared list can change type
2309 echo [1, 2, 3]->map((..._) => 'x') 2309 echo [1, 2, 3]->map((..._) => 'x')
2310 enddef 2310 enddef
2311 2311
2319 2319
2320 lines =<< trim END 2320 lines =<< trim END
2321 var l: list<number> = [0] 2321 var l: list<number> = [0]
2322 echo map(l, (_, v) => []) 2322 echo map(l, (_, v) => [])
2323 END 2323 END
2324 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(...): number but got func(any, any): list<unknown>', 'E1012: Type mismatch; expected number but got list<unknown> in map()'], 2) 2324 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?number): number but got func(any, any): list<unknown>', 'E1012: Type mismatch; expected number but got list<unknown> in map()'], 2)
2325 2325
2326 lines =<< trim END 2326 lines =<< trim END
2327 var l: list<number> = range(2) 2327 var l: list<number> = range(2)
2328 echo map(l, (_, v) => []) 2328 echo map(l, (_, v) => [])
2329 END 2329 END
2330 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(...): number but got func(any, any): list<unknown>', 'E1012: Type mismatch; expected number but got list<unknown> in map()'], 2) 2330 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?number, ?number): number but got func(any, any): list<unknown>', 'E1012: Type mismatch; expected number but got list<unknown> in map()'], 2)
2331 2331
2332 lines =<< trim END 2332 lines =<< trim END
2333 var d: dict<number> = {key: 0} 2333 var d: dict<number> = {key: 0}
2334 echo map(d, (_, v) => []) 2334 echo map(d, (_, v) => [])
2335 END 2335 END
2336 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(...): number but got func(any, any): list<unknown>', 'E1012: Type mismatch; expected number but got list<unknown> in map()'], 2) 2336 v9.CheckDefAndScriptFailure(lines, ['E1013: Argument 2: type mismatch, expected func(?string, ?number): number but got func(any, any): list<unknown>', 'E1012: Type mismatch; expected number but got list<unknown> in map()'], 2)
2337 enddef 2337 enddef
2338 2338
2339 def Test_maparg() 2339 def Test_maparg()
2340 var lnum = str2nr(expand('<sflnum>')) 2340 var lnum = str2nr(expand('<sflnum>'))
2341 map foo bar 2341 map foo bar
2357 v9.CheckDefAndScriptFailure(['maparg(1)'], ['E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1']) 2357 v9.CheckDefAndScriptFailure(['maparg(1)'], ['E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1'])
2358 v9.CheckDefAndScriptFailure(['maparg("a", 2)'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2']) 2358 v9.CheckDefAndScriptFailure(['maparg("a", 2)'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2'])
2359 v9.CheckDefAndScriptFailure(['maparg("a", "b", 2)'], ['E1013: Argument 3: type mismatch, expected bool but got number', 'E1212: Bool required for argument 3']) 2359 v9.CheckDefAndScriptFailure(['maparg("a", "b", 2)'], ['E1013: Argument 3: type mismatch, expected bool but got number', 'E1212: Bool required for argument 3'])
2360 v9.CheckDefAndScriptFailure(['maparg("a", "b", true, 2)'], ['E1013: Argument 4: type mismatch, expected bool but got number', 'E1212: Bool required for argument 4']) 2360 v9.CheckDefAndScriptFailure(['maparg("a", "b", true, 2)'], ['E1013: Argument 4: type mismatch, expected bool but got number', 'E1212: Bool required for argument 4'])
2361 maparg('')->assert_equal('') 2361 maparg('')->assert_equal('')
2362
2363 var lines =<< trim END
2364 var l = [123]
2365 l->map((_, v: string) => 0)
2366 END
2367 v9.CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected func(?number, ?number): number but got func(any, string): number')
2368
2369 lines =<< trim END
2370 ['x']->map((i: string, v: string) => 'y')
2371 END
2372 v9.CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected func(?number, ?any): any but got func(string, string): string')
2373
2374 lines =<< trim END
2375 {a: 1}->map((i: number, v: number) => 0)
2376 END
2377 v9.CheckDefFailure(lines, 'E1013: Argument 2: type mismatch, expected func(?string, ?any): any but got func(number, number): number')
2362 enddef 2378 enddef
2363 2379
2364 def Test_maparg_mapset() 2380 def Test_maparg_mapset()
2365 nnoremap <F3> :echo "hit F3"<CR> 2381 nnoremap <F3> :echo "hit F3"<CR>
2366 var mapsave = maparg('<F3>', 'n', false, true) 2382 var mapsave = maparg('<F3>', 'n', false, true)