/**
 * Helper utilities for statement conversion
 */
import * as ts from "typescript";
import { IrParameter, IrAccessibility, IrTypeParameter, IrVariableDeclaration, IrType } from "../../types.js";
import type { ProgramContext } from "../../program-context.js";
/**
 * Optional class fields (`foo?: T`) are semantically `T | undefined` in TS.
 *
 * For value types, this is the only correct way to emit nullable C# (`T?`).
 * We encode this deterministically in IR so the existing union emitter can
 * map it to C# nullability correctly.
 */
export declare const makeOptionalType: (t: IrType) => IrType;
/**
 * Convert TypeScript type parameters to IR, detecting structural constraints
 */
export declare const convertTypeParameters: (typeParameters: readonly ts.TypeParameterDeclaration[] | undefined, ctx: ProgramContext) => readonly IrTypeParameter[] | undefined;
/**
 * Convert parameters for functions and methods
 */
export declare const convertParameters: (parameters: ts.NodeArray<ts.ParameterDeclaration>, ctx: ProgramContext) => readonly IrParameter[];
/**
 * Convert variable declaration list (used in for loops)
 */
export declare const convertVariableDeclarationList: (node: ts.VariableDeclarationList, ctx: ProgramContext) => IrVariableDeclaration;
/**
 * Check if node has export modifier
 */
export declare const hasExportModifier: (node: ts.Node) => boolean;
/**
 * Check if node has static modifier
 */
export declare const hasStaticModifier: (node: ts.Node) => boolean;
/**
 * Check if node has declare modifier.
 *
 * `declare` class members are type-only in TypeScript and should not emit runtime code.
 * Tsonic mirrors this by skipping them during IR conversion.
 */
export declare const hasDeclareModifier: (node: ts.Node) => boolean;
/**
 * Check if node has readonly modifier
 */
export declare const hasReadonlyModifier: (node: ts.Node) => boolean;
/**
 * Get accessibility modifier
 */
export declare const getAccessibility: (node: ts.Node) => IrAccessibility;
//# sourceMappingURL=helpers.d.ts.map