import * as ts from "typescript";
import { CompilerOptions, LuaTarget } from "../../CompilerOptions";
import * as lua from "../../LuaAST";
import { ExpressionLikeNode, StatementLikeNode, VisitorMap } from "./visitors";
import { SymbolInfo } from "../utils/symbols";
import { LuaLibFeature } from "../../LuaLib";
import { Scope, ScopeType } from "../utils/scope";
export declare const tempSymbolId: lua.SymbolId;
export interface AllAccessorDeclarations {
    firstAccessor: ts.AccessorDeclaration;
    getAccessor: ts.GetAccessorDeclaration | undefined;
    setAccessor: ts.SetAccessorDeclaration | undefined;
}
export interface EmitResolver {
    isValueAliasDeclaration(node: ts.Node): boolean;
    isReferencedAliasDeclaration(node: ts.Node, checkChildren?: boolean): boolean;
    isTopLevelValueImportEqualsWithEntityName(node: ts.ImportEqualsDeclaration): boolean;
}
export interface TypeCheckerWithEmitResolver extends ts.TypeChecker {
    getEmitResolver(sourceFile?: ts.SourceFile, cancellationToken?: ts.CancellationToken): EmitResolver;
}
export declare class TransformationContext {
    program: ts.Program;
    sourceFile: ts.SourceFile;
    private visitorMap;
    readonly diagnostics: ts.Diagnostic[];
    readonly checker: TypeCheckerWithEmitResolver;
    readonly resolver: EmitResolver;
    readonly precedingStatementsStack: lua.Statement[][];
    readonly options: CompilerOptions;
    readonly luaTarget: LuaTarget;
    readonly isModule: boolean;
    readonly isStrict: boolean;
    constructor(program: ts.Program, sourceFile: ts.SourceFile, visitorMap: VisitorMap);
    private currentNodeVisitors;
    private currentNodeVisitorsIndex;
    private nextTempId;
    transformNode(node: ts.Node): lua.Node[];
    superTransformNode(node: ts.Node): lua.Node[];
    private doSuperTransformNode;
    transformExpression(node: ExpressionLikeNode): lua.Expression;
    private assertIsExpression;
    superTransformExpression(node: ExpressionLikeNode): lua.Expression;
    transformStatements(node: StatementLikeNode | readonly StatementLikeNode[]): lua.Statement[];
    superTransformStatements(node: StatementLikeNode | readonly StatementLikeNode[]): lua.Statement[];
    pushPrecedingStatements(): void;
    popPrecedingStatements(): lua.Statement[];
    addPrecedingStatements(statements: lua.Statement | lua.Statement[]): void;
    prependPrecedingStatements(statements: lua.Statement | lua.Statement[]): void;
    createTempName(prefix?: string): string;
    private getTempNameForLuaExpression;
    createTempNameForLuaExpression(expression: lua.Expression): lua.Identifier;
    private getTempNameForNode;
    createTempNameForNode(node: ts.Node): lua.Identifier;
    private lastSymbolId;
    readonly symbolInfoMap: Map<lua.SymbolId, SymbolInfo>;
    readonly symbolIdMaps: Map<ts.Symbol, lua.SymbolId>;
    nextSymbolId(): lua.SymbolId;
    readonly usedLuaLibFeatures: Set<LuaLibFeature>;
    readonly scopeStack: Scope[];
    private lastScopeId;
    pushScope(type: ScopeType): Scope;
    popScope(): Scope;
}
