Skip to content

Commit 9289fbb

Browse files
committed
better error printing
1 parent 49b3fee commit 9289fbb

File tree

1 file changed

+32
-8
lines changed

1 file changed

+32
-8
lines changed

src/KeywordDispatch.jl

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,30 @@ struct KeywordMethodError <: Exception
5858
KeywordMethodError(@nospecialize(f), @nospecialize(args), @nospecialize(kwargs)) = new(f, args, kwargs)
5959
end
6060

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+
6185
function kwcall(nt::NamedTuple, f, args...)
6286
throw(KeywordMethodError(f, args, nt))
6387
end
@@ -85,7 +109,7 @@ methods, use the [`@kwmethod`](@ref) macro.
85109
"""
86110
macro kwdispatch(fexpr)
87111
fexpr = outexpr = :($fexpr = _)
88-
112+
89113
# unwrap where clauses
90114
while fexpr.args[1] isa Expr && fexpr.args[1].head == :where
91115
fexpr = fexpr.args[1]
@@ -97,9 +121,9 @@ macro kwdispatch(fexpr)
97121
if fcall isa Symbol || fcall isa Expr && (fcall.head in (:., :(::), :curly))
98122
fcall = :($fcall(_...))
99123
end
100-
124+
101125
@assert fcall isa Expr && fcall.head == :call
102-
126+
103127
f = fcall.args[1]
104128
fargs = fcall.args[2:end]
105129
if length(fargs) >= 1 && fargs[1] isa Expr && fargs[1].head == :parameters
@@ -112,10 +136,10 @@ macro kwdispatch(fexpr)
112136
else
113137
ftype = :(typeof($(esc(f))))
114138
end
115-
139+
116140
fargs_method = argmeth.(fargs)
117141
fexpr.args[1] = :($(esc(f))($(esc.(fargs_method)...); kwargs...))
118-
142+
119143
outexpr.args[2] = :(kwcall(ntsort(kwargs.data), $(esc(argsym(f))), $(esc.(argsym.(fargs_method))...)))
120144
return outexpr
121145
end
@@ -142,7 +166,7 @@ The positional signature should first be designated by the [`@kwdispatch`](@ref)
142166
macro kwmethod(fexpr)
143167
@assert fexpr isa Expr && fexpr.head in (:function, :(=))
144168
fexpr.args[2] = esc(fexpr.args[2])
145-
169+
146170
outexpr = fexpr
147171
# unwrap where clauses
148172
while fexpr.args[1] isa Expr && fexpr.args[1].head == :where
@@ -152,12 +176,12 @@ macro kwmethod(fexpr)
152176

153177
fcall = fexpr.args[1]
154178
@assert fcall isa Expr && fcall.head == :call
155-
179+
156180
f = fcall.args[1]
157181

158182
length(fcall.args) >= 2 && fcall.args[2] isa Expr && fcall.args[2].head == :parameters ||
159183
error("@kwdef requires functions specify a keyword block.\nUse @kwdef `f(args...;)` to specify no keywords.")
160-
184+
161185
kwargs = fcall.args[2].args
162186
fargs = fcall.args[3:end]
163187

0 commit comments

Comments
 (0)