@@ -58,6 +58,30 @@ struct KeywordMethodError <: Exception
58
58
KeywordMethodError (@nospecialize (f), @nospecialize (args), @nospecialize (kwargs)) = new (f, args, kwargs)
59
59
end
60
60
61
+ function Base. showerror (io:: IO , err:: KeywordMethodError )
62
+ print (io, " KeywordMethodError: no keyword matching " )
63
+ if err. f isa Function || err. f isa Type
64
+ print (io, err. f)
65
+ else
66
+ print (io, " (::" , typeof (err. f), " )" )
67
+ end
68
+ print (io, " (" )
69
+ for (i, arg) in enumerate (err. args)
70
+ print (io, " ::" , typeof (arg))
71
+ if i != length (err. args)
72
+ print (io, " , " )
73
+ end
74
+ end
75
+ print (io, " ; " )
76
+ for (i, (kw,kwarg)) in enumerate (pairs (err. kwargs))
77
+ print (io, kw, " ::" , typeof (kwarg))
78
+ if i != length (err. kwargs)
79
+ print (io, " , " )
80
+ end
81
+ end
82
+ print (io, " )" )
83
+ end
84
+
61
85
function kwcall (nt:: NamedTuple , f, args... )
62
86
throw (KeywordMethodError (f, args, nt))
63
87
end
@@ -85,7 +109,7 @@ methods, use the [`@kwmethod`](@ref) macro.
85
109
"""
86
110
macro kwdispatch (fexpr)
87
111
fexpr = outexpr = :($ fexpr = _)
88
-
112
+
89
113
# unwrap where clauses
90
114
while fexpr. args[1 ] isa Expr && fexpr. args[1 ]. head == :where
91
115
fexpr = fexpr. args[1 ]
@@ -97,9 +121,9 @@ macro kwdispatch(fexpr)
97
121
if fcall isa Symbol || fcall isa Expr && (fcall. head in (:., :(:: ), :curly ))
98
122
fcall = :($ fcall (_... ))
99
123
end
100
-
124
+
101
125
@assert fcall isa Expr && fcall. head == :call
102
-
126
+
103
127
f = fcall. args[1 ]
104
128
fargs = fcall. args[2 : end ]
105
129
if length (fargs) >= 1 && fargs[1 ] isa Expr && fargs[1 ]. head == :parameters
@@ -112,10 +136,10 @@ macro kwdispatch(fexpr)
112
136
else
113
137
ftype = :(typeof ($ (esc (f))))
114
138
end
115
-
139
+
116
140
fargs_method = argmeth .(fargs)
117
141
fexpr. args[1 ] = :($ (esc (f))($ (esc .(fargs_method)... ); kwargs... ))
118
-
142
+
119
143
outexpr. args[2 ] = :(kwcall (ntsort (kwargs. data), $ (esc (argsym (f))), $ (esc .(argsym .(fargs_method))... )))
120
144
return outexpr
121
145
end
@@ -142,7 +166,7 @@ The positional signature should first be designated by the [`@kwdispatch`](@ref)
142
166
macro kwmethod (fexpr)
143
167
@assert fexpr isa Expr && fexpr. head in (:function , :(= ))
144
168
fexpr. args[2 ] = esc (fexpr. args[2 ])
145
-
169
+
146
170
outexpr = fexpr
147
171
# unwrap where clauses
148
172
while fexpr. args[1 ] isa Expr && fexpr. args[1 ]. head == :where
@@ -152,12 +176,12 @@ macro kwmethod(fexpr)
152
176
153
177
fcall = fexpr. args[1 ]
154
178
@assert fcall isa Expr && fcall. head == :call
155
-
179
+
156
180
f = fcall. args[1 ]
157
181
158
182
length (fcall. args) >= 2 && fcall. args[2 ] isa Expr && fcall. args[2 ]. head == :parameters ||
159
183
error (" @kwdef requires functions specify a keyword block.\n Use @kwdef `f(args...;)` to specify no keywords." )
160
-
184
+
161
185
kwargs = fcall. args[2 ]. args
162
186
fargs = fcall. args[3 : end ]
163
187
0 commit comments