export interface CallNodeLookup {
    byNameAndFile(name: string, file: string): ReadonlyArray<{
        id: number;
        file: string;
        kind?: string;
    }>;
    byName(name: string): ReadonlyArray<{
        id: number;
        file: string;
        kind?: string;
    }>;
    isBarrel(file: string): boolean;
    resolveBarrel(barrelFile: string, symbolName: string): string | null;
    nodeId(name: string, kind: string, file: string, line: number): {
        id: number;
    } | undefined;
}
export declare const RECEIVER_KINDS: Set<string>;
export declare function isModuleScopedLanguage(relPath: string): boolean;
export declare function findCaller(lookup: CallNodeLookup, call: {
    line: number;
}, definitions: ReadonlyArray<{
    name: string;
    kind: string;
    line: number;
    endLine?: number | null;
}>, relPath: string, fileNodeRow: {
    id: number;
}): {
    id: number;
    callerName: string | null;
};
export declare function resolveByMethodOrGlobal(lookup: CallNodeLookup, call: {
    name: string;
    receiver?: string | null;
}, relPath: string, typeMap: Map<string, unknown>, callerName?: string | null): ReadonlyArray<{
    id: number;
    file: string;
}>;
export declare function resolveCallTargets(lookup: CallNodeLookup, call: {
    name: string;
    receiver?: string | null;
}, relPath: string, importedNames: Map<string, string>, typeMap: Map<string, unknown>, callerName?: string | null): {
    targets: Array<{
        id: number;
        file: string;
    }>;
    importedFrom: string | undefined;
};
/**
 * Resolve the receiver-type edge for a call site.
 * Returns the edge tuple to insert, or null if nothing matched or the edge
 * was already seen.  Callers are responsible for the actual DB/array insert.
 *
 * Receiver resolution collects all same-file candidates first (no kind
 * filter), falls back to global candidates only when the same-file set is
 * entirely empty, then filters the chosen set by RECEIVER_KINDS.  This
 * matches the native Rust build path: if a file imports a name that happens
 * to be emitted as `kind='function'` in the importer, the same-file set is
 * non-empty and blocks the global fallback, so no receiver edge is emitted.
 * Keeping this behaviour identical to the Rust path maintains engine parity.
 */
export declare function resolveReceiverEdge(lookup: CallNodeLookup, call: {
    name: string;
    receiver: string;
}, caller: {
    id: number;
}, relPath: string, typeMap: Map<string, unknown>, seenCallEdges: Set<string>): {
    callerId: number;
    receiverId: number;
    confidence: number;
} | null;
//# sourceMappingURL=call-resolver.d.ts.map