Check each call has a corresponding method

JET already does this, provided the method dispatch is done at compile-time, successful or not. This is consistent with AOT-compiled languages checking things before runtime.

julia> begin
       foo() = bar()
       bar() = baz(1)
       baz() = 0
       using JET
       end

julia> @report_call foo()
═════ 1 possible error found ═════
┌ foo() @ Main ./REPL[1]:2
│┌ bar() @ Main ./REPL[3]:1
││ no matching method found `baz(::Int64)`: baz(1)

If the method dispatch is done at runtime, then you can’t know if it’s an issue until runtime. Unlike non-interactive languages, the method could be implemented afterward at top-level (if not there, then you run into world age restrictions that exist to enable optimizations including static dispatch), and the compiled runtime dispatch code will work without any changes. I find Cthulhu.jl to spot runtime dispatches a bit better, then it’s up to you whether you improve type stability until the dispatch moves to compile-time or you make sure to implement all the methods needed there.