import * as ts from "typescript";
import { TransformationContext } from "../context";
export declare enum ExtensionKind {
    MultiFunction = "MultiFunction",
    RangeFunction = "RangeFunction",
    VarargConstant = "VarargConstant",
    AdditionOperatorType = "Addition",
    AdditionOperatorMethodType = "AdditionMethod",
    SubtractionOperatorType = "Subtraction",
    SubtractionOperatorMethodType = "SubtractionMethod",
    MultiplicationOperatorType = "Multiplication",
    MultiplicationOperatorMethodType = "MultiplicationMethod",
    DivisionOperatorType = "Division",
    DivisionOperatorMethodType = "DivisionMethod",
    ModuloOperatorType = "Modulo",
    ModuloOperatorMethodType = "ModuloMethod",
    PowerOperatorType = "Power",
    PowerOperatorMethodType = "PowerMethod",
    FloorDivisionOperatorType = "FloorDivision",
    FloorDivisionOperatorMethodType = "FloorDivisionMethod",
    BitwiseAndOperatorType = "BitwiseAnd",
    BitwiseAndOperatorMethodType = "BitwiseAndMethod",
    BitwiseOrOperatorType = "BitwiseOr",
    BitwiseOrOperatorMethodType = "BitwiseOrMethod",
    BitwiseExclusiveOrOperatorType = "BitwiseExclusiveOr",
    BitwiseExclusiveOrOperatorMethodType = "BitwiseExclusiveOrMethod",
    BitwiseLeftShiftOperatorType = "BitwiseLeftShift",
    BitwiseLeftShiftOperatorMethodType = "BitwiseLeftShiftMethod",
    BitwiseRightShiftOperatorType = "BitwiseRightShift",
    BitwiseRightShiftOperatorMethodType = "BitwiseRightShiftMethod",
    ConcatOperatorType = "Concat",
    ConcatOperatorMethodType = "ConcatMethod",
    LessThanOperatorType = "LessThan",
    LessThanOperatorMethodType = "LessThanMethod",
    GreaterThanOperatorType = "GreaterThan",
    GreaterThanOperatorMethodType = "GreaterThanMethod",
    NegationOperatorType = "Negation",
    NegationOperatorMethodType = "NegationMethod",
    BitwiseNotOperatorType = "BitwiseNot",
    BitwiseNotOperatorMethodType = "BitwiseNotMethod",
    LengthOperatorType = "Length",
    LengthOperatorMethodType = "LengthMethod",
    TableNewType = "TableNew",
    TableDeleteType = "TableDelete",
    TableDeleteMethodType = "TableDeleteMethod",
    TableGetType = "TableGet",
    TableGetMethodType = "TableGetMethod",
    TableHasType = "TableHas",
    TableHasMethodType = "TableHasMethod",
    TableSetType = "TableSet",
    TableSetMethodType = "TableSetMethod",
    TableAddKeyType = "TableAddKey",
    TableAddKeyMethodType = "TableAddKeyMethod",
    TableIsEmptyType = "TableIsEmpty",
    TableIsEmptyMethodType = "TableIsEmptyMethod"
}
export declare function getExtensionKindForType(context: TransformationContext, type: ts.Type): ExtensionKind | undefined;
export declare function getExtensionKindForNode(context: TransformationContext, node: ts.Node): ExtensionKind | undefined;
export declare function getExtensionKindForSymbol(context: TransformationContext, symbol: ts.Symbol): ExtensionKind | undefined;
export declare enum IterableExtensionKind {
    Iterable = "Iterable",
    Pairs = "Pairs",
    PairsKey = "PairsKey"
}
export declare function isLuaIterable(context: TransformationContext, type: ts.Type): boolean;
export declare function getIterableExtensionTypeForType(context: TransformationContext, type: ts.Type): IterableExtensionKind | undefined;
export declare function getIterableExtensionKindForNode(context: TransformationContext, node: ts.Node): IterableExtensionKind | undefined;
export declare const methodExtensionKinds: ReadonlySet<ExtensionKind>;
export declare function getNaryCallExtensionArgs(context: TransformationContext, node: ts.CallExpression, kind: ExtensionKind, numArgs: number): readonly ts.Expression[] | undefined;
export declare function getUnaryCallExtensionArg(context: TransformationContext, node: ts.CallExpression, kind: ExtensionKind): ts.Expression | undefined;
export declare function getBinaryCallExtensionArgs(context: TransformationContext, node: ts.CallExpression, kind: ExtensionKind): readonly [ts.Expression, ts.Expression] | undefined;
