Mercurial > vim
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) |