@@ -529,6 +529,17 @@ static char *extract_objc_callee(CBMArena *a, TSNode node, const char *source, c
529529 return ts_node_is_null (selector ) ? NULL : cbm_node_text (a , selector , source );
530530}
531531
532+ /* tree-sitter-elixir gives a call's arguments node no field name, so it is
533+ * found positionally. Mirrors elixir_call_args() in extract_defs.c, which the
534+ * definition side has always used for the same reason. */
535+ static TSNode elixir_call_arguments_fallback (TSNode node ) {
536+ TSNode args = ts_node_child_by_field_name (node , TS_FIELD ("arguments" ));
537+ if (ts_node_is_null (args ) && ts_node_child_count (node ) > 1 ) {
538+ args = ts_node_child (node , 1 );
539+ }
540+ return args ;
541+ }
542+
532543// Erlang: extract callee from call node's first child.
533544static char * extract_erlang_callee (CBMArena * a , TSNode node , const char * source , const char * nk ) {
534545 if (strcmp (nk , "call" ) != 0 || ts_node_child_count (node ) == 0 ) {
@@ -3697,6 +3708,21 @@ CBMInvocationDescriptor handle_calls(CBMExtractCtx *ctx, TSNode node, const CBML
36973708 }
36983709
36993710 TSNode args = ts_node_child_by_field_name (node , TS_FIELD ("arguments" ));
3711+ /* tree-sitter-elixir attaches NO field name to a call's arguments
3712+ * node — its whole field set is key, left, operand, operator,
3713+ * quoted_start, quoted_end, right, target, value — so the lookup
3714+ * above is always null for Elixir and first_string_arg was never
3715+ * populated for ANY Elixir call. That silently disabled every
3716+ * downstream signal keyed off a call's string argument: Phoenix
3717+ * route paths, HTTP/async service URLs, and config keys.
3718+ * cbm_elixir_call_args is the shared second-child fallback the
3719+ * definition side already uses. Restricted to `call` nodes —
3720+ * Elixir's other call kinds (`dot`, the `|>` binary_operator) have
3721+ * no arguments node in that position. */
3722+ if (ts_node_is_null (args ) && ctx -> language == CBM_LANG_ELIXIR &&
3723+ strcmp (ts_node_type (node ), "call" ) == 0 ) {
3724+ args = elixir_call_arguments_fallback (node );
3725+ }
37003726 // ObjectScript stores args under oref_method/method_args, not the
37013727 // generic "arguments" field; macro arguments add one wrapper.
37023728 if (ts_node_is_null (args ) && is_objectscript_language (ctx -> language )) {
0 commit comments