I’ve often encountered a problem figuring out where a method is defined when it’s definition happens through a macro. For example:
macro foo()
:(bar() = x)
end
@foo()
bar()
This gives an UndefVarError with a stacktrace pointing to line 2 (inside the foo macro), but not showing line 5, where the definition was expanded from (usually, of course, it won’t be in the same file).
How can I find this information? Is it even stored anywhere? It doesn’t seem to be anywhere in the Method object (@which bar()).
you can make it work to do that, but it is not easy.
And the user can’t do it, it needs to be written into the macro, to tell it that the location of code defined inside it is the location the macro was called from.
I just found an old-ish issue about this problem, which contains one useful hint: a Method’s module field is the macro’s caller, so at least that’s some starting point in looking for it.
julia> using StatsPlots
julia> using FindDefinition
julia> methods(StatsPlots.qqplot)
# 1 method for generic function "qqplot":
[1] qqplot(args...; kw...) in StatsPlots at [...]\.julia\packages\RecipesBase\92zOw\src\RecipesBase.jl:357
julia> finddefs(StatsPlots.qqplot)
1-element Array{LineNumberNode,1}:
:(#= [...]\.julia\packages\StatsPlots\IMY3F\src\distributions.jl:96 =#)