Vendored WhatsApp/tree-sitter-erlang 0.19 (the ELP grammar, ABI 14) with an Erlang-shaped extractor: multi-clause/multi-arity functions merged into one symbol, -spec signatures, records with fields, -type/-opaque aliases, -define macros, -include/-include_lib file edges, and -export-driven visibility. Modules wrap in a namespace so remote mod:fn(...) calls resolve through the existing qualified-name matcher as mod::fn with zero resolver changes. -behaviour declarations link to the behaviour module — gated to namespace targets only (bare-name fallthrough linked -behaviour(supervisor) to an unrelated macro constant on emqx). OTP indirection with static targets is followed: spawn/apply/proc_lib/timer/rpc MFA-argument callees, and gen_server:call/cast(?MODULE | ?SERVER) to the module's own handle_call/handle_cast. Var-module dispatch and message sends stay deliberately unlinked. codegraph_explore also normalizes Erlang-native query spelling (mod:fn/3, init/2) so named symbols resolve as typed. Benchmarked on cowboy (189 files), ejabberd (414), emqx (2,447): extraction PASS on all three; with-codegraph arms reached 2/2/0 file Reads vs 10/5+/19 without, fastest on the largest repo. Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
63e1b5a23a
commit
6511722250
@@ -10,7 +10,7 @@ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
import * as os from 'os';
|
||||
import { getExploreOutputBudget, getExploreBudget, ToolHandler } from '../src/mcp/tools';
|
||||
import { getExploreOutputBudget, getExploreBudget, normalizeQuerySpelling, ToolHandler } from '../src/mcp/tools';
|
||||
import CodeGraph from '../src/index';
|
||||
|
||||
describe('getExploreOutputBudget', () => {
|
||||
@@ -254,3 +254,27 @@ describe('codegraph_explore output respects the adaptive budget', () => {
|
||||
expect(hasMethodBody).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('normalizeQuerySpelling (Erlang mod:fn/arity)', () => {
|
||||
it('rewrites Erlang-native symbol spellings to pipeline shapes', () => {
|
||||
expect(normalizeQuerySpelling('cowboy_stream_h:request_process/3'))
|
||||
.toBe('cowboy_stream_h.request_process');
|
||||
expect(normalizeQuerySpelling('ejabberd_router:route/1 do_route/1 session'))
|
||||
.toBe('ejabberd_router.route do_route session');
|
||||
expect(normalizeQuerySpelling('init/2 handle_call/3')).toBe('init handle_call');
|
||||
});
|
||||
|
||||
it('leaves query-language field prefixes and other spellings alone', () => {
|
||||
expect(normalizeQuerySpelling('kind:function lang:erlang route'))
|
||||
.toBe('kind:function lang:erlang route');
|
||||
expect(normalizeQuerySpelling('path:src/api name:auth')).toBe('path:src/api name:auth');
|
||||
expect(normalizeQuerySpelling('Foo::bar baz')).toBe('Foo::bar baz');
|
||||
expect(normalizeQuerySpelling('https://example.com/docs')).toBe('https://example.com/docs');
|
||||
expect(normalizeQuerySpelling('meeting at 12:30')).toBe('meeting at 12:30');
|
||||
expect(normalizeQuerySpelling('src/2fa/handler.ts')).toBe('src/2fa/handler.ts');
|
||||
});
|
||||
|
||||
it('maps Lua colon-method spelling onto the qualified form', () => {
|
||||
expect(normalizeQuerySpelling('logger:log message')).toBe('logger.log message');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user