import { OrNull, TokenNode } from '@unisnips/core';
import { TextPosition } from '../util/position';
import { Token, TabStopToken } from '../parse/tokenizer';
export declare type MarkerClass = new (opts: MarkerInitOpts) => Marker;
declare type MarkerInitOpts<T = Token> = {
    parent: Marker;
    token?: T;
    start?: TextPosition;
    end?: TextPosition;
    tieBreaker?: TextPosition;
    initialText?: string;
};
/**
 * Represents any object in the text that has a span in any ways.
 */
export declare class Marker<T extends Token = Token> {
    start: TextPosition;
    end: TextPosition;
    initialText: string;
    tabStops: {
        [key: number]: TabStop;
    };
    parent: OrNull<Marker>;
    token: OrNull<T>;
    /**
     * useful in nested tabstops,
     * e.g. '${11:good}', innerContentOffset should be '${12:'.length
     */
    innerContentOffset: number;
    protected children: Marker[];
    protected tieBreaker: TextPosition;
    constructor(opts: MarkerInitOpts<T>);
    addChild(child: Marker): void;
    /**
     * will be serialized to TokenNode
     */
    get markerType(): string;
    getTokenNodeData(): {};
    toTokenNode(): TokenNode<any>;
    /** @abstract */
    protected init(opts: MarkerInitOpts): void;
}
/**
 * This base class represents any object in the text that can be changed by
 * the user.
 */
declare class EditableMarker<T = Token> extends Marker {
    get editableChildren(): Marker<Token>[];
}
declare class NoneditableMarker extends Marker {
}
export declare class Transform extends Marker {
    protected regex: RegExp;
    protected replace: any;
    protected search: string;
    protected options: string;
    get markerType(): string;
    getTokenNodeData(): Pick<any, "replace" | "search" | "options">;
    initTransformation(opts: {
        search: string;
        options: string;
        replace: string;
    }): void;
    protected transformText(text: string): string;
}
export declare class TransformableMarker<T = Token> extends EditableMarker<T> {
    transform?: Transform;
    search: string;
    replace: string;
    options: any;
    getTokenNodeData(): any;
    protected parseTransform(text: string): void;
}
export declare class TabStop<T = TabStopToken> extends TransformableMarker {
    number: number;
    get markerType(): string;
    init(opts: MarkerInitOpts<TabStopToken>): void;
}
export declare class SnippetInstance extends EditableMarker {
    visualContent: string;
    get markerType(): string;
    init(opts: MarkerInitOpts): void;
}
export declare class Mirror extends Marker {
    protected tabStop: TabStop;
    get markerType(): string;
    init(opts: MarkerInitOpts): void;
}
export declare class UniSnipsVariable extends NoneditableMarker {
    get name(): string;
}
/**
 * A ${VISUAL} placeholder that will use the text that was last visually
 * selected and insert it here.
 *
 * If there was no text visually selected, this will be the empty string.
 */
export declare class Visual extends TransformableMarker {
    text: string;
    /** QUESTION: may be related to vim's mode? */
    mode: string;
    init(opts: MarkerInitOpts): void;
    get markerType(): string;
}
export declare class ScriptCode extends NoneditableMarker {
    get code(): string;
    get scriptType(): string;
    get markerType(): string;
}
export {};
