comparison src/testdir/test_tagfunc.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 8aba638e91eb
children 65b4109a4297
comparison
equal deleted inserted replaced
26440:f6f5f604c17c 26441:65ab0b035dd8
138 call assert_fails('tag a11', 'E433:') 138 call assert_fails('tag a11', 'E433:')
139 call assert_equal(['a11', '', {}], g:MytagFunc1_args) 139 call assert_equal(['a11', '', {}], g:MytagFunc1_args)
140 140
141 " Using a funcref variable to set 'tagfunc' 141 " Using a funcref variable to set 'tagfunc'
142 let Fn = function('MytagFunc1') 142 let Fn = function('MytagFunc1')
143 let &tagfunc = string(Fn) 143 let &tagfunc = Fn
144 new | only 144 new | only
145 let g:MytagFunc1_args = [] 145 let g:MytagFunc1_args = []
146 call assert_fails('tag a12', 'E433:') 146 call assert_fails('tag a12', 'E433:')
147 call assert_equal(['a12', '', {}], g:MytagFunc1_args) 147 call assert_equal(['a12', '', {}], g:MytagFunc1_args)
148 call assert_fails('let &tagfunc = Fn', 'E729:') 148
149 " Using a string(funcref_variable) to set 'tagfunc'
150 let Fn = function('MytagFunc1')
151 let &tagfunc = string(Fn)
152 new | only
153 let g:MytagFunc1_args = []
154 call assert_fails('tag a12', 'E433:')
155 call assert_equal(['a12', '', {}], g:MytagFunc1_args)
149 156
150 " Test for using a funcref() 157 " Test for using a funcref()
151 func MytagFunc2(pat, flags, info) 158 func MytagFunc2(pat, flags, info)
152 let g:MytagFunc2_args = [a:pat, a:flags, a:info] 159 let g:MytagFunc2_args = [a:pat, a:flags, a:info]
153 return v:null 160 return v:null
158 call assert_fails('tag a13', 'E433:') 165 call assert_fails('tag a13', 'E433:')
159 call assert_equal(['a13', '', {}], g:MytagFunc2_args) 166 call assert_equal(['a13', '', {}], g:MytagFunc2_args)
160 167
161 " Using a funcref variable to set 'tagfunc' 168 " Using a funcref variable to set 'tagfunc'
162 let Fn = funcref('MytagFunc2') 169 let Fn = funcref('MytagFunc2')
163 let &tagfunc = string(Fn) 170 let &tagfunc = Fn
164 new | only 171 new | only
165 let g:MytagFunc2_args = [] 172 let g:MytagFunc2_args = []
166 call assert_fails('tag a14', 'E433:') 173 call assert_fails('tag a14', 'E433:')
167 call assert_equal(['a14', '', {}], g:MytagFunc2_args) 174 call assert_equal(['a14', '', {}], g:MytagFunc2_args)
168 call assert_fails('let &tagfunc = Fn', 'E729:') 175
176 " Using a string(funcref_variable) to set 'tagfunc'
177 let Fn = funcref('MytagFunc2')
178 let &tagfunc = string(Fn)
179 new | only
180 let g:MytagFunc2_args = []
181 call assert_fails('tag a14', 'E433:')
182 call assert_equal(['a14', '', {}], g:MytagFunc2_args)
169 183
170 " Test for using a script local function 184 " Test for using a script local function
171 set tagfunc=<SID>ScriptLocalTagFunc 185 set tagfunc=<SID>ScriptLocalTagFunc
172 new | only 186 new | only
173 let g:ScriptLocalFuncArgs = [] 187 let g:ScriptLocalFuncArgs = []
174 call assert_fails('tag a15', 'E433:') 188 call assert_fails('tag a15', 'E433:')
175 call assert_equal(['a15', '', {}], g:ScriptLocalFuncArgs) 189 call assert_equal(['a15', '', {}], g:ScriptLocalFuncArgs)
176 190
177 " Test for using a script local funcref variable 191 " Test for using a script local funcref variable
192 let Fn = function("s:ScriptLocalTagFunc")
193 let &tagfunc= Fn
194 new | only
195 let g:ScriptLocalFuncArgs = []
196 call assert_fails('tag a16', 'E433:')
197 call assert_equal(['a16', '', {}], g:ScriptLocalFuncArgs)
198
199 " Test for using a string(script local funcref variable)
178 let Fn = function("s:ScriptLocalTagFunc") 200 let Fn = function("s:ScriptLocalTagFunc")
179 let &tagfunc= string(Fn) 201 let &tagfunc= string(Fn)
180 new | only 202 new | only
181 let g:ScriptLocalFuncArgs = [] 203 let g:ScriptLocalFuncArgs = []
182 call assert_fails('tag a16', 'E433:') 204 call assert_fails('tag a16', 'E433:')
192 let g:MytagFunc3_args = [] 214 let g:MytagFunc3_args = []
193 call assert_fails('tag a17', 'E433:') 215 call assert_fails('tag a17', 'E433:')
194 call assert_equal(['a17', '', {}], g:MytagFunc3_args) 216 call assert_equal(['a17', '', {}], g:MytagFunc3_args)
195 217
196 " Set 'tagfunc' to a lambda expression 218 " Set 'tagfunc' to a lambda expression
197 let &tagfunc = '{a, b, c -> MytagFunc3(a, b, c)}' 219 let &tagfunc = {a, b, c -> MytagFunc3(a, b, c)}
198 new | only 220 new | only
199 let g:MytagFunc3_args = [] 221 let g:MytagFunc3_args = []
200 call assert_fails('tag a18', 'E433:') 222 call assert_fails('tag a18', 'E433:')
201 call assert_equal(['a18', '', {}], g:MytagFunc3_args) 223 call assert_equal(['a18', '', {}], g:MytagFunc3_args)
202 224
225 " Set 'tagfunc' to a string(lambda expression)
226 let &tagfunc = '{a, b, c -> MytagFunc3(a, b, c)}'
227 new | only
228 let g:MytagFunc3_args = []
229 call assert_fails('tag a18', 'E433:')
230 call assert_equal(['a18', '', {}], g:MytagFunc3_args)
231
203 " Set 'tagfunc' to a variable with a lambda expression 232 " Set 'tagfunc' to a variable with a lambda expression
204 let Lambda = {a, b, c -> MytagFunc3(a, b, c)} 233 let Lambda = {a, b, c -> MytagFunc3(a, b, c)}
205 let &tagfunc = string(Lambda) 234 let &tagfunc = Lambda
206 new | only 235 new | only
207 let g:MytagFunc3_args = [] 236 let g:MytagFunc3_args = []
208 call assert_fails("tag a19", "E433:") 237 call assert_fails("tag a19", "E433:")
209 call assert_equal(['a19', '', {}], g:MytagFunc3_args) 238 call assert_equal(['a19', '', {}], g:MytagFunc3_args)
210 call assert_fails('let &tagfunc = Lambda', 'E729:') 239
240 " Set 'tagfunc' to a string(variable with a lambda expression)
241 let Lambda = {a, b, c -> MytagFunc3(a, b, c)}
242 let &tagfunc = string(Lambda)
243 new | only
244 let g:MytagFunc3_args = []
245 call assert_fails("tag a19", "E433:")
246 call assert_equal(['a19', '', {}], g:MytagFunc3_args)
211 247
212 " Test for using a lambda function with incorrect return value 248 " Test for using a lambda function with incorrect return value
213 let Lambda = {s -> strlen(s)} 249 let Lambda = {s -> strlen(s)}
214 let &tagfunc = string(Lambda) 250 let &tagfunc = string(Lambda)
215 new | only 251 new | only
242 # Test for using a lambda 278 # Test for using a lambda
243 def MytagFunc2(pat: string, flags: string, info: dict<any>): any 279 def MytagFunc2(pat: string, flags: string, info: dict<any>): any
244 g:MytagFunc2_args = [pat, flags, info] 280 g:MytagFunc2_args = [pat, flags, info]
245 return null 281 return null
246 enddef 282 enddef
247 &tagfunc = '(a, b, c) => MytagFunc2(a, b, c)' 283 &tagfunc = (a, b, c) => MytagFunc2(a, b, c)
248 new | only 284 new | only
249 g:MytagFunc2_args = [] 285 g:MytagFunc2_args = []
250 assert_fails('tag a20', 'E433:') 286 assert_fails('tag a20', 'E433:')
251 assert_equal(['a20', '', {}], g:MytagFunc2_args) 287 assert_equal(['a20', '', {}], g:MytagFunc2_args)
252 288
289 # Test for using a string(lambda)
290 &tagfunc = '(a, b, c) => MytagFunc2(a, b, c)'
291 new | only
292 g:MytagFunc2_args = []
293 assert_fails('tag a20', 'E433:')
294 assert_equal(['a20', '', {}], g:MytagFunc2_args)
295
253 # Test for using a variable with a lambda expression 296 # Test for using a variable with a lambda expression
254 var Fn: func = (a, b, c) => MytagFunc2(a, b, c) 297 var Fn: func = (a, b, c) => MytagFunc2(a, b, c)
298 &tagfunc = Fn
299 new | only
300 g:MytagFunc2_args = []
301 assert_fails('tag a30', 'E433:')
302 assert_equal(['a30', '', {}], g:MytagFunc2_args)
303
304 # Test for using a variable with a lambda expression
255 &tagfunc = string(Fn) 305 &tagfunc = string(Fn)
256 new | only 306 new | only
257 g:MytagFunc2_args = [] 307 g:MytagFunc2_args = []
258 assert_fails('tag a30', 'E433:') 308 assert_fails('tag a30', 'E433:')
259 assert_equal(['a30', '', {}], g:MytagFunc2_args) 309 assert_equal(['a30', '', {}], g:MytagFunc2_args)