You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(mcp): return function-pointer calls apart from resolved callees
- grepnavi_callees lists member calls under indirect_calls with the
member name, call line, receiver and source text, instead of
resolving the member name and attaching a confidence to whatever
same-named function the index returned first
- The list survives compact mode and deeper levels, so an agent cannot
conclude that a function calls nothing through its ops table
- A one-line note points at grepnavi_references(word, assign: true)
for the registration sites; the limits (positional and macro-built
tables) are in the tool description
"Pass `word` (caller name) for auto-resolve via grepnavi_definition; errors on ambiguity with candidate list, then disambiguate via `file`+`line`. Or pass `file`+`line` directly.\n\n"+
308
308
"Each result: `name`, `call_line`, `kind`, `engine`, `confidence` ('high'|'medium'|'low' for the picked top definition — **'low' means the pick may be wrong**), `likely_macro`, `likely_non_callable`, `likely_trivial` (well-known primitives: locking / atomics / mem-str / printk / le_to_cpu / container_of etc — definition lookup is **skipped entirely** for these to avoid bogus picks like spin_lock → selftests/.../spinlock.c), `in_caller_subtree` (def shares caller's dir tree = same subsystem), `recommended_for_tree` (= !macro && !non_callable && !trivial — **the simple filter for 'what to actually pin'**), `definitions` (top 1, proximity-ranked), `definitions_total`. Caller itself auto-excluded.\n\n"+
309
309
"**Defaults**: `exclude_macros: true`, `exclude_non_callable: true` (noise filtered out; pass false to see). The response's `excluded.macros` / `excluded.non_callable` are **arrays of NAMES** that were dropped — eyeball them to confirm they're real noise, no re-query needed.\n\n"+
310
+
"**Calls through function pointers come back separately as `indirect_calls`** (`s->method->ssl_read(...)`, `ops.read(...)`): each has `name` (the member), `call_line`, `receiver` (`s->method`) and `text`. They are kept out of `callees` on purpose — resolving the member name as a function would pick an unrelated same-named function and dress it in a confidence. What the member holds is not decidable from text; grepnavi_references(word: name, assign: true) shows `.name = fn` initializers and `x->name = fn` assignments, but not tables built positionally or by macros.\n\n"+
310
311
"`compact: true` drops the judgement fields and returns name / call_line / kind / `pin` (= recommended_for_tree) / `def` only — a fraction of the tokens when you only need the list to pick from.\n\n"+
311
312
"**A large answer compacts itself.** When you pass neither value and the full form would be over ~8 KB, the response comes back compact with a `compacted` field naming what was dropped and how to get it — a function with 38 callees is 12.5 KB full and 5 KB compact, and past that size the answer tends to be set aside unread rather than used. Pass `compact: false` when you actually need the judgement fields, ideally with `depth: 1` or a narrower caller.\n\n"+
312
313
"`depth` > 1 recurses (max 5). Macros / no-def / cycles don't recurse further. **Cost note**: each extra level fans out and can take seconds; start at depth 1 unless you need more.\n\n"+
0 commit comments