import { SourceTokenList, SourceToken } from 'coffee-lex';
import { Block as Block$1, Base, LocationData } from 'decaffeinate-coffeescript2/lib/coffeescript/nodes.js';
import { LinesAndColumns } from 'lines-and-columns';

/**
 * Any information we need to know about the current state of parsing. While the
 * hope is that this is mostly immutable, with replace operations as we walk the
 * AST, it is partially mutable to collect bound method names in a class.
 */
declare class ParseState {
    readonly currentClassBoundMethods: Array<ClassProtoAssignOp> | null;
    currentClassCtor: Constructor | null;
    constructor(currentClassBoundMethods: Array<ClassProtoAssignOp> | null);
    isInClassBody(): boolean;
    recordBoundMethod(method: ClassProtoAssignOp): void;
    recordConstructor(ctor: Constructor): void;
    pushCurrentClass(): ParseState;
    dropCurrentClass(): ParseState;
    static initialState(): ParseState;
}
declare class ParseContext {
    readonly source: string;
    readonly linesAndColumns: LinesAndColumns;
    readonly sourceTokens: SourceTokenList;
    readonly ast: Block$1;
    readonly parseState: ParseState;
    constructor(source: string, linesAndColumns: LinesAndColumns, sourceTokens: SourceTokenList, ast: Block$1, parseState: ParseState);
    getRange(locatable: Base | LocationData): [number, number] | null;
    static fromSource(source: string, sourceLex: (source: string) => SourceTokenList, parse: (source: string) => Block$1): ParseContext;
    updateState(updater: (oldState: ParseState) => ParseState): ParseContext;
}

