feat: Add Ruby bare method call extraction for identifier nodes
Addresses Ruby bare method calls like `reset` that parse as identifier nodes instead of call expressions. Adds extractBareCall hook to detect statement-level identifiers that represent method calls, filtering out keywords, literals, and constants. Enables proper call relationship tracking for Ruby's parentheses-optional method syntax.
This commit is contained in:
@@ -38,6 +38,35 @@ export const rubyExtractor: LanguageExtractor = {
|
||||
ctx.popScope();
|
||||
return true; // handled
|
||||
},
|
||||
extractBareCall: (node, _source) => {
|
||||
// Ruby bare method calls (no parens, no receiver) parse as plain identifiers.
|
||||
// e.g., `reset` in a method body is `identifier "reset"` not a `call` node.
|
||||
if (node.type !== 'identifier') return undefined;
|
||||
|
||||
const parent = node.parent;
|
||||
if (!parent) return undefined;
|
||||
|
||||
// Only statement-level identifiers — direct children of block/body nodes
|
||||
const BLOCK_PARENTS = new Set([
|
||||
'body_statement', 'then', 'else', 'do', 'begin',
|
||||
'rescue', 'ensure', 'when',
|
||||
]);
|
||||
if (!BLOCK_PARENTS.has(parent.type)) return undefined;
|
||||
|
||||
const name = node.text;
|
||||
|
||||
// Skip Ruby keywords/literals
|
||||
const SKIP = new Set([
|
||||
'true', 'false', 'nil', 'self', 'super',
|
||||
'__FILE__', '__LINE__', '__dir__',
|
||||
]);
|
||||
if (SKIP.has(name)) return undefined;
|
||||
|
||||
// Skip constants (uppercase start) — these are class/module refs, not calls
|
||||
if (name.length > 0 && name.charCodeAt(0) >= 65 && name.charCodeAt(0) <= 90) return undefined;
|
||||
|
||||
return name;
|
||||
},
|
||||
getVisibility: (node) => {
|
||||
// Ruby visibility is based on preceding visibility modifiers
|
||||
let sibling = node.previousNamedSibling;
|
||||
|
||||
Reference in New Issue
Block a user