import { SourceNode } from "source-map";
import * as ts from "typescript";
import { CompilerOptions } from "./CompilerOptions";
import * as lua from "./LuaAST";
import { EmitHost } from "./transpilation";
export declare const escapeString: (value: string) => string;
export declare const tstlHeader = "--[[ Generated with https://github.com/TypeScriptToLua/TypeScriptToLua ]]\n";
type SourceChunk = string | SourceNode;
export type Printer = (program: ts.Program, emitHost: EmitHost, fileName: string, file: lua.File) => PrintResult;
export interface PrintResult {
    code: string;
    sourceMap: string;
    sourceMapNode: SourceNode;
}
export declare function createPrinter(printers: Printer[]): Printer;
export declare class LuaPrinter {
    private emitHost;
    private program;
    private sourceFile;
    private static operatorMap;
    private static operatorPrecedence;
    private static rightAssociativeOperators;
    protected currentIndent: string;
    protected luaFile: string;
    protected relativeSourcePath: string;
    protected options: CompilerOptions;
    static readonly sourceMapTracebackPlaceholder = "{#SourceMapTraceback}";
    constructor(emitHost: EmitHost, program: ts.Program, sourceFile: string);
    print(file: lua.File): PrintResult;
    private printInlineSourceMap;
    private printStackTraceOverride;
    protected printFile(file: lua.File): SourceNode;
    protected pushIndent(): void;
    protected popIndent(): void;
    protected indent(input?: SourceChunk): SourceChunk;
    protected createSourceNode(node: lua.Node, chunks: SourceChunk | SourceChunk[], name?: string): SourceNode;
    protected concatNodes(...chunks: SourceChunk[]): SourceNode;
    protected printBlock(block: lua.Block): SourceNode;
    private statementMayRequireSemiColon;
    private nodeStartsWithParenthesis;
    protected printStatementArray(statements: lua.Statement[]): SourceChunk[];
    printStatement(statement: lua.Statement): SourceNode;
    printComment(comment: string | string[]): SourceChunk;
    protected printStatementExcludingComments(statement: lua.Statement): SourceNode;
    printDoStatement(statement: lua.DoStatement): SourceNode;
    printVariableDeclarationStatement(statement: lua.VariableDeclarationStatement): SourceNode;
    printVariableAssignmentStatement(statement: lua.AssignmentStatement): SourceNode;
    printIfStatement(statement: lua.IfStatement, isElseIf?: boolean): SourceNode;
    printWhileStatement(statement: lua.WhileStatement): SourceNode;
    printRepeatStatement(statement: lua.RepeatStatement): SourceNode;
    printForStatement(statement: lua.ForStatement): SourceNode;
    printForInStatement(statement: lua.ForInStatement): SourceNode;
    printGotoStatement(statement: lua.GotoStatement): SourceNode;
    printLabelStatement(statement: lua.LabelStatement): SourceNode;
    printReturnStatement(statement: lua.ReturnStatement): SourceNode;
    printBreakStatement(statement: lua.BreakStatement): SourceNode;
    printContinueStatement(statement: lua.ContinueStatement): SourceNode;
    printExpressionStatement(statement: lua.ExpressionStatement): SourceNode;
    printExpression(expression: lua.Expression): SourceNode;
    printStringLiteral(expression: lua.StringLiteral): SourceNode;
    printNumericLiteral(expression: lua.NumericLiteral): SourceNode;
    printNilLiteral(expression: lua.NilLiteral): SourceNode;
    printDotsLiteral(expression: lua.DotsLiteral): SourceNode;
    printArgLiteral(expression: lua.ArgLiteral): SourceNode;
    printBooleanLiteral(expression: lua.BooleanLiteral): SourceNode;
    private printFunctionParameters;
    printFunctionExpression(expression: lua.FunctionExpression): SourceNode;
    printFunctionDefinition(statement: lua.FunctionDefinition): SourceNode;
    printTableFieldExpression(expression: lua.TableFieldExpression): SourceNode;
    printTableExpression(expression: lua.TableExpression): SourceNode;
    printUnaryExpression(expression: lua.UnaryExpression): SourceNode;
    printBinaryExpression(expression: lua.BinaryExpression): SourceNode;
    private printExpressionInParenthesesIfNeeded;
    private needsParenthesis;
    printCallExpression(expression: lua.CallExpression): SourceNode;
    printMethodCallExpression(expression: lua.MethodCallExpression): SourceNode;
    printIdentifier(expression: lua.Identifier): SourceNode;
    printTableIndexExpression(expression: lua.TableIndexExpression): SourceNode;
    printParenthesizedExpression(expression: lua.ParenthesizedExpression): SourceNode;
    printConditionalExpression(expression: lua.ConditionalExpression): SourceNode;
    printOperator(kind: lua.Operator): SourceNode;
    protected joinChunksWithComma(chunks: SourceChunk[]): SourceChunk[];
    /**
     * Returns true if the expression list (table field or parameters) should be printed on one line.
     */
    protected isSimpleExpressionList(expressions: lua.Expression[]): boolean;
    protected printExpressionList(expressions: lua.Expression[]): SourceChunk[];
    private buildSourceMap;
}
export {};
