@@ -206,7 +206,7 @@ isshortdef(ex) = (@capture(ex, (fcall_ = body_)) &&
206
206
207
207
function longdef1 (ex)
208
208
if @capture (ex, (arg_ -> body_))
209
- @q function ($ arg,) $ body end
209
+ @q function ($ arg,) $ ( body. args ... ) end
210
210
elseif isshortdef (ex)
211
211
@assert @capture (ex, (fcall_ = body_))
212
212
striplines (Expr (:function , fcall, body))
@@ -218,12 +218,13 @@ longdef(ex) = prewalk(longdef1, ex)
218
218
219
219
function shortdef1 (ex)
220
220
@match ex begin
221
- function f_ (args__) body_ end => @q $ f ($ (args... )) = $ body
222
- function f_ (args__) where T__ body_ end => @q $ f ($ (args... )) where $ (T... ) = $ body
223
- function f_ (args__):: rtype_ body_ end => @q $ f ($ (args... )):: $rtype = $ body
224
- function (args__,) body_ end => @q ($ (args... ),) -> $ body
221
+ function f_ (args__) body_ end => @q $ f ($ (args... )) = $ (body. args... )
222
+ function f_ (args__) where T__ body_ end => @q $ f ($ (args... )) where $ (T... ) = $ (body. args... )
223
+ function f_ (args__):: rtype_ body_ end => @q $ f ($ (args... )):: $rtype = $ (body. args... )
224
+ function f_ (args__):: rtype_ where T__ body_ end => @q ($ f ($ (args... )):: $rtype ) where $ (T... ) = $ (body. args... )
225
+ function (args__,) body_ end => @q ($ (args... ),) -> $ (body. args... )
225
226
((args__,) -> body_) => ex
226
- (arg_ -> body_) => @q ($ arg,) -> $ body
227
+ (arg_ -> body_) => @q ($ arg,) -> $ ( body. args ... )
227
228
_ => ex
228
229
end
229
230
end
@@ -289,23 +290,38 @@ end
289
290
`combinedef` is the inverse of `splitdef`. It takes a splitdef-like Dict
290
291
and returns a function definition. """
291
292
function combinedef (dict:: Dict )
292
- rtype = get (dict, :rtype , :Any )
293
+ rtype = get (dict, :rtype , nothing )
293
294
params = get (dict, :params , [])
294
295
wparams = get (dict, :whereparams , [])
296
+ body = block (dict[:body ])
295
297
name = dict[:name ]
296
298
name_param = isempty (params) ? name : :($ name{$ (params... )})
297
299
# We need the `if` to handle parametric inner/outer constructors like
298
300
# SomeType{X}(x::X) where X = SomeType{X}(x, x+2)
299
301
if isempty (wparams)
300
- :(function $name_param ($ (dict[:args ]. .. );
301
- $ (dict[:kwargs ]. .. )):: $rtype
302
- $ (dict[:body ])
303
- end )
302
+ if rtype== nothing
303
+ @q (function $name_param ($ (dict[:args ]. .. );
304
+ $ (dict[:kwargs ]. .. ))
305
+ $ (body. args... )
306
+ end )
307
+ else
308
+ @q (function $name_param ($ (dict[:args ]. .. );
309
+ $ (dict[:kwargs ]. .. )):: $rtype
310
+ $ (body. args... )
311
+ end )
312
+ end
304
313
else
305
- :(function $name_param ($ (dict[:args ]. .. );
306
- $ (dict[:kwargs ]. .. )):: $rtype where {$ (wparams... )}
307
- $ (dict[:body ])
308
- end )
314
+ if rtype== nothing
315
+ @q (function $name_param ($ (dict[:args ]. .. );
316
+ $ (dict[:kwargs ]. .. )) where {$ (wparams... )}
317
+ $ (body. args... )
318
+ end )
319
+ else
320
+ @q (function $name_param ($ (dict[:args ]. .. );
321
+ $ (dict[:kwargs ]. .. )):: $rtype where {$ (wparams... )}
322
+ $ (body. args... )
323
+ end )
324
+ end
309
325
end
310
326
end
311
327
0 commit comments