declare abstract class Node {
    readonly type: string;
    readonly line: number;
    readonly column: number;
    readonly start: number;
    readonly end: number;
    readonly raw: string;
    parentNode: Node | null;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string);
    getChildren(): Array<Node>;
    getChildFields(): Array<Node | Array<Node | null> | null>;
    /**
     * Return the names of the properties container child nodes, in traversal
     * order.
     */
    abstract getChildNames(): Array<string>;
}
declare class Identifier extends Node {
    readonly data: string;
    constructor(line: number, column: number, start: number, end: number, raw: string, data: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Bool extends Node {
    readonly data: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, data: boolean);
    static true(): Bool;
    static false(): Bool;
    getChildNames(): Array<keyof this & string>;
}
declare class JavaScript extends Node {
    readonly data: string;
    constructor(line: number, column: number, start: number, end: number, raw: string, data: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Number extends Node {
    readonly data: number;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, data: number);
    getChildNames(): Array<keyof this & string>;
}
declare class Float extends Number {
    constructor(line: number, column: number, start: number, end: number, raw: string, data: number);
}
declare class Int extends Number {
    constructor(line: number, column: number, start: number, end: number, raw: string, data: number);
}
declare abstract class AccessOp extends Node {
    readonly expression: Node;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class MemberAccessOp extends AccessOp {
    readonly member: Identifier;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node, member: Identifier);
    getChildNames(): Array<keyof this & string>;
}
declare class ProtoMemberAccessOp extends AccessOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class SoakedMemberAccessOp extends AccessOp {
    readonly member: Identifier;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node, member: Identifier);
    getChildNames(): Array<keyof this & string>;
}
declare class SoakedProtoMemberAccessOp extends AccessOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class DynamicMemberAccessOp extends AccessOp {
    readonly indexingExpr: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node, indexingExpr: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class SoakedDynamicMemberAccessOp extends AccessOp {
    readonly indexingExpr: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node, indexingExpr: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class Quasi extends Node {
    readonly data: string;
    constructor(line: number, column: number, start: number, end: number, raw: string, data: string);
    getChildNames(): Array<keyof this & string>;
}
declare class String extends Node {
    readonly quasis: Array<Quasi>;
    readonly expressions: Array<Node | null>;
    constructor(line: number, column: number, start: number, end: number, raw: string, quasis: Array<Quasi>, expressions: Array<Node | null>);
    getChildNames(): Array<keyof this & string>;
}
declare class TaggedTemplateLiteral extends Node {
    readonly tag: Node;
    readonly template: String;
    constructor(line: number, column: number, start: number, end: number, raw: string, tag: Node, template: String);
    getChildNames(): Array<keyof this & string>;
}
declare class ObjectInitialiser extends Node {
    readonly members: Array<ObjectInitialiserMember | AssignOp | Spread>;
    constructor(line: number, column: number, start: number, end: number, raw: string, members: Array<ObjectInitialiserMember | AssignOp | Spread>);
    getChildNames(): Array<keyof this & string>;
}
declare class ObjectInitialiserMember extends Node {
    readonly key: Node;
    readonly expression: Node | null;
    readonly isComputed: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, key: Node, expression: Node | null, isComputed: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare class Conditional extends Node {
    readonly condition: Node;
    readonly consequent: Block | null;
    readonly alternate: Block | null;
    readonly isUnless: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, condition: Node, consequent: Block | null, alternate: Block | null, isUnless: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare class Program extends Node {
    readonly body: Block | null;
    context: ParseContext;
    constructor(line: number, column: number, start: number, end: number, raw: string, body: Block | null, context: ParseContext);
    getChildNames(): Array<keyof this & string>;
}
declare class Block extends Node {
    readonly statements: Array<Node>;
    readonly inline: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, statements: Array<Node>, inline: boolean);
    getChildNames(): Array<keyof this & string>;
    withInline(inline: boolean): Block;
}
declare class Loop extends Node {
    readonly body: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, body: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class While extends Node {
    readonly condition: Node;
    readonly guard: Node | null;
    readonly body: Node | null;
    readonly isUntil: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, condition: Node, guard: Node | null, body: Node | null, isUntil: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare abstract class For extends Node {
    readonly keyAssignee: Node | null;
    readonly valAssignee: Node | null;
    readonly target: Node;
    readonly filter: Node | null;
    readonly body: Block | null;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, keyAssignee: Node | null, valAssignee: Node | null, target: Node, filter: Node | null, body: Block | null);
}
declare class ForOf extends For {
    readonly isOwn: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, keyAssignee: Node | null, valAssignee: Node | null, target: Node, filter: Node | null, body: Block | null, isOwn: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare class ForIn extends For {
    readonly step: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, keyAssignee: Node | null, valAssignee: Node | null, target: Node, filter: Node | null, body: Block | null, step: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class ForFrom extends For {
    constructor(line: number, column: number, start: number, end: number, raw: string, valAssignee: Node | null, target: Node, filter: Node | null, body: Block | null);
    getChildNames(): Array<keyof this & string>;
}
declare class Switch extends Node {
    readonly expression: Node | null;
    readonly cases: Array<SwitchCase>;
    readonly alternate: Block | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node | null, cases: Array<SwitchCase>, alternate: Block | null);
    getChildNames(): Array<keyof this & string>;
}
declare class SwitchCase extends Node {
    readonly conditions: Array<Node>;
    readonly consequent: Block | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, conditions: Array<Node>, consequent: Block | null);
    getChildNames(): Array<keyof this & string>;
}
declare class RegexFlags {
    readonly global: boolean;
    readonly ignoreCase: boolean;
    readonly multiline: boolean;
    readonly unicode: boolean;
    readonly sticky: boolean;
    readonly g: boolean;
    readonly i: boolean;
    readonly m: boolean;
    readonly u: boolean;
    readonly y: boolean;
    constructor(global: boolean, ignoreCase: boolean, multiline: boolean, unicode: boolean, sticky: boolean);
    static parse(flags: string): RegexFlags;
}
declare class Heregex extends Node {
    readonly quasis: Array<Quasi>;
    readonly expressions: Array<Node | null>;
    readonly flags: RegexFlags;
    constructor(line: number, column: number, start: number, end: number, raw: string, quasis: Array<Quasi>, expressions: Array<Node | null>, flags: RegexFlags);
    getChildNames(): Array<keyof this & string>;
}
declare class Null extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Undefined extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Regex extends Node {
    readonly pattern: string;
    readonly flags: RegexFlags;
    constructor(line: number, column: number, start: number, end: number, raw: string, pattern: string, flags: RegexFlags);
    getChildNames(): Array<keyof this & string>;
}
declare class Return extends Node {
    readonly expression: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class YieldReturn extends Node {
    readonly expression: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class AwaitReturn extends Node {
    readonly expression: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class This extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Throw extends Node {
    readonly expression: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class ArrayInitialiser extends Node {
    readonly members: Array<Node>;
    constructor(line: number, column: number, start: number, end: number, raw: string, members: Array<Node>);
    getChildNames(): Array<keyof this & string>;
}
declare class DefaultParam extends Node {
    readonly param: Node;
    readonly default: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, param: Node, defaultValue: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class Rest extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class Expansion extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Elision extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Break extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Continue extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Debugger extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class Spread extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class Range extends Node {
    readonly left: Node;
    readonly right: Node;
    readonly isInclusive: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node, isInclusive: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare abstract class BinaryOp extends Node {
    readonly left: Node;
    readonly right: Node;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
    getChildNames(): Array<string>;
}
declare abstract class UnaryOp extends Node {
    readonly expression: Node;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class ChainedComparisonOp extends Node {
    readonly operands: Array<Node>;
    readonly operators: Array<OperatorInfo>;
    constructor(line: number, column: number, start: number, end: number, raw: string, operands: Array<Node>, operators: Array<OperatorInfo>);
    getChildNames(): Array<keyof this & string>;
}
declare class OperatorInfo {
    readonly operator: string;
    readonly token: SourceToken;
    constructor(operator: string, token: SourceToken);
}
declare type Op = UnaryOp | BinaryOp | ChainedComparisonOp;
declare class EQOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class NEQOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class LTOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class LTEOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class GTOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class GTEOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class LogicalNotOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class LogicalAndOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class LogicalOrOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class SubtractOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class PlusOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class UnaryPlusOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class MultiplyOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class DivideOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class FloorDivideOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class ExistsOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class UnaryExistsOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class UnaryNegateOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class BitNotOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class BitAndOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class BitOrOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class BitXorOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class LeftShiftOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class SignedRightShiftOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class UnsignedRightShiftOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class PreDecrementOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class PreIncrementOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class PostDecrementOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class PostIncrementOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class ExpOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class RemOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class ModuloOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class InOp extends BinaryOp {
    readonly isNot: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node, isNot: boolean);
}
declare class BaseAssignOp extends Node {
    readonly assignee: Node;
    readonly expression: Node;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, assignee: Node, expression: Node);
    getChildNames(): Array<string>;
}
declare class AssignOp extends BaseAssignOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, assignee: Node, expression: Node);
    withExpression(expression: Node): AssignOp;
}
declare class CompoundAssignOp extends BaseAssignOp {
    readonly op: string;
    constructor(line: number, column: number, start: number, end: number, raw: string, assignee: Node, expression: Node, op: string);
}
declare class ExtendsOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class SeqOp extends BinaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node);
}
declare class TypeofOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class InstanceofOp extends BinaryOp {
    readonly isNot: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node, isNot: boolean);
}
declare class OfOp extends BinaryOp {
    readonly isNot: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, left: Node, right: Node, isNot: boolean);
}
declare class DeleteOp extends UnaryOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
}
declare class Yield extends Node {
    readonly expression: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class YieldFrom extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class Await extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class Slice extends Node {
    readonly expression: Node;
    readonly left: Node | null;
    readonly right: Node | null;
    readonly isInclusive: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node, left: Node | null, right: Node | null, isInclusive: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare class SoakedSlice extends Node {
    readonly expression: Node;
    readonly left: Node | null;
    readonly right: Node | null;
    readonly isInclusive: boolean;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node, left: Node | null, right: Node | null, isInclusive: boolean);
    getChildNames(): Array<keyof this & string>;
}
declare abstract class BaseFunction extends Node {
    readonly parameters: Array<Node>;
    readonly body: Block | null;
    constructor(type: string, line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    getChildNames(): Array<keyof this & string>;
    abstract withParameters(parameters: Array<Node>): BaseFunction;
}
declare class Function extends BaseFunction {
    constructor(line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    withParameters(parameters: Array<Node>): BaseFunction;
}
declare class BoundFunction extends BaseFunction {
    constructor(line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    withParameters(parameters: Array<Node>): BaseFunction;
}
declare class GeneratorFunction extends BaseFunction {
    constructor(line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    withParameters(parameters: Array<Node>): BaseFunction;
}
declare class BoundGeneratorFunction extends BaseFunction {
    constructor(line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    withParameters(parameters: Array<Node>): BaseFunction;
}
declare class AsyncFunction extends BaseFunction {
    constructor(line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    withParameters(parameters: Array<Node>): BaseFunction;
}
declare class BoundAsyncFunction extends BaseFunction {
    constructor(line: number, column: number, start: number, end: number, raw: string, parameters: Array<Node>, body: Block | null);
    withParameters(parameters: Array<Node>): BaseFunction;
}
declare class Try extends Node {
    readonly body: Node | null;
    readonly catchAssignee: Node | null;
    readonly catchBody: Node | null;
    readonly finallyBody: Node | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, body: Node | null, catchAssignee: Node | null, catchBody: Node | null, finallyBody: Node | null);
    getChildNames(): Array<keyof this & string>;
}
declare class Constructor extends BaseAssignOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, assignee: Node, expression: Node);
}
declare class ClassProtoAssignOp extends BaseAssignOp {
    constructor(line: number, column: number, start: number, end: number, raw: string, assignee: Node, expression: Node);
}
declare class Class extends Node {
    readonly nameAssignee: Node | null;
    readonly name: Node | null;
    readonly body: Block | null;
    readonly boundMembers: Array<ClassProtoAssignOp>;
    readonly parent: Node | null;
    readonly ctor: Constructor | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, nameAssignee: Node | null, name: Node | null, body: Block | null, boundMembers: Array<ClassProtoAssignOp>, parent: Node | null, ctor: Constructor | null);
    getChildNames(): Array<keyof this & string>;
}
declare class FunctionApplication extends Node {
    readonly function: Node;
    readonly arguments: Array<Node>;
    constructor(line: number, column: number, start: number, end: number, raw: string, fn: Node, args: Array<Node>);
    getChildNames(): Array<keyof this & string>;
}
declare class SoakedFunctionApplication extends Node {
    readonly function: Node;
    readonly arguments: Array<Node>;
    constructor(line: number, column: number, start: number, end: number, raw: string, fn: Node, args: Array<Node>);
    getChildNames(): Array<keyof this & string>;
}
declare class Super extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class BareSuperFunctionApplication extends Node {
    constructor(line: number, column: number, start: number, end: number, raw: string);
    getChildNames(): Array<keyof this & string>;
}
declare class NewOp extends Node {
    readonly ctor: Node;
    readonly arguments: Array<Node>;
    constructor(line: number, column: number, start: number, end: number, raw: string, ctor: Node, args: Array<Node>);
    getChildNames(): Array<keyof this & string>;
}
declare class SoakedNewOp extends Node {
    readonly ctor: Node;
    readonly arguments: Array<Node>;
    constructor(line: number, column: number, start: number, end: number, raw: string, ctor: Node, args: Array<Node>);
    getChildNames(): Array<keyof this & string>;
}
declare class DoOp extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class ImportDeclaration extends Node {
    readonly defaultBinding: Identifier | null;
    readonly namespaceImport: Identifier | null;
    readonly namedImports: Array<ModuleSpecifier> | null;
    readonly source: String;
    constructor(line: number, column: number, start: number, end: number, raw: string, defaultBinding: Identifier | null, namespaceImport: Identifier | null, namedImports: Array<ModuleSpecifier> | null, source: String);
    getChildNames(): Array<keyof this & string>;
}
declare class ExportNamedDeclaration extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class ExportBindingsDeclaration extends Node {
    readonly namedExports: Array<ModuleSpecifier>;
    readonly source: String | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, namedExports: Array<ModuleSpecifier>, source: String | null);
    getChildNames(): Array<keyof this & string>;
}
declare class ExportDefaultDeclaration extends Node {
    readonly expression: Node;
    constructor(line: number, column: number, start: number, end: number, raw: string, expression: Node);
    getChildNames(): Array<keyof this & string>;
}
declare class ExportAllDeclaration extends Node {
    readonly source: String;
    constructor(line: number, column: number, start: number, end: number, raw: string, source: String);
    getChildNames(): Array<keyof this & string>;
}
declare class ModuleSpecifier extends Node {
    readonly original: Identifier;
    readonly alias: Identifier | null;
    constructor(line: number, column: number, start: number, end: number, raw: string, original: Identifier, alias: Identifier | null);
    getChildNames(): Array<keyof this & string>;
}
declare class CSXElement extends Node {
    readonly properties: Array<Node>;
    readonly children: Array<Node | null>;
    constructor(line: number, column: number, start: number, end: number, raw: string, properties: Array<Node>, children: Array<Node | null>);
    getChildNames(): Array<keyof this & string>;
}

declare type Options = {
    useCS2: boolean;
};
declare const DEFAULT_OPTIONS: Options;
declare function parse(source: string, options?: Options): Program;
declare function traverse(node: Node, callback: (node: Node, parent: Node | null) => boolean | void): void;

export { AccessOp, ArrayInitialiser, AssignOp, AsyncFunction, Await, AwaitReturn, BareSuperFunctionApplication, BaseAssignOp, BaseFunction, BinaryOp, BitAndOp, BitNotOp, BitOrOp, BitXorOp, Block, Bool, BoundAsyncFunction, BoundFunction, BoundGeneratorFunction, Break, CSXElement, ChainedComparisonOp, Class, ClassProtoAssignOp, CompoundAssignOp, Conditional, Constructor, Continue, DEFAULT_OPTIONS, Debugger, DefaultParam, DeleteOp, DivideOp, DoOp, DynamicMemberAccessOp, EQOp, Elision, ExistsOp, ExpOp, Expansion, ExportAllDeclaration, ExportBindingsDeclaration, ExportDefaultDeclaration, ExportNamedDeclaration, ExtendsOp, Float, FloorDivideOp, For, ForFrom, ForIn, ForOf, Function, FunctionApplication, GTEOp, GTOp, GeneratorFunction, Heregex, Identifier, ImportDeclaration, InOp, InstanceofOp, Int, JavaScript, LTEOp, LTOp, LeftShiftOp, LogicalAndOp, LogicalNotOp, LogicalOrOp, Loop, MemberAccessOp, ModuleSpecifier, ModuloOp, MultiplyOp, NEQOp, NewOp, Node, Null, Number, ObjectInitialiser, ObjectInitialiserMember, OfOp, Op, OperatorInfo, Options, PlusOp, PostDecrementOp, PostIncrementOp, PreDecrementOp, PreIncrementOp, Program, ProtoMemberAccessOp, Quasi, Range, Regex, RegexFlags, RemOp, Rest, Return, SeqOp, SignedRightShiftOp, Slice, SoakedDynamicMemberAccessOp, SoakedFunctionApplication, SoakedMemberAccessOp, SoakedNewOp, SoakedProtoMemberAccessOp, SoakedSlice, Spread, String, SubtractOp, Super, Switch, SwitchCase, TaggedTemplateLiteral, This, Throw, Try, TypeofOp, UnaryExistsOp, UnaryNegateOp, UnaryOp, UnaryPlusOp, Undefined, UnsignedRightShiftOp, While, Yield, YieldFrom, YieldReturn, parse, traverse };
