import ts from 'typescript';
import { ScriptBuilder } from '../sb';
import { VisitOptions } from '../types';
export declare enum BuiltinType {
    Value = "Value",
    ValueObject = "ValueObject",
    MemberValue = "MemberValue",
    InstanceMemberValue = "InstanceMemberValue",
    Call = "Call",
    MemberCall = "MemberCall",
    InstanceMemberCall = "InstanceMemberCall",
    Template = "Template",
    MemberTemplate = "MemberTemplate",
    InstanceMemberTemplate = "InstanceMemberTemplate",
    InstanceOf = "InstanceOf",
    Interface = "Interface",
    New = "New"
}
export interface Builtin {
    readonly types: Set<BuiltinType>;
}
export interface BuiltinInterface extends Builtin {
    readonly canImplement: boolean;
}
export declare function isBuiltinInterface(value: Builtin): value is BuiltinInterface;
export interface BuiltinValue extends Builtin {
    readonly emitValue: (sb: ScriptBuilder, node: ts.Identifier, options: VisitOptions) => void;
}
export declare function isBuiltinValue(value: Builtin): value is BuiltinValue;
export declare type MemberLikeExpression = ts.PropertyAccessExpression | ts.ElementAccessExpression | ts.BindingElement;
export interface BuiltinMemberValue extends Builtin {
    readonly emitValue: (sb: ScriptBuilder, node: MemberLikeExpression, options: VisitOptions) => void;
}
export declare function isBuiltinMemberValue(value: Builtin): value is BuiltinMemberValue;
export interface BuiltinInstanceMemberValue extends Builtin {
    readonly emitValue: (sb: ScriptBuilder, node: MemberLikeExpression, options: VisitOptions, visited: boolean) => void;
}
export declare function isBuiltinInstanceMemberValue(value: Builtin): value is BuiltinInstanceMemberValue;
export interface BuiltinCall extends Builtin {
    readonly emitCall: (sb: ScriptBuilder, node: ts.CallExpression, options: VisitOptions) => void;
}
export declare function isBuiltinCall(value: Builtin): value is BuiltinCall;
export interface BuiltinTemplate extends Builtin {
    readonly emitCall: (sb: ScriptBuilder, node: ts.TaggedTemplateExpression, options: VisitOptions) => void;
}
export declare function isBuiltinTemplate(value: Builtin): value is BuiltinTemplate;
export declare type CallMemberLikeExpression = ts.PropertyAccessExpression | ts.ElementAccessExpression;
export interface BuiltinMemberTemplate extends Builtin {
    readonly emitCall: (sb: ScriptBuilder, func: CallMemberLikeExpression, node: ts.TaggedTemplateExpression, options: VisitOptions) => void;
}
export declare function isBuiltinMemberTemplate(value: Builtin): value is BuiltinMemberTemplate;
export interface BuiltinInstanceMemberTemplate extends Builtin {
    readonly canCall: (sb: ScriptBuilder, func: CallMemberLikeExpression, node: ts.TaggedTemplateExpression, options: VisitOptions) => boolean;
    readonly emitCall: (sb: ScriptBuilder, func: CallMemberLikeExpression, node: ts.TaggedTemplateExpression, options: VisitOptions, visited: boolean) => void;
}
export declare function isBuiltinInstanceMemberTemplate(value: Builtin): value is BuiltinInstanceMemberTemplate;
export interface BuiltinMemberCall extends Builtin {
    readonly emitCall: (sb: ScriptBuilder, func: CallMemberLikeExpression, node: ts.CallExpression, options: VisitOptions) => void;
}
export declare function isBuiltinMemberCall(value: Builtin): value is BuiltinMemberCall;
export interface BuiltinInstanceMemberCall extends Builtin {
    readonly canCall: (sb: ScriptBuilder, func: CallMemberLikeExpression, node: ts.CallExpression, options: VisitOptions) => boolean;
    readonly emitCall: (sb: ScriptBuilder, func: CallMemberLikeExpression, node: ts.CallExpression, options: VisitOptions, visited: boolean) => void;
}
export declare function isBuiltinInstanceMemberCall(value: Builtin): value is BuiltinInstanceMemberCall;
export interface BuiltinInstanceOf extends Builtin {
    readonly emitInstanceOf: (sb: ScriptBuilder, node: ts.Expression, options: VisitOptions) => void;
}
export declare function isBuiltinInstanceOf(value: Builtin): value is BuiltinInstanceOf;
export interface BuiltinNew extends BuiltinInstanceOf {
    readonly emitNew: (sb: ScriptBuilder, node: ts.NewExpression, options: VisitOptions) => void;
}
export declare function isBuiltinNew(value: Builtin): value is BuiltinNew;
export interface BuiltinValueObject extends Builtin {
    readonly type: string;
}
export declare function isBuiltinValueObject(value: Builtin): value is BuiltinValueObject;
