import { Expr } from "./Expr.js";
import { ExprKind } from "./ExprKind.js";
import { TextSpan } from "../util/TextSpan.js";
export declare enum ExprEvalStatus {
    SUCCESS = 1000,
    ERROR = 2000,
    UNDEFINED_RESULT = 2001,
    REFERENCE_ERROR = 2010,
    CONSEQUENTIAL_ERROR = 2020,
    MATH_ERROR = 2030,
    TYPE_ERROR = 2040,
    NOT_FOUND = 2050,
    IFC_PROPERTY_NOT_FOUND = 2051,
    IFC_PROPERTY_SET_NOT_FOUND = 2052,
    IFC_TYPE_OBJECT_NOT_FOUND = 2053,
    PARSE_ERROR = 2080,
    SYNTAX_ERROR = 2081,
    VALIDATION_ERROR = 2082,
    STATIC_TYPE_ERROR = 2083,
    MISSING_OPERAND = 2084,
    MISSING_REQUIRED_FUNCTION_ARGUMENT = 2085,
    UNKNOWN_FUNCTION = 2086,
    WRONG_FUNCTION_ARGUMENT_TYPE = 2087,
    SPURIOUS_FUNCTION_ARGUMENT = 2088
}
export declare function isExprEvalStatus(candidate: number): boolean;
export type ExprEvalResult<T> = ExprEvalSuccess<T> | ExprEvalError;
export type ExprEvalSuccess<T> = {
    status: ExprEvalStatus;
    result: T;
};
export declare function isExprEvalSuccess(arg: any): arg is ExprEvalSuccess<unknown>;
export declare class ExprEvalSuccessObj<T> {
    readonly result: T;
    readonly status: ExprEvalStatus;
    constructor(result: T);
}
export declare class ExprEvalErrorObj {
    readonly status: ExprEvalStatus;
    readonly exprKind: ExprKind;
    readonly message?: string;
    readonly textSpan?: TextSpan;
    constructor(exprKind: ExprKind, status?: ExprEvalStatus, message?: any, textSpan?: TextSpan);
}
export declare function mapErrorObjectToMessage(errorObjectOrMessage: any): string;
export declare class ExprEvalErrorUndefinedResult extends ExprEvalErrorObj {
    constructor(epxrKind: ExprKind, textSpan?: TextSpan);
}
export declare class ExprEvalError1Obj extends ExprEvalErrorObj {
    readonly sub: ExprEvalResult<unknown>;
    constructor(exprKind: ExprKind, sub: ExprEvalResult<unknown>, status: ExprEvalStatus, message?: any, textSpan?: TextSpan);
}
export declare class ExprEvalError2Obj extends ExprEvalErrorObj {
    readonly left: ExprEvalResult<unknown>;
    readonly right: ExprEvalResult<unknown>;
    constructor(exprKind: ExprKind, left: ExprEvalResult<unknown>, right: ExprEvalResult<unknown>, status?: ExprEvalStatus, message?: any, textSpan?: TextSpan);
}
export declare function isExprEvalError(arg: any): arg is ExprEvalError;
export type ExprEvalError = ExprEvalUnspecificError | ExprEvalReferencError | ExprEvalErrorUndefinedResult | ExprEvalMissingRequiredFunctionArgumentError | ExprEvalValueError<unknown>;
type ExprEvalUnspecificError = {
    readonly exprKind: ExprKind;
    readonly status: ExprEvalStatus;
    readonly message?: string;
};
export type ExprEvalReferencError = ExprEvalUnspecificError & {
    readonly status: ExprEvalStatus.REFERENCE_ERROR;
    readonly expr: Expr<unknown>;
};
export type ExprEvalConsequentialError1 = ExprEvalUnspecificError & {
    readonly status: ExprEvalStatus.CONSEQUENTIAL_ERROR;
    readonly exprKind: ExprKind;
    readonly cause: ExprEvalError;
};
export declare class ExprEvalConsequentialError1Obj extends ExprEvalErrorObj {
    readonly exprKind: ExprKind;
    readonly cause: ExprEvalResult<unknown>;
    constructor(exprKind: ExprKind, cause: ExprEvalResult<unknown>, message?: any, textSpan?: TextSpan);
}
export type ExprEvalFunctionEvaluationError = ExprEvalUnspecificError & {
    functionName: string;
};
export type ExprEvalMissingRequiredFunctionArgumentError = ExprEvalFunctionEvaluationError & {
    argumentName: string;
    argumentIndex: number;
};
export type ExprEvalFunctionEvaluationConsequentialError = ExprEvalFunctionEvaluationError & {
    cause: ExprEvalUnspecificError;
};
export declare class ExprEvalFunctionEvaluationErrorObj extends ExprEvalErrorObj {
    readonly functionName: string;
    constructor(exprKind: ExprKind, status: ExprEvalStatus, message: any, functionName: string, textSpan?: TextSpan);
}
export declare class ExprEvalFunctionEvaluationObjectNotFoundErrorObj extends ExprEvalFunctionEvaluationErrorObj {
    readonly offendingKey: string;
    constructor(exprKind: ExprKind, status: ExprEvalStatus, message: any, functionName: string, objectKey: string, textSpan?: TextSpan);
}
export declare class ExprEvalFunctionEvaluationConsequentialErrorObj extends ExprEvalFunctionEvaluationErrorObj {
    readonly cause: ExprEvalError;
    constructor(exprKind: ExprKind, functionName: string, cause: ExprEvalError, textSpan?: TextSpan);
}
export declare class ExprEvalMissingRequiredFunctionArgumentErrorObj extends ExprEvalFunctionEvaluationErrorObj {
    readonly argumentName: string;
    readonly argumentIndex: number;
    constructor(exprKind: ExprKind, message: any, functionName: string, argumentName: string, argumentIndex: number, textSpan?: TextSpan);
}
export type ExprEvalTypeError = ExprEvalUnspecificError & {
    status: ExprEvalStatus.TYPE_ERROR;
};
export type ExprEvalValueError<T> = ExprEvalUnspecificError & {
    offendingValue: T;
};
export declare class ExprEvalValueErrorObj<T> extends ExprEvalErrorObj {
    readonly offendingValue: T;
    constructor(exprKind: ExprKind, status: ExprEvalStatus, message: any, offendingValue: T, textSpan?: TextSpan);
}
export declare class ExprEvalTypeErrorObj<T> extends ExprEvalValueErrorObj<T> {
    constructor(exprKind: ExprKind, message: any, offendingValue: T, textSpan?: TextSpan);
}
export type ExprEvalParseError = ExprEvalUnspecificError & {
    exprKind: ExprKind.PARSE_ERROR;
    line: number;
    column: number;
    offendingInput: string;
};
export type ExprEvalValidationError = ExprEvalUnspecificError & {
    textSpan: TextSpan;
};
export declare class ExprEvalParseErrorObj extends ExprEvalErrorObj {
    readonly line: number;
    readonly column: number;
    readonly offendingInput: string;
    constructor(status: ExprEvalStatus, message: any, offendingInput: string, textSpan: TextSpan);
}
export declare class ExprEvalValidationErrorObj extends ExprEvalErrorObj {
    readonly textSpan: TextSpan;
    constructor(status: ExprEvalStatus, message: any, textSpan: TextSpan);
}
export declare class ExprEvalUnknownFunctionErrorObj extends ExprEvalValidationErrorObj {
    readonly functionName: string;
    constructor(message: any, functionName: any, textSpan: TextSpan);
}
export declare class ExprEvalMissingFunctionArgumentErrorObj extends ExprEvalErrorObj {
    readonly functionName: string;
    readonly argumentName: string;
    readonly argumentIndex: number;
    constructor(message: any, functionName: string, argumentName: string, argumentIndex: number, textSpan: TextSpan);
}
export declare class ExprEvalSpuriousFunctionArgumentErrorObj extends ExprEvalErrorObj {
    readonly functionName: string;
    readonly argumentName: string;
    readonly argumentIndex: number;
    constructor(message: any, functionName: string, argumentName: string, argumentIndex: number, textSpan: TextSpan);
}
export declare class ExprEvalWrongFunctionArgumentTypeErrorObj extends ExprEvalValidationErrorObj {
    readonly functionName: string;
    readonly argumentName: string;
    readonly argumentIndex: number;
    readonly expectedType: string;
    readonly actualType: string;
    constructor(message: any, functionName: string, argumentName: string, argumentIndex: number, expectedType: string, actualType: string, textSpan: TextSpan);
}
export {};
