import { ActionLineContext, ActionNameContext, ActionParamContext, AdditiveExprContext, AndExprContext, AnyTokenExprContext, CommentLineContext, ComparisonExprContext, ExpressionContext, IdentifierContext, MathFuncExprContext, MinMaxExprContext, MixedIdExprContext, MultiplicativeExprContext, NumberExprContext, OrExprContext, ParseContext, StringExprContext, SublistNameContext, UnaryExprContext, XorExprContext } from "../../../antlr4/SimCExprParser";
import { ActionLineNode, ASTNode, CommentLineNode, ExpressionNode, ParameterNode } from "../common-types";
import { SimCGenericVisitor } from "../SimCGenericVisitor";
export interface AccessHandlerParams<T = ExpressionContext> {
    ctx: T;
    meta: LineMetaData;
    parts: string[];
    visitor: SimCGenericVisitor;
}
export interface LineMetaData {
    actionLine: string;
    actionName: string;
    actionParams: ActionParamContext[];
    subListName: string;
}
type AccessHandlerKey = keyof AccessHandlerTypeMap;
type AccessHandlerTypeMap = {
    action: (params: AccessHandlerParams) => ExpressionNode;
    active_dot: (params: AccessHandlerParams) => ExpressionNode;
    boar_charge: (params: AccessHandlerParams) => ExpressionNode;
    buff: (params: AccessHandlerParams) => ExpressionNode;
    consecration: (params: AccessHandlerParams) => ExpressionNode;
    cooldown: (params: AccessHandlerParams) => ExpressionNode;
    cycle_enemies: (params: AccessHandlerParams) => ExpressionNode;
    death_and_decay: (params: AccessHandlerParams) => ExpressionNode;
    debuff: (params: AccessHandlerParams) => ExpressionNode;
    dot: (params: AccessHandlerParams) => ExpressionNode;
    empowering: (params: AccessHandlerParams) => ExpressionNode;
    fight_remains: (params: AccessHandlerParams) => ExpressionNode;
    firestarter: (params: AccessHandlerParams) => ExpressionNode;
    howl_summon: (params: AccessHandlerParams) => ExpressionNode;
    improved_scorch: (params: AccessHandlerParams) => ExpressionNode;
    hyperthread_wristwraps: (params: AccessHandlerParams) => ExpressionNode;
    lightning_rod: (params: AccessHandlerParams) => ExpressionNode;
    main_hand: (params: AccessHandlerParams) => ExpressionNode;
    movement: (params: AccessHandlerParams) => ExpressionNode;
    prev: (params: AccessHandlerParams) => ExpressionNode;
    prev_gcd: (params: AccessHandlerParams) => ExpressionNode;
    prev_off_gcd: (params: AccessHandlerParams) => ExpressionNode;
    release: (params: AccessHandlerParams) => ExpressionNode;
    remaining_winters_chill: (params: AccessHandlerParams) => ExpressionNode;
    scorch_execute: (params: AccessHandlerParams) => ExpressionNode;
    set_bonus: (params: AccessHandlerParams) => ExpressionNode;
    stat: (params: AccessHandlerParams) => ExpressionNode;
    eclipse: (params: AccessHandlerParams) => ExpressionNode;
    equipped: (params: AccessHandlerParams) => ExpressionNode;
    feral_spirit: (params: AccessHandlerParams) => ExpressionNode;
    health: (params: AccessHandlerParams) => ExpressionNode;
    hero_tree: (params: AccessHandlerParams) => ExpressionNode;
    raid_event: (params: AccessHandlerParams) => ExpressionNode;
    runic_power: (params: AccessHandlerParams) => ExpressionNode;
    rage: (params: AccessHandlerParams) => ExpressionNode;
    energy: (params: AccessHandlerParams) => ExpressionNode;
    mana: (params: AccessHandlerParams) => ExpressionNode;
    focus: (params: AccessHandlerParams) => ExpressionNode;
    fury: (params: AccessHandlerParams) => ExpressionNode;
    rune: (params: AccessHandlerParams) => ExpressionNode;
    astral_power: (params: AccessHandlerParams) => ExpressionNode;
    maelstrom: (params: AccessHandlerParams) => ExpressionNode;
    insanity: (params: AccessHandlerParams) => ExpressionNode;
    holy_power: (params: AccessHandlerParams) => ExpressionNode;
    soul_shard: (params: AccessHandlerParams) => ExpressionNode;
    soul_shards: (params: AccessHandlerParams) => ExpressionNode;
    combo_points: (params: AccessHandlerParams) => ExpressionNode;
    chi: (params: AccessHandlerParams) => ExpressionNode;
    essence: (params: AccessHandlerParams) => ExpressionNode;
    spell_targets: (params: AccessHandlerParams) => ExpressionNode;
    target: (params: AccessHandlerParams) => ExpressionNode;
    rtb_buffs: (params: AccessHandlerParams) => ExpressionNode;
    stagger: (params: AccessHandlerParams) => ExpressionNode;
    stealthed: (params: AccessHandlerParams) => ExpressionNode;
    talent: (params: AccessHandlerParams) => ExpressionNode;
    toggle: (params: AccessHandlerParams) => ExpressionNode;
    totem: (params: AccessHandlerParams) => ExpressionNode;
    trinket: (params: AccessHandlerParams) => ExpressionNode;
    variable: (params: AccessHandlerParams) => ExpressionNode;
    gcd: (params: AccessHandlerParams) => ExpressionNode;
    pet: (params: AccessHandlerParams) => ExpressionNode;
    time: (params: AccessHandlerParams) => ExpressionNode;
    boss: (params: AccessHandlerParams) => ExpressionNode;
    group_members: (params: AccessHandlerParams) => ExpressionNode;
    settings: (params: AccessHandlerParams) => ExpressionNode;
    death_knight: (params: AccessHandlerParams) => ExpressionNode;
    druid: (params: AccessHandlerParams) => ExpressionNode;
    evoker: (params: AccessHandlerParams) => ExpressionNode;
    hunter: (params: AccessHandlerParams) => ExpressionNode;
    mage: (params: AccessHandlerParams) => ExpressionNode;
    monk: (params: AccessHandlerParams) => ExpressionNode;
    paladin: (params: AccessHandlerParams) => ExpressionNode;
    priest: (params: AccessHandlerParams) => ExpressionNode;
    rogue: (params: AccessHandlerParams) => ExpressionNode;
    shaman: (params: AccessHandlerParams) => ExpressionNode;
};
type ContextHandlerKey = keyof ContextHandlerTypeMap;
type ContextHandlerTypeMap = {
    AccessExpr: (ctx: ExpressionContext, visitor: SimCGenericVisitor) => ExpressionNode;
    ActionLine: (ctx: ActionLineContext, visitor: SimCGenericVisitor) => ActionLineNode;
    ActionName: (ctx: ActionNameContext, visitor: SimCGenericVisitor) => ExpressionNode;
    ActionParam: (ctx: ActionParamContext, visitor: SimCGenericVisitor) => ParameterNode;
    AdditiveExpr: (ctx: AdditiveExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    AndExpr: (ctx: AndExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    AnyTokenExpr: (ctx: AnyTokenExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    CommentLine: (ctx: CommentLineContext, visitor: SimCGenericVisitor) => CommentLineNode;
    ComparisonExpr: (ctx: ComparisonExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    Identifier: (ctx: IdentifierContext, visitor: SimCGenericVisitor) => ExpressionNode;
    MathFuncExpr: (ctx: MathFuncExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    MinMaxExpr: (ctx: MinMaxExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    MixedIdExpr: (ctx: MixedIdExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    MultiplicativeExpr: (ctx: MultiplicativeExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    NumberExpr: (ctx: NumberExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    OrExpr: (ctx: OrExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    Parse: (ctx: ParseContext, visitor: SimCGenericVisitor) => ASTNode;
    StringExpr: (ctx: StringExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    SublistName: (ctx: SublistNameContext, visitor: SimCGenericVisitor) => ExpressionNode;
    UnaryExpr: (ctx: UnaryExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
    XorExpr: (ctx: XorExprContext, visitor: SimCGenericVisitor) => ExpressionNode;
};
declare class ContextHandlerRegistry {
    private accessHandlers;
    private contextHandlers;
    private lineMetaData;
    constructor();
    dispatchAccess<K extends AccessHandlerKey>(accessType: K, ctx: ExpressionContext, visitor: SimCGenericVisitor, parts: string[]): ReturnType<AccessHandlerTypeMap[K]>;
    dispatchContext<K extends ContextHandlerKey>(contextType: K, ctx: any, visitor: any): ReturnType<ContextHandlerTypeMap[K]>;
    getAccessHandler<K extends AccessHandlerKey>(accessType: K): AccessHandlerTypeMap[K] | undefined;
    getContextHandler<K extends ContextHandlerKey>(contextType: K): ContextHandlerTypeMap[K] | undefined;
    /**
     * Check if a string is a valid access handler key
     * @param key The string to check
     * @returns True if the key is a valid access handler key
     */
    hasAccessHandler(key: string): boolean;
    /**
     * Check if a string is a valid context handler key
     * @param key The string to check
     * @returns True if the key is a valid context handler key
     */
    hasContextHandler(key: string): boolean;
    registerAccessHandler<K extends AccessHandlerKey>(accessType: K, handler: AccessHandlerTypeMap[K]): void;
    registerContextHandler<K extends ContextHandlerKey>(contextType: K, handler: ContextHandlerTypeMap[K]): void;
    setMetaData(metaData: LineMetaData): void;
    private registerDefaultHandlers;
}
export declare const contextHandlerRegistry: ContextHandlerRegistry;
export {};
//# sourceMappingURL=ContextHandlerRegistry.d.ts.map