import { Multiname } from './../abc/lazy/Multiname';
import { IGenerator } from './IGenerator';
export interface IImportDefinition {
    name: Multiname;
    alias: string;
    options: IImportGenOptions | undefined;
}
export interface IImportGenOptions {
    findProp?: boolean;
    scope?: string;
    mnIndex: number;
}
export interface ILexGenerator extends IGenerator {
    /**
     * Test Multiname to support import generation
     */
    test(mn: Multiname, isLexCall: boolean): boolean;
    findAliases(mn: Multiname, findProp: boolean): IImportDefinition[];
    /**
     * Generate import alias if can be generated
     * @throws lex import can't be generated
     */
    getLexAlias(mn: Multiname, options?: IImportGenOptions): string;
    /**
     * Generate import alias if can be generated
     * @throws lex import can't be generated
     */
    getPropStrictAlias(mn: Multiname, options?: IImportGenOptions): string;
}
export declare abstract class LexImportsGenerator implements ILexGenerator {
    imports: Array<IImportDefinition>;
    private _lexMode;
    test(_mn: Multiname, _isLexCall: boolean): boolean;
    protected _genEntry(def: IImportDefinition, ...args: any[]): string;
    protected _genAlias(mn: Multiname, _options?: IImportGenOptions): string;
    findAliases(mn: Multiname, findProp: boolean): IImportDefinition[];
    getLexAlias(mn: Multiname, options?: IImportGenOptions): string;
    getPropStrictAlias(mn: Multiname, options?: IImportGenOptions): string;
    genHeader(ident?: string, ...args: any[]): string;
    genBody(_ident?: string, ..._args: any[]): string;
    genPost(input: string[]): string[];
    reset(): void;
}
/**
 * Generate imports for all lex generators
 */
export declare class ComplexGenerator implements ILexGenerator {
    generators: ILexGenerator[];
    /**
     * Allowed collsion for alias of generator, return first alias;
     */
    allowColissions: Boolean;
    constructor(generators: ILexGenerator[]);
    /**
     * Return generator that will used for lex generation
     */
    getGenerator(mn: Multiname, isLexCall: boolean): ILexGenerator | null;
    test(mn: Multiname, isLexCall: boolean): boolean;
    findAliases(mn: Multiname, findProp: boolean): IImportDefinition[];
    /**
     * Return generator that will used for propstrict generation
     */
    getLexAlias(mn: Multiname, options?: IImportGenOptions): string;
    getPropStrictAlias(mn: Multiname, options?: IImportGenOptions): string;
    genHeader(ident: string): string;
    genBody(ident: string): string;
    genPost(arr: string[]): string[];
    reset(): void;
}
/**
 * Import generator for Box2D and Nape external libs
 */
export declare class PhysicsLex extends LexImportsGenerator {
    allows: {
        box2D?: boolean;
        nape?: boolean;
    };
    constructor(allows?: {
        box2D?: boolean;
        nape?: boolean;
    });
    protected _genEntry(def: IImportDefinition): string;
    protected _genAlias(mn: Multiname, _options?: IImportGenOptions): string;
    test(mn: Multiname): boolean;
}
/**
 * @description Generete single constant reference on top level API props: trace, pareseInt etc
 */
export declare class TopLevelLex extends LexImportsGenerator {
    test(mn: Multiname): boolean;
    protected _genEntry(def: IImportDefinition): string;
    protected _genAlias(mn: Multiname, options: IImportGenOptions): string;
}
/**
 * @description Generate single reference on class namespace/class with static field
 */
export declare class StaticHoistLex extends LexImportsGenerator {
    private _mn;
    private _loc;
    markScope(name: string, pos?: number): void;
    test(mn: Multiname, isLexCall: boolean): boolean;
    protected _genAlias(mn: Multiname, options: IImportGenOptions): string;
    findAliases(): any[];
    genHeader(): string;
    genBody(idnt: string): string;
    genPost(arr: string[]): string[];
    _genEntry(def: IImportDefinition, idnt?: string): string;
}
//# sourceMappingURL=LexImportsGenerator.d.ts.map