/**
 * Declaration file classification, bindings resolution, CLR identity,
 * and type-alias erasure/recursion analysis helpers.
 *
 * Split from references-structural.ts for file-size compliance (< 500 LOC).
 */
import * as ts from "typescript";
import type { DeclId } from "../../../type-system/types.js";
import type { Binding } from "../../../binding/index.js";
/**
 * Check whether a declaration file is a Tsonic-generated bindings artifact.
 *
 * We only apply aggressive declaration-file type-alias erasure to these files.
 * Airplane-grade rule: Never erase type aliases from tsbindgen-produced stdlib
 * packages (e.g., @tsonic/dotnet, @tsonic/core). Those aliases often encode CLR
 * nominal types (interfaces, delegates, indexers) and must remain NOMINAL.
 */
export declare const isTsonicBindingsDeclarationFile: (fileName: string) => boolean;
export declare const isTsonicSourcePackageFile: (fileName: string) => boolean;
export declare const shouldPreserveUserTypeAliasIdentity: (decl: ts.TypeAliasDeclaration) => boolean;
export declare const resolveSourceClrIdentity: (declId: DeclId | undefined, binding: Binding) => string | undefined;
/**
 * Determine whether a TS-only type alias target is safe to erase to its underlying shape.
 *
 * Erase only aliases whose targets are semantically transparent for lowering:
 * - references / arrays / primitive and literal aliases
 * - callable aliases
 * - intersections / indexed access / typeof / keyof / readonly-style wrappers
 *
 * Preserve aliases whose identity is required for stable lowering contracts:
 * - object/type-literal aliases (these lower to stable emitted shapes)
 * - union aliases (runtime-union/discriminant stability)
 * - tuple aliases (tuple lowering stability)
 * - mapped / conditional aliases (non-local shape selection)
 */
export declare const isSafeToEraseUserTypeAliasTarget: (node: ts.TypeNode) => boolean;
export declare const isRecursiveUserTypeAliasDeclaration: (declId: number, declNode: ts.TypeAliasDeclaration, binding: Binding) => boolean;
/**
 * Check if a declaration should have structural members extracted.
 *
 * Only extract for:
 * - Interfaces (InterfaceDeclaration)
 * - Type aliases to object types (TypeAliasDeclaration with TypeLiteralNode)
 *
 * Do NOT extract for:
 * - Classes (have implementation, not just shape)
 * - Enums, namespaces
 * - Library types (from node_modules or lib.*.d.ts)
 * - Type aliases to primitives, unions, functions, etc.
 */
export declare const shouldExtractFromDeclaration: (decl: ts.Declaration) => boolean;
//# sourceMappingURL=references-structural-bindings.d.ts.map