Version / commit
v0.9.77 (v8 @ 5c7b847)
Environment
macOS, Python 3.13, clean checkout of v8.
What happens
Any Julia method written with a where clause is silently dropped from the graph — no node, no defines edge, and none of the calls made from its body are recorded.
where constraints are everywhere in idiomatic generic Julia, so this erases a large fraction of a real codebase's functions.
Minimal reproduction
# where.jl
function combine(a::Vector{T}, b::Vector{T}) where {T<:Number}
merge_all(a, b)
end
function merge_all(a, b)
return a
end
from graphify.extract import extract_julia
r = extract_julia("where.jl")
print([n["label"] for n in r["nodes"]])
# -> ['where.jl', 'merge_all()'] # 'combine()' is missing
print([(e["source"], e["target"]) for e in r["edges"] if e["relation"] == "calls"])
# -> [] # combine -> merge_all lost
Expected vs actual
- Expected: a
combine() node with a calls edge to merge_all.
- Actual:
combine is absent and its body call vanishes.
Root cause
The signature reader only looks for a direct call_expression child of the signature node, but a where method wraps the call head in a where_expression, so the name is never found and the definition falls through.
A clean checkout of v8 reproduces it. Fix PR to follow.
Version / commit
v0.9.77 (v8 @ 5c7b847)
Environment
macOS, Python 3.13, clean checkout of
v8.What happens
Any Julia method written with a
whereclause is silently dropped from the graph — no node, nodefinesedge, and none of the calls made from its body are recorded.whereconstraints are everywhere in idiomatic generic Julia, so this erases a large fraction of a real codebase's functions.Minimal reproduction
Expected vs actual
combine()node with acallsedge tomerge_all.combineis absent and its body call vanishes.Root cause
The signature reader only looks for a direct
call_expressionchild of thesignaturenode, but awheremethod wraps the call head in awhere_expression, so the name is never found and the definition falls through.A clean checkout of
v8reproduces it. Fix PR to follow.