import ts from 'typescript';
import { type LatticeValue } from './lattice.js';
/**
 * Callback for resolving identifiers.
 * The expression evaluator delegates symbol lookup to the caller
 * (typically a ModuleEnvironment).
 */
export type SymbolResolver = (symbol: ts.Symbol) => LatticeValue;
/**
 * Callback for resolving function calls (pure function inlining).
 * Returns undefined if the function is not eligible for inlining.
 */
export type CallResolver = (expr: ts.CallExpression, evaluator: ExpressionEvaluator) => LatticeValue | undefined;
export declare class ExpressionEvaluator {
    private readonly checker;
    private readonly resolveSymbol;
    private readonly resolveCall?;
    constructor(checker: ts.TypeChecker, resolveSymbol: SymbolResolver, resolveCall?: CallResolver | undefined);
    /**
     * Evaluate a TS expression to a LatticeValue.
     */
    evaluate(expr: ts.Expression): LatticeValue;
    private evaluateIdentifier;
    private evaluatePropertyAccess;
    private evaluateElementAccess;
    private evaluateBinary;
    private evaluateUnaryPrefix;
    private evaluateConditional;
    private evaluateTemplate;
    private evaluateObjectLiteral;
    private evaluateArrayLiteral;
    private evaluateCallExpression;
    private isStepsSafeVarCall;
    private evaluateBuiltinCall;
    private evaluateMathCall;
    private evaluateJsonCall;
    private evaluateObjectCall;
    private evaluateTypeOf;
}
//# sourceMappingURL=expressionEvaluator.d.ts.map