module
Noir::GoCalleeExtractor
Overview
Tree-sitter-backed Go 1-hop callee extractor. Parallels
Noir::PythonCalleeExtractor but works at the AST level — Go can't
share the Python convention of "give me a body string", because
tree-sitter Go needs a complete source_file and a bare function body
isn't one.
The extractor receives a full Go file plus the set of route call expression rows the analyzer cares about. For each match it locates the handler argument and walks the appropriate body:
func_literal(inline closure handler) — walk the closure's body in place;path/lineon emitted callees point at the original file.identifier(named handler) — look the name up in the file's top-levelfunction_declarations first, then inexternal_functions(sibling files in the same Go package). The external map is built once per directory byGoEngine#collect_package_function_bodiesso cross-file lookups are cheap.selector_expression/ other shapes — skipped for the first cut. Real-world examples includepkg.Foo(cross-package) and bound method values (handler.Get); resolving those needs full import resolution and is left as a follow-up.
Builtins (len, make, append, …) and Go's primitive type
constructors (int, string, byte, …) are filtered to keep the
per-endpoint list focused on signal that's actually useful to an AI
reviewer.
Extended Modules
Defined in:
miniparsers/go_callee_extractor.crConstant Summary
-
BUILTINS =
Set {"len", "cap", "make", "new", "append", "copy", "delete", "close", "panic", "recover", "print", "println", "string", "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64", "uintptr", "byte", "rune", "float32", "float64", "complex64", "complex128", "complex", "bool", "error"} -
Go builtins and primitive type-conversions that carry no useful signal. Anything framework-specific (
c.JSON,c.Query,gin.H{...}, etc.) is kept on purpose — those tell a reviewer how the endpoint shapes input/output.
Instance Method Summary
-
#callees_for_routes(source : String, file_path : String, route_rows : Set(Int32), external_functions : Hash(String, FunctionBody))
For each call_expression at a row in
route_rows, find the handler argument, walk its body, and return the 1-hop callees keyed by row. -
#callees_for_routes_if(enabled : Bool, source : String, file_path : String, route_rows : Set(Int32), external_functions : Hash(String, FunctionBody))
Like
#callees_for_routes, but returns an empty map immediately whenenabledis false. -
#collect_function_bodies(source : String, file_path : String) : Hash(String, FunctionBody)
Returns top-level function declarations in
source, keyed by name. -
#function_bodies_for_directory(package_bodies : Hash(String, Hash(String, FunctionBody)), dir : String) : Hash(String, FunctionBody)
Returns the cross-file function-body map for the given directory, or an empty map.
-
#package_function_bodies(file_contents : Hash(String, String)) : Hash(String, Hash(String, FunctionBody))
Walk every cached
.gosource infile_contentsand collect top-levelfunction_declarationnodes into a per-directory map so cross-file identifier-handler resolution is O(1) at lookup time. -
#package_function_bodies_if(enabled : Bool, file_contents : Hash(String, String)) : Hash(String, Hash(String, FunctionBody))
Like
#package_function_bodies, but returns an empty map immediately whenenabledis false.
Instance Method Detail
For each call_expression at a row in route_rows, find the handler
argument, walk its body, and return the 1-hop callees keyed by row.
Each entry is a tuple {name, callee_file_path, file_line_1_based}.
Like #callees_for_routes, but returns an empty map immediately when
enabled is false. Lets analyzers skip the tree-sitter walk on
default scans where callees won't be observed.
Returns top-level function declarations in source, keyed by name.
file_path is recorded on each FunctionBody so callees emitted by
later re-parsing can report a useful path.
Returns the cross-file function-body map for the given directory,
or an empty map. Mirrors GoEngine#ts_function_bodies_for_directory.
Walk every cached .go source in file_contents and collect
top-level function_declaration nodes into a per-directory map
so cross-file identifier-handler resolution is O(1) at lookup
time. Keyed by directory because Go's name resolution is scoped
to a single package (== single directory). Module-level twin of
GoEngine#collect_package_function_bodies for analyzers (Chi)
that don't inherit from GoEngine.
Like #package_function_bodies, but returns an empty map immediately
when enabled is false. Module-level twin of the
GoEngine#collect_package_function_bodies gate for analyzers that
don't inherit from GoEngine.