///
///
import { ExpressionContext, ConstructDescription } from "../../compilation/contexts";
import { CPPConstruct, SuccessfullyCompiled, RuntimeConstruct } from "../CPPConstruct";
import { ExpressionType, VoidType } from "../../compilation/types";
import { Expression, ValueCategory, VCResultTypes, t_TypedExpression } from "./Expression";
import { RuntimeExpression } from "./RuntimeExpression";
import { OpaqueExpressionOutlet } from "../../../view/constructs/ExpressionOutlets";
import { ConstructOutlet } from "../../../view/constructs/ConstructOutlet";
import { CompiledTemporaryDeallocator } from "../TemporaryDeallocator";
import { OpaqueExpressionASTNode } from "../../../ast/ast_expressions";
export declare type OpaqueExpressionImpl = {
type: T | ((context: ExpressionContext) => T);
valueCategory: VC;
upNext?: (rt: RuntimeOpaqueExpression) => void;
operate: (rt: RuntimeOpaqueExpression) => T extends VoidType ? void : VCResultTypes;
};
export declare function registerOpaqueExpression(id: string, impl: OpaqueExpressionImpl): void;
export declare class OpaqueExpression extends Expression {
readonly construct_type = "opaque_expression";
readonly type: T;
readonly valueCategory: VC;
readonly impl: OpaqueExpressionImpl;
static createFromAST(ast: OpaqueExpressionASTNode, context: ExpressionContext): OpaqueExpression;
constructor(context: ExpressionContext, impl: OpaqueExpressionImpl, ast?: OpaqueExpressionASTNode);
createDefaultOutlet(this: CompiledOpaqueExpression, element: JQuery, parent?: ConstructOutlet): OpaqueExpressionOutlet;
isTailChild(child: CPPConstruct): {
isTail: boolean;
};
describeEvalResult(depth: number): ConstructDescription;
}
export interface TypedOpaqueExpression extends OpaqueExpression, t_TypedExpression {
}
export interface CompiledOpaqueExpression extends TypedOpaqueExpression, SuccessfullyCompiled {
readonly temporaryDeallocator?: CompiledTemporaryDeallocator;
}
export declare class RuntimeOpaqueExpression extends RuntimeExpression> {
constructor(model: CompiledOpaqueExpression, parent: RuntimeConstruct);
protected upNextImpl(): void;
private isVoid;
protected stepForwardImpl(): void;
}