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
@@ -1753,6 +1753,26 @@ export function matchReference(
|
||||
return matchFunctionRef(ref, context);
|
||||
}
|
||||
|
||||
// Erlang `-behaviour(m)` refs target a MODULE. Letting them fall through to
|
||||
// bare-name matching grabs any same-named symbol — on emqx,
|
||||
// `-behaviour(supervisor)` resolved to a `-define(supervisor, …)` macro
|
||||
// constant in an unrelated app. Resolve only to the behaviour module's
|
||||
// namespace; an out-of-repo behaviour (OTP's gen_server/supervisor) stays
|
||||
// unresolved rather than guessed.
|
||||
if (ref.language === 'erlang' && ref.referenceKind === 'implements') {
|
||||
const modules = context
|
||||
.getNodesByName(ref.referenceName)
|
||||
.filter((n) => n.language === 'erlang' && n.kind === 'namespace');
|
||||
const chosen = preferCallSiteFile(modules, ref.filePath)[0];
|
||||
if (!chosen) return null;
|
||||
return {
|
||||
original: ref,
|
||||
targetNodeId: chosen.id,
|
||||
confidence: 0.9,
|
||||
resolvedBy: 'exact-match',
|
||||
};
|
||||
}
|
||||
|
||||
// Try strategies in order of confidence
|
||||
let result: ResolvedRef | null;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user