Connect each source() call node to the index of the file it sources in ast.ast.files (index 0 is main).
A source() call lives in its parent file, so we reach its sourced block via the control dependency the
dataflow analysis adds (see sourceRequest): a vertex whose innermost cd (cds[0]) is a source call
belongs to that call's directly sourced block. Every node carries its resolved file in info.file, so the
block's info.file names the sourced file independent of the call site, and one graph pass resolves all
calls via small map lookups. A file sourced from several sites is stored once but each block still tags the
same info.file, so all sites map to that single index (this also drives cycle detection: a re-sourcing
call resolves to an already-visited index).
Connect each
source()call node to the index of the file it sources inast.ast.files(index 0 is main).A
source()call lives in its parent file, so we reach its sourced block via the control dependency the dataflow analysis adds (see sourceRequest): a vertex whose innermost cd (cds[0]) is a source call belongs to that call's directly sourced block. Every node carries its resolved file ininfo.file, so the block'sinfo.filenames the sourced file independent of the call site, and one graph pass resolves all calls via small map lookups. A file sourced from several sites is stored once but each block still tags the sameinfo.file, so all sites map to that single index (this also drives cycle detection: a re-sourcing call resolves to an already-visited index).