There still an issue with inferring for a given function call / constant reference where that thing is defined. We're currently generating the forest of references from the call graph by calculating a spanning forest. There's a problem with that. Consider the following map of call-sites: { a: [b] b: [] } The following is a spanning tree: { a: [] b: [] } Here it looks like `a` doesn't call `b`. We should also store all the call-sites. These will end up as leaves in the call tree. { "K": {}, "A": {}, "f": { "f": "__cycle__" }, "A.f": { "K.g": {} } } Write graphviz output.