/**
 * Reference type normalization helpers, key classification, and per-binding caches.
 *
 * Split from references.ts for file-size compliance (< 800 LOC).
 */
import * as ts from "typescript";
import { IrType, IrInterfaceMember } from "../../../types.js";
import type { Binding } from "../../../binding/index.js";
/**
 * tsbindgen emits qualified names for core System primitives inside internal
 * extension bucket signatures, e.g. `System_Internal.Boolean`.
 *
 * For IR purposes these must canonicalize to the compiler's surface primitive
 * / numeric alias names so:
 * - deterministic lambda typing can use `boolean`/`int` etc
 * - the IR soundness gate does not treat these as unresolved reference types
 *
 * This is NOT a workaround: it is the correct boundary translation from the
 * tsbindgen surface name to Tsonic's canonical IR type names.
 */
export declare const normalizeSystemInternalQualifiedName: (typeName: string) => string;
/**
 * tsbindgen extension bucket files import namespaces as `System_Collections_Generic`, etc,
 * then reference types via qualified names like `System_Collections_Generic.List_1`.
 *
 * For IR purposes we must canonicalize these to their simple TS export names
 * (e.g., `List_1`) so they resolve through the binding registry.
 */
export declare const normalizeNamespaceAliasQualifiedName: (typeName: string) => string;
export declare const normalizeExpandedAliasType: (type: IrType) => IrType;
export declare const isSymbolTypeReferenceNode: (node: ts.TypeNode) => boolean;
export declare const classifyDictionaryKeyTypeNode: (keyTypeNode: ts.TypeNode, convertType: (node: ts.TypeNode, binding: Binding) => IrType, binding: Binding) => IrType | undefined;
/**
 * Per-binding caches for structural extraction and alias-body expansion.
 *
 * Airplane-grade determinism requirement:
 * - Cache lifetime MUST be scoped to one compilation context.
 * - DeclId numeric handles are stable only within a binding universe.
 * - Cross-program cache reuse can silently miscompile types.
 *
 * We use WeakMap<Binding, ...> to isolate caches per program/binding graph.
 */
export type StructuralMembersCache = Map<number, readonly IrInterfaceMember[] | null | "in-progress">;
export type TypeAliasBodyCache = Map<number, IrType | "in-progress">;
export type TypeAliasRecursionCache = Map<number, boolean | "in-progress">;
export declare const getStructuralMembersCache: (binding: Binding) => StructuralMembersCache;
export declare const getTypeAliasBodyCache: (binding: Binding) => TypeAliasBodyCache;
export declare const getTypeAliasRecursionCache: (binding: Binding) => TypeAliasRecursionCache;
//# sourceMappingURL=references-normalize.d.ts.map