UNPKG

decaffeinate-parser

Version:

A better AST for CoffeeScript, inspired by CoffeeScriptRedux.

1,535 lines (1,515 loc) 127 kB
var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { AccessOp: () => AccessOp, ArrayInitialiser: () => ArrayInitialiser, AssignOp: () => AssignOp, AsyncFunction: () => AsyncFunction, Await: () => Await, AwaitReturn: () => AwaitReturn, BareSuperFunctionApplication: () => BareSuperFunctionApplication, BaseAssignOp: () => BaseAssignOp, BaseFunction: () => BaseFunction, BinaryOp: () => BinaryOp, BitAndOp: () => BitAndOp, BitNotOp: () => BitNotOp, BitOrOp: () => BitOrOp, BitXorOp: () => BitXorOp, Block: () => Block, Bool: () => Bool, BoundAsyncFunction: () => BoundAsyncFunction, BoundFunction: () => BoundFunction, BoundGeneratorFunction: () => BoundGeneratorFunction, Break: () => Break, CSXElement: () => CSXElement, ChainedComparisonOp: () => ChainedComparisonOp, Class: () => Class, ClassProtoAssignOp: () => ClassProtoAssignOp, CompoundAssignOp: () => CompoundAssignOp, Conditional: () => Conditional, Constructor: () => Constructor, Continue: () => Continue, DEFAULT_OPTIONS: () => DEFAULT_OPTIONS, Debugger: () => Debugger, DefaultParam: () => DefaultParam, DeleteOp: () => DeleteOp, DivideOp: () => DivideOp, DoOp: () => DoOp, DynamicMemberAccessOp: () => DynamicMemberAccessOp, EQOp: () => EQOp, Elision: () => Elision, ExistsOp: () => ExistsOp, ExpOp: () => ExpOp, Expansion: () => Expansion, ExportAllDeclaration: () => ExportAllDeclaration, ExportBindingsDeclaration: () => ExportBindingsDeclaration, ExportDefaultDeclaration: () => ExportDefaultDeclaration, ExportNamedDeclaration: () => ExportNamedDeclaration, ExtendsOp: () => ExtendsOp, Float: () => Float, FloorDivideOp: () => FloorDivideOp, For: () => For, ForFrom: () => ForFrom, ForIn: () => ForIn, ForOf: () => ForOf, Function: () => Function, FunctionApplication: () => FunctionApplication, GTEOp: () => GTEOp, GTOp: () => GTOp, GeneratorFunction: () => GeneratorFunction, Heregex: () => Heregex, Identifier: () => Identifier, ImportDeclaration: () => ImportDeclaration, InOp: () => InOp, InstanceofOp: () => InstanceofOp, Int: () => Int, JavaScript: () => JavaScript, LTEOp: () => LTEOp, LTOp: () => LTOp, LeftShiftOp: () => LeftShiftOp, LogicalAndOp: () => LogicalAndOp, LogicalNotOp: () => LogicalNotOp, LogicalOrOp: () => LogicalOrOp, Loop: () => Loop, MemberAccessOp: () => MemberAccessOp, ModuleSpecifier: () => ModuleSpecifier, ModuloOp: () => ModuloOp, MultiplyOp: () => MultiplyOp, NEQOp: () => NEQOp, NewOp: () => NewOp, Node: () => Node, Null: () => Null, Number: () => Number, ObjectInitialiser: () => ObjectInitialiser, ObjectInitialiserMember: () => ObjectInitialiserMember, OfOp: () => OfOp, OperatorInfo: () => OperatorInfo, PlusOp: () => PlusOp, PostDecrementOp: () => PostDecrementOp, PostIncrementOp: () => PostIncrementOp, PreDecrementOp: () => PreDecrementOp, PreIncrementOp: () => PreIncrementOp, Program: () => Program, ProtoMemberAccessOp: () => ProtoMemberAccessOp, Quasi: () => Quasi, Range: () => Range, Regex: () => Regex, RegexFlags: () => RegexFlags, RemOp: () => RemOp, Rest: () => Rest, Return: () => Return, SeqOp: () => SeqOp, SignedRightShiftOp: () => SignedRightShiftOp, Slice: () => Slice, SoakedDynamicMemberAccessOp: () => SoakedDynamicMemberAccessOp, SoakedFunctionApplication: () => SoakedFunctionApplication, SoakedMemberAccessOp: () => SoakedMemberAccessOp, SoakedNewOp: () => SoakedNewOp, SoakedProtoMemberAccessOp: () => SoakedProtoMemberAccessOp, SoakedSlice: () => SoakedSlice, Spread: () => Spread, String: () => String, SubtractOp: () => SubtractOp, Super: () => Super, Switch: () => Switch, SwitchCase: () => SwitchCase, TaggedTemplateLiteral: () => TaggedTemplateLiteral, This: () => This, Throw: () => Throw, Try: () => Try, TypeofOp: () => TypeofOp, UnaryExistsOp: () => UnaryExistsOp, UnaryNegateOp: () => UnaryNegateOp, UnaryOp: () => UnaryOp, UnaryPlusOp: () => UnaryPlusOp, Undefined: () => Undefined, UnsignedRightShiftOp: () => UnsignedRightShiftOp, While: () => While, Yield: () => Yield, YieldFrom: () => YieldFrom, YieldReturn: () => YieldReturn, parse: () => parse4, traverse: () => traverse }); module.exports = __toCommonJS(src_exports); // src/parser.ts var import_coffee_lex18 = __toESM(require("coffee-lex")); // src/ext/coffee-script.ts var import_nodes = require("decaffeinate-coffeescript/lib/coffee-script/nodes.js"); var import_nodes2 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); function patchCoffeeScript() { import_nodes.Op.prototype.invert = invert; import_nodes.Base.prototype.invert = invert; import_nodes2.Op.prototype.invert = invert; import_nodes2.Base.prototype.invert = invert; } function invert() { this.inverted = !this.inverted; return this; } // src/nodes.ts var Node = class { constructor(type, line, column, start, end, raw) { this.type = type; this.line = line; this.column = column; this.start = start; this.end = end; this.raw = raw; this.parentNode = null; } getChildren() { const children = []; for (const childField of this.getChildFields()) { if (Array.isArray(childField)) { children.push(...childField.filter((node) => node !== null)); } else if (childField) { children.push(childField); } } return children; } getChildFields() { return this.getChildNames().map((name) => this[name]); } }; var Identifier = class extends Node { constructor(line, column, start, end, raw, data) { super("Identifier", line, column, start, end, raw); this.data = data; } getChildNames() { return []; } }; var Bool = class extends Node { constructor(line, column, start, end, raw, data) { super("Bool", line, column, start, end, raw); this.data = data; } static true() { return new Bool(0, 0, 0, 0, "", true); } static false() { return new Bool(0, 0, 0, 0, "", false); } getChildNames() { return []; } }; var JavaScript = class extends Node { constructor(line, column, start, end, raw, data) { super("JavaScript", line, column, start, end, raw); this.data = data; } getChildNames() { return []; } }; var Number = class extends Node { constructor(type, line, column, start, end, raw, data) { super(type, line, column, start, end, raw); this.data = data; } getChildNames() { return []; } }; var Float = class extends Number { constructor(line, column, start, end, raw, data) { super("Float", line, column, start, end, raw, data); } }; var Int = class extends Number { constructor(line, column, start, end, raw, data) { super("Int", line, column, start, end, raw, data); } }; var AccessOp = class extends Node { constructor(type, line, column, start, end, raw, expression) { super(type, line, column, start, end, raw); this.expression = expression; } }; var MemberAccessOp = class extends AccessOp { constructor(line, column, start, end, raw, expression, member) { super("MemberAccessOp", line, column, start, end, raw, expression); this.member = member; } getChildNames() { return ["expression", "member"]; } }; var ProtoMemberAccessOp = class extends AccessOp { constructor(line, column, start, end, raw, expression) { super("ProtoMemberAccessOp", line, column, start, end, raw, expression); } getChildNames() { return ["expression"]; } }; var SoakedMemberAccessOp = class extends AccessOp { constructor(line, column, start, end, raw, expression, member) { super("SoakedMemberAccessOp", line, column, start, end, raw, expression); this.member = member; } getChildNames() { return ["expression", "member"]; } }; var SoakedProtoMemberAccessOp = class extends AccessOp { constructor(line, column, start, end, raw, expression) { super("SoakedProtoMemberAccessOp", line, column, start, end, raw, expression); } getChildNames() { return ["expression"]; } }; var DynamicMemberAccessOp = class extends AccessOp { constructor(line, column, start, end, raw, expression, indexingExpr) { super("DynamicMemberAccessOp", line, column, start, end, raw, expression); this.indexingExpr = indexingExpr; } getChildNames() { return ["expression", "indexingExpr"]; } }; var SoakedDynamicMemberAccessOp = class extends AccessOp { constructor(line, column, start, end, raw, expression, indexingExpr) { super("SoakedDynamicMemberAccessOp", line, column, start, end, raw, expression); this.indexingExpr = indexingExpr; } getChildNames() { return ["expression", "indexingExpr"]; } }; var Quasi = class extends Node { constructor(line, column, start, end, raw, data) { super("Quasi", line, column, start, end, raw); this.data = data; } getChildNames() { return []; } }; var String = class extends Node { constructor(line, column, start, end, raw, quasis, expressions) { super("String", line, column, start, end, raw); this.quasis = quasis; this.expressions = expressions; } getChildNames() { return ["quasis", "expressions"]; } }; var TaggedTemplateLiteral = class extends Node { constructor(line, column, start, end, raw, tag, template) { super("TaggedTemplateLiteral", line, column, start, end, raw); this.tag = tag; this.template = template; } getChildNames() { return ["tag", "template"]; } }; var ObjectInitialiser = class extends Node { constructor(line, column, start, end, raw, members) { super("ObjectInitialiser", line, column, start, end, raw); this.members = members; } getChildNames() { return ["members"]; } }; var ObjectInitialiserMember = class extends Node { constructor(line, column, start, end, raw, key, expression, isComputed) { super("ObjectInitialiserMember", line, column, start, end, raw); this.key = key; this.expression = expression; this.isComputed = isComputed; } getChildNames() { return ["key", "expression"]; } }; var Conditional = class extends Node { constructor(line, column, start, end, raw, condition, consequent, alternate, isUnless) { super("Conditional", line, column, start, end, raw); this.condition = condition; this.consequent = consequent; this.alternate = alternate; this.isUnless = isUnless; } getChildNames() { return ["condition", "consequent", "alternate"]; } }; var Program = class extends Node { constructor(line, column, start, end, raw, body, context) { super("Program", line, column, start, end, raw); this.body = body; this.context = context; } getChildNames() { return ["body"]; } }; var Block = class extends Node { constructor(line, column, start, end, raw, statements, inline) { super("Block", line, column, start, end, raw); this.statements = statements; this.inline = inline; } getChildNames() { return ["statements"]; } withInline(inline) { return new Block(this.line, this.column, this.start, this.end, this.raw, this.statements, inline); } }; var Loop = class extends Node { constructor(line, column, start, end, raw, body) { super("Loop", line, column, start, end, raw); this.body = body; } getChildNames() { return ["body"]; } }; var While = class extends Node { constructor(line, column, start, end, raw, condition, guard, body, isUntil) { super("While", line, column, start, end, raw); this.condition = condition; this.guard = guard; this.body = body; this.isUntil = isUntil; } getChildNames() { return ["condition", "guard", "body"]; } }; var For = class extends Node { constructor(type, line, column, start, end, raw, keyAssignee, valAssignee, target, filter, body) { super(type, line, column, start, end, raw); this.keyAssignee = keyAssignee; this.valAssignee = valAssignee; this.target = target; this.filter = filter; this.body = body; } }; var ForOf = class extends For { constructor(line, column, start, end, raw, keyAssignee, valAssignee, target, filter, body, isOwn) { super("ForOf", line, column, start, end, raw, keyAssignee, valAssignee, target, filter, body); this.isOwn = isOwn; } getChildNames() { return ["keyAssignee", "valAssignee", "target", "filter", "body"]; } }; var ForIn = class extends For { constructor(line, column, start, end, raw, keyAssignee, valAssignee, target, filter, body, step) { super("ForIn", line, column, start, end, raw, keyAssignee, valAssignee, target, filter, body); this.step = step; } getChildNames() { return ["keyAssignee", "valAssignee", "target", "step", "filter", "body"]; } }; var ForFrom = class extends For { constructor(line, column, start, end, raw, valAssignee, target, filter, body) { super("ForFrom", line, column, start, end, raw, null, valAssignee, target, filter, body); } getChildNames() { return ["keyAssignee", "valAssignee", "target", "filter", "body"]; } }; var Switch = class extends Node { constructor(line, column, start, end, raw, expression, cases, alternate) { super("Switch", line, column, start, end, raw); this.expression = expression; this.cases = cases; this.alternate = alternate; } getChildNames() { return ["expression", "cases", "alternate"]; } }; var SwitchCase = class extends Node { constructor(line, column, start, end, raw, conditions, consequent) { super("SwitchCase", line, column, start, end, raw); this.conditions = conditions; this.consequent = consequent; } getChildNames() { return ["conditions", "consequent"]; } }; var RegexFlags = class { constructor(global, ignoreCase, multiline, unicode, sticky) { this.global = global; this.ignoreCase = ignoreCase; this.multiline = multiline; this.unicode = unicode; this.sticky = sticky; this.g = global; this.i = ignoreCase; this.m = multiline; this.u = unicode; this.y = sticky; } static parse(flags) { let global = false; let ignoreCase = false; let multiline = false; let unicode = false; let sticky = false; for (let i = 0; i < flags.length; i++) { switch (flags.charCodeAt(i)) { case 103: global = true; break; case 105: ignoreCase = true; break; case 109: multiline = true; break; case 117: unicode = true; break; case 121: sticky = true; break; default: throw new Error(`invalid regular expression flags: ${flags}`); } } return new RegexFlags(global, ignoreCase, multiline, unicode, sticky); } }; var Heregex = class extends Node { constructor(line, column, start, end, raw, quasis, expressions, flags) { super("Heregex", line, column, start, end, raw); this.quasis = quasis; this.expressions = expressions; this.flags = flags; } getChildNames() { return ["quasis", "expressions"]; } }; var Null = class extends Node { constructor(line, column, start, end, raw) { super("Null", line, column, start, end, raw); } getChildNames() { return []; } }; var Undefined = class extends Node { constructor(line, column, start, end, raw) { super("Undefined", line, column, start, end, raw); } getChildNames() { return []; } }; var Regex = class extends Node { constructor(line, column, start, end, raw, pattern, flags) { super("Regex", line, column, start, end, raw); this.pattern = pattern; this.flags = flags; } getChildNames() { return []; } }; var Return = class extends Node { constructor(line, column, start, end, raw, expression) { super("Return", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var YieldReturn = class extends Node { constructor(line, column, start, end, raw, expression) { super("YieldReturn", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var AwaitReturn = class extends Node { constructor(line, column, start, end, raw, expression) { super("AwaitReturn", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var This = class extends Node { constructor(line, column, start, end, raw) { super("This", line, column, start, end, raw); } getChildNames() { return []; } }; var Throw = class extends Node { constructor(line, column, start, end, raw, expression) { super("Throw", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var ArrayInitialiser = class extends Node { constructor(line, column, start, end, raw, members) { super("ArrayInitialiser", line, column, start, end, raw); this.members = members; } getChildNames() { return ["members"]; } }; var DefaultParam = class extends Node { constructor(line, column, start, end, raw, param, defaultValue) { super("DefaultParam", line, column, start, end, raw); this.param = param; this.default = defaultValue; } getChildNames() { return ["param", "default"]; } }; var Rest = class extends Node { constructor(line, column, start, end, raw, expression) { super("Rest", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var Expansion = class extends Node { constructor(line, column, start, end, raw) { super("Expansion", line, column, start, end, raw); } getChildNames() { return []; } }; var Elision = class extends Node { constructor(line, column, start, end, raw) { super("Elision", line, column, start, end, raw); } getChildNames() { return []; } }; var Break = class extends Node { constructor(line, column, start, end, raw) { super("Break", line, column, start, end, raw); } getChildNames() { return []; } }; var Continue = class extends Node { constructor(line, column, start, end, raw) { super("Continue", line, column, start, end, raw); } getChildNames() { return []; } }; var Debugger = class extends Node { constructor(line, column, start, end, raw) { super("Debugger", line, column, start, end, raw); } getChildNames() { return []; } }; var Spread = class extends Node { constructor(line, column, start, end, raw, expression) { super("Spread", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var Range = class extends Node { constructor(line, column, start, end, raw, left, right, isInclusive) { super("Range", line, column, start, end, raw); this.left = left; this.right = right; this.isInclusive = isInclusive; } getChildNames() { return ["left", "right"]; } }; var BinaryOp = class extends Node { constructor(type, line, column, start, end, raw, left, right) { super(type, line, column, start, end, raw); this.left = left; this.right = right; } getChildNames() { return ["left", "right"]; } }; var UnaryOp = class extends Node { constructor(type, line, column, start, end, raw, expression) { super(type, line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var ChainedComparisonOp = class extends Node { constructor(line, column, start, end, raw, operands, operators) { super("ChainedComparisonOp", line, column, start, end, raw); this.operands = operands; this.operators = operators; } getChildNames() { return ["operands"]; } }; var OperatorInfo = class { constructor(operator, token) { this.operator = operator; this.token = token; } }; var EQOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("EQOp", line, column, start, end, raw, left, right); } }; var NEQOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("NEQOp", line, column, start, end, raw, left, right); } }; var LTOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("LTOp", line, column, start, end, raw, left, right); } }; var LTEOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("LTEOp", line, column, start, end, raw, left, right); } }; var GTOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("GTOp", line, column, start, end, raw, left, right); } }; var GTEOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("GTEOp", line, column, start, end, raw, left, right); } }; var LogicalNotOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("LogicalNotOp", line, column, start, end, raw, expression); } }; var LogicalAndOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("LogicalAndOp", line, column, start, end, raw, left, right); } }; var LogicalOrOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("LogicalOrOp", line, column, start, end, raw, left, right); } }; var SubtractOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("SubtractOp", line, column, start, end, raw, left, right); } }; var PlusOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("PlusOp", line, column, start, end, raw, left, right); } }; var UnaryPlusOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("UnaryPlusOp", line, column, start, end, raw, expression); } }; var MultiplyOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("MultiplyOp", line, column, start, end, raw, left, right); } }; var DivideOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("DivideOp", line, column, start, end, raw, left, right); } }; var FloorDivideOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("FloorDivideOp", line, column, start, end, raw, left, right); } }; var ExistsOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("ExistsOp", line, column, start, end, raw, left, right); } }; var UnaryExistsOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("UnaryExistsOp", line, column, start, end, raw, expression); } }; var UnaryNegateOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("UnaryNegateOp", line, column, start, end, raw, expression); } }; var BitNotOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("BitNotOp", line, column, start, end, raw, expression); } }; var BitAndOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("BitAndOp", line, column, start, end, raw, left, right); } }; var BitOrOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("BitOrOp", line, column, start, end, raw, left, right); } }; var BitXorOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("BitXorOp", line, column, start, end, raw, left, right); } }; var LeftShiftOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("LeftShiftOp", line, column, start, end, raw, left, right); } }; var SignedRightShiftOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("SignedRightShiftOp", line, column, start, end, raw, left, right); } }; var UnsignedRightShiftOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("UnsignedRightShiftOp", line, column, start, end, raw, left, right); } }; var PreDecrementOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("PreDecrementOp", line, column, start, end, raw, expression); } }; var PreIncrementOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("PreIncrementOp", line, column, start, end, raw, expression); } }; var PostDecrementOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("PostDecrementOp", line, column, start, end, raw, expression); } }; var PostIncrementOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("PostIncrementOp", line, column, start, end, raw, expression); } }; var ExpOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("ExpOp", line, column, start, end, raw, left, right); } }; var RemOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("RemOp", line, column, start, end, raw, left, right); } }; var ModuloOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("ModuloOp", line, column, start, end, raw, left, right); } }; var InOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right, isNot) { super("InOp", line, column, start, end, raw, left, right); this.isNot = isNot; } }; var BaseAssignOp = class extends Node { constructor(type, line, column, start, end, raw, assignee, expression) { super(type, line, column, start, end, raw); this.assignee = assignee; this.expression = expression; } getChildNames() { return ["assignee", "expression"]; } }; var AssignOp = class extends BaseAssignOp { constructor(line, column, start, end, raw, assignee, expression) { super("AssignOp", line, column, start, end, raw, assignee, expression); } withExpression(expression) { return new AssignOp(this.line, this.column, this.start, this.end, this.raw, this.assignee, expression); } }; var CompoundAssignOp = class extends BaseAssignOp { constructor(line, column, start, end, raw, assignee, expression, op) { super("CompoundAssignOp", line, column, start, end, raw, assignee, expression); this.op = op; } }; var ExtendsOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("ExtendsOp", line, column, start, end, raw, left, right); } }; var SeqOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right) { super("SeqOp", line, column, start, end, raw, left, right); } }; var TypeofOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("TypeofOp", line, column, start, end, raw, expression); } }; var InstanceofOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right, isNot) { super("InstanceofOp", line, column, start, end, raw, left, right); this.isNot = isNot; } }; var OfOp = class extends BinaryOp { constructor(line, column, start, end, raw, left, right, isNot) { super("OfOp", line, column, start, end, raw, left, right); this.isNot = isNot; } }; var DeleteOp = class extends UnaryOp { constructor(line, column, start, end, raw, expression) { super("DeleteOp", line, column, start, end, raw, expression); } }; var Yield = class extends Node { constructor(line, column, start, end, raw, expression) { super("Yield", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var YieldFrom = class extends Node { constructor(line, column, start, end, raw, expression) { super("YieldFrom", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var Await = class extends Node { constructor(line, column, start, end, raw, expression) { super("Await", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var Slice = class extends Node { constructor(line, column, start, end, raw, expression, left, right, isInclusive) { super("Slice", line, column, start, end, raw); this.expression = expression; this.left = left; this.right = right; this.isInclusive = isInclusive; } getChildNames() { return ["expression", "left", "right"]; } }; var SoakedSlice = class extends Node { constructor(line, column, start, end, raw, expression, left, right, isInclusive) { super("SoakedSlice", line, column, start, end, raw); this.expression = expression; this.left = left; this.right = right; this.isInclusive = isInclusive; } getChildNames() { return ["expression", "left", "right"]; } }; var BaseFunction = class extends Node { constructor(type, line, column, start, end, raw, parameters, body) { super(type, line, column, start, end, raw); this.parameters = parameters; this.body = body; } getChildNames() { return ["parameters", "body"]; } }; var Function = class extends BaseFunction { constructor(line, column, start, end, raw, parameters, body) { super("Function", line, column, start, end, raw, parameters, body); } withParameters(parameters) { return new Function(this.line, this.column, this.start, this.end, this.raw, parameters, this.body); } }; var BoundFunction = class extends BaseFunction { constructor(line, column, start, end, raw, parameters, body) { super("BoundFunction", line, column, start, end, raw, parameters, body); } withParameters(parameters) { return new BoundFunction(this.line, this.column, this.start, this.end, this.raw, parameters, this.body); } }; var GeneratorFunction = class extends BaseFunction { constructor(line, column, start, end, raw, parameters, body) { super("GeneratorFunction", line, column, start, end, raw, parameters, body); } withParameters(parameters) { return new GeneratorFunction(this.line, this.column, this.start, this.end, this.raw, parameters, this.body); } }; var BoundGeneratorFunction = class extends BaseFunction { constructor(line, column, start, end, raw, parameters, body) { super("BoundGeneratorFunction", line, column, start, end, raw, parameters, body); } withParameters(parameters) { return new BoundGeneratorFunction(this.line, this.column, this.start, this.end, this.raw, parameters, this.body); } }; var AsyncFunction = class extends BaseFunction { constructor(line, column, start, end, raw, parameters, body) { super("AsyncFunction", line, column, start, end, raw, parameters, body); } withParameters(parameters) { return new AsyncFunction(this.line, this.column, this.start, this.end, this.raw, parameters, this.body); } }; var BoundAsyncFunction = class extends BaseFunction { constructor(line, column, start, end, raw, parameters, body) { super("BoundAsyncFunction", line, column, start, end, raw, parameters, body); } withParameters(parameters) { return new BoundAsyncFunction(this.line, this.column, this.start, this.end, this.raw, parameters, this.body); } }; var Try = class extends Node { constructor(line, column, start, end, raw, body, catchAssignee, catchBody, finallyBody) { super("Try", line, column, start, end, raw); this.body = body; this.catchAssignee = catchAssignee; this.catchBody = catchBody; this.finallyBody = finallyBody; } getChildNames() { return ["body", "catchAssignee", "catchBody", "finallyBody"]; } }; var Constructor = class extends BaseAssignOp { constructor(line, column, start, end, raw, assignee, expression) { super("Constructor", line, column, start, end, raw, assignee, expression); } }; var ClassProtoAssignOp = class extends BaseAssignOp { constructor(line, column, start, end, raw, assignee, expression) { super("ClassProtoAssignOp", line, column, start, end, raw, assignee, expression); } }; var Class = class extends Node { constructor(line, column, start, end, raw, nameAssignee, name, body, boundMembers, parent, ctor) { super("Class", line, column, start, end, raw); this.nameAssignee = nameAssignee; this.name = name; this.body = body; this.boundMembers = boundMembers; this.parent = parent; this.ctor = ctor; } getChildNames() { return ["nameAssignee", "parent", "body"]; } }; var FunctionApplication = class extends Node { constructor(line, column, start, end, raw, fn, args) { super("FunctionApplication", line, column, start, end, raw); this.function = fn; this.arguments = args; } getChildNames() { return ["function", "arguments"]; } }; var SoakedFunctionApplication = class extends Node { constructor(line, column, start, end, raw, fn, args) { super("SoakedFunctionApplication", line, column, start, end, raw); this.function = fn; this.arguments = args; } getChildNames() { return ["function", "arguments"]; } }; var Super = class extends Node { constructor(line, column, start, end, raw) { super("Super", line, column, start, end, raw); } getChildNames() { return []; } }; var BareSuperFunctionApplication = class extends Node { constructor(line, column, start, end, raw) { super("BareSuperFunctionApplication", line, column, start, end, raw); } getChildNames() { return []; } }; var NewOp = class extends Node { constructor(line, column, start, end, raw, ctor, args) { super("NewOp", line, column, start, end, raw); this.ctor = ctor; this.arguments = args; } getChildNames() { return ["ctor", "arguments"]; } }; var SoakedNewOp = class extends Node { constructor(line, column, start, end, raw, ctor, args) { super("SoakedNewOp", line, column, start, end, raw); this.ctor = ctor; this.arguments = args; } getChildNames() { return ["ctor", "arguments"]; } }; var DoOp = class extends Node { constructor(line, column, start, end, raw, expression) { super("DoOp", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var ImportDeclaration = class extends Node { constructor(line, column, start, end, raw, defaultBinding, namespaceImport, namedImports, source) { super("ImportDeclaration", line, column, start, end, raw); this.defaultBinding = defaultBinding; this.namespaceImport = namespaceImport; this.namedImports = namedImports; this.source = source; } getChildNames() { return ["defaultBinding", "namespaceImport", "namedImports", "source"]; } }; var ExportNamedDeclaration = class extends Node { constructor(line, column, start, end, raw, expression) { super("ExportNamedDeclaration", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var ExportBindingsDeclaration = class extends Node { constructor(line, column, start, end, raw, namedExports, source) { super("ExportBindingsDeclaration", line, column, start, end, raw); this.namedExports = namedExports; this.source = source; } getChildNames() { return ["namedExports", "source"]; } }; var ExportDefaultDeclaration = class extends Node { constructor(line, column, start, end, raw, expression) { super("ExportDefaultDeclaration", line, column, start, end, raw); this.expression = expression; } getChildNames() { return ["expression"]; } }; var ExportAllDeclaration = class extends Node { constructor(line, column, start, end, raw, source) { super("ExportAllDeclaration", line, column, start, end, raw); this.source = source; } getChildNames() { return ["source"]; } }; var ModuleSpecifier = class extends Node { constructor(line, column, start, end, raw, original, alias) { super("ModuleSpecifier", line, column, start, end, raw); this.original = original; this.alias = alias; } getChildNames() { return ["original", "alias"]; } }; var CSXElement = class extends Node { constructor(line, column, start, end, raw, properties, children) { super("CSXElement", line, column, start, end, raw); this.properties = properties; this.children = children; } getChildNames() { return ["properties", "children"]; } }; // src/util/isCommentOnlyNode.ts var import_nodes3 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); function isCommentOnlyNode(base) { return base instanceof import_nodes3.Value && base.base instanceof import_nodes3.PassthroughLiteral && base.base.value === ""; } // src/mappers/mapBlock.ts var import_coffee_lex14 = require("coffee-lex"); var import_nodes50 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); var import_util8 = require("util"); // src/util/getLocation.ts var import_coffee_lex = require("coffee-lex"); var import_util = require("util"); function getLocation(context, node) { const loc = node.locationData; let start = context.linesAndColumns.indexForLocation({ line: loc.first_line, column: loc.first_column }); const last = context.linesAndColumns.indexForLocation({ line: loc.last_line, column: loc.last_column }); if (start === null || last === null) { throw new Error(`unable to determine range for location: ${(0, import_util.inspect)(loc)}}`); } const line = loc.first_line + 1; const column = loc.first_column + 1; let end = last + 1; if (start < 0) { start = 0; } if (end > context.source.length) { end = context.source.length; } const firstTokenOfNode = requireToken(firstSemanticTokenAfter(context, start), node); const lastTokenOfNode = requireToken(firstSemanticTokenBefore(context, end), node); start = firstTokenOfNode.start; end = lastTokenOfNode.end; const raw = context.source.slice(start, end); return { line, column, start, end, raw }; } function firstSemanticTokenAfter(context, index) { const tokenIndex = context.sourceTokens.indexOfTokenMatchingPredicate((token) => { return token.start >= index && token.type !== import_coffee_lex.SourceType.NEWLINE && token.type !== import_coffee_lex.SourceType.COMMENT; }, context.sourceTokens.indexOfTokenNearSourceIndex(index)); return tokenIndex === null ? null : context.sourceTokens.tokenAtIndex(tokenIndex); } function firstSemanticTokenBefore(context, index) { const tokenIndex = context.sourceTokens.lastIndexOfTokenMatchingPredicate((token) => { return token.end <= index && token.type !== import_coffee_lex.SourceType.NEWLINE && token.type !== import_coffee_lex.SourceType.COMMENT; }, context.sourceTokens.indexOfTokenNearSourceIndex(index)); return tokenIndex === null ? null : context.sourceTokens.tokenAtIndex(tokenIndex); } function requireToken(token, node) { if (token === null) { throw new Error(`unable to find token for node: ${(0, import_util.inspect)(node)}`); } return token; } // src/mappers/mapAny.ts var import_nodes49 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); // src/util/UnsupportedNodeError.ts var import_util2 = require("util"); var UnsupportedNodeError = class extends Error { constructor(node, message = null) { const prefix = message ? `${message} ` : ""; super(`${prefix}node type '${node.constructor.name}' is not supported: ${(0, import_util2.inspect)(node)}`); Object.setPrototypeOf(this, UnsupportedNodeError.prototype); this.node = node; } }; // src/mappers/mapArr.ts function mapArr(context, node) { const { line, column, start, end, raw } = getLocation(context, node); const members = node.objects.map((object) => mapAny(context, object)); return new ArrayInitialiser(line, column, start, end, raw, members); } // src/mappers/mapAssign.ts var COMPOUND_ASSIGN_OPS = { "-=": SubtractOp.name, "+=": PlusOp.name, "/=": DivideOp.name, "*=": MultiplyOp.name, "%=": RemOp.name, "||=": LogicalOrOp.name, "&&=": LogicalAndOp.name, "?=": ExistsOp.name, "<<=": LeftShiftOp.name, ">>=": SignedRightShiftOp.name, ">>>=": UnsignedRightShiftOp.name, "&=": BitAndOp.name, "^=": BitXorOp.name, "|=": BitOrOp.name, "**=": ExpOp.name, "//=": FloorDivideOp.name, "%%=": ModuloOp.name }; function mapAssign(context, node) { if (node.context === "object") { throw new UnsupportedNodeError(node, "Unexpected object context when mapping regular assign op."); } const { line, column, start, end, raw } = getLocation(context, node); if (node.context) { const opName = COMPOUND_ASSIGN_OPS[node.context]; if (!opName) { throw new UnsupportedNodeError(node, "Unexpected operator context for assign op."); } return new CompoundAssignOp(line, column, start, end, raw, mapAny(context, node.variable), mapAny(context, node.value), opName); } else { return new AssignOp(line, column, start, end, raw, mapAny(context, node.variable), mapAny(context, node.value)); } } // src/mappers/mapCall.ts var import_coffee_lex5 = require("coffee-lex"); var import_nodes12 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); var import_util3 = require("util"); // src/util/isHeregexTemplateNode.ts var import_coffee_lex2 = require("coffee-lex"); var import_nodes6 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); function isHeregexTemplateNode(node, context) { if (!(node instanceof import_nodes6.Call) || !node.variable || !(node.variable instanceof import_nodes6.Value) || !node.variable.base || !(node.variable.base instanceof import_nodes6.Literal) || node.variable.base.value !== "RegExp") { return false; } const { sourceTokens, linesAndColumns } = context; const start = linesAndColumns.indexForLocation({ line: node.locationData.first_line, column: node.locationData.first_column }); if (start === null) { return false; } const startTokenIndex = sourceTokens.indexOfTokenContainingSourceIndex(start); if (startTokenIndex === null) { return false; } const startToken = sourceTokens.tokenAtIndex(startTokenIndex); if (startToken === null) { return false; } return startToken.type === import_coffee_lex2.SourceType.HEREGEXP_START; } // src/util/locationsEqual.ts function locationsEqual(first, second) { return first.first_line === second.first_line && first.first_column === second.first_column && first.last_line === second.last_line && first.last_column === second.last_column; } // src/util/getTemplateLiteralComponents.ts var import_coffee_lex4 = require("coffee-lex"); var import_nodes7 = require("decaffeinate-coffeescript2/lib/coffeescript/nodes.js"); // src/util/isPlusTokenBetweenRanges.ts var import_coffee_lex3 = require("coffee-lex"); function isPlusTokenBetweenRanges(leftRange, rightRange, context) { const tokens = context.sourceTokens; const leftEnd = tokens.indexOfTokenContainingSourceIndex(leftRange[1] - 1); const rightStart = tokens.indexOfTokenContainingSourceIndex(rightRange[0]); if (!leftEnd || !rightStart) { return false; } const afterLeftEnd = leftEnd.next(); if (!afterLeftEnd) { return false; } const tokensBetweenOperands = tokens.slice(afterLeftEnd, rightStart); let foundPlusToken = false; tokensBetweenOperands.forEach(({ type, start, end }) => { if (type === import_coffee_lex3.SourceType.OPERATOR && context.source.slice(start, end) === "+") { foundPlusToken = true; } }); return foundPlusToken; } // src/util/isImplicitPlusOp.ts function isImplicitPlusOp(op, context) { if (op.operator !== "+" || !op.second) { return false; } const firstRange = context.getRange(op.first); const secondRange = context.getRange(op.second); if (!firstRange || !secondRange) { throw new Error("Expected valid location data on plus operation."); } return !isPlusTokenBetweenRanges(firstRange, secondRange, context); } // src/util/parseString.ts var import_parser = require("@codemod/parser"); function parseString(string) { const expressionStatement = (0, import_parser.parse)(`(${string})`).program.body[0]; const literal = expressionStatement.expression; return literal.value; } // src/util/getTemplateLiteralComponents.ts function getTemplateLiteralComponents(context, node) { const tokens = context.sourceTokens; const quasis = []; const unmappedExpressions = []; const elements = getElements(node, context); const nodeRange = context.getRange(node); if (!nodeRange) { throw new Error("Expected valid range on template literal node."); } const { startTokenIndex, startToken } = getStartToken(nodeRange[0], tokens); let depth = 0; let lastToken = startToken; for (let tokenIndex = startTokenIndex; tokenIndex; tokenIndex = tokenIndex.next()) { const token = tokens.tokenAtIndex(tokenIndex); if (!token) { break; } if (token.type === import_coffee_lex4.SourceType.INTERPOLATION_START || token.type === import_coffee_lex4.SourceType.CSX_OPEN_TAG_START) { depth++; if (depth === 1) { quasis.push(findQuasi(lastToken, token, context, elements)); lastToken = token; } } else if (token.type === import_coffee_lex4.SourceType.INTERPOLATION_END || token.type === import_coffee_lex4.SourceType.CSX_SELF_CLOSING_TAG_END || token.type === import_coffee_lex4.SourceType.CSX_CLOSE_TAG_END) { depth--; if (depth === 0) { unmappedExpressions.push(findExpression(lastToken, token, context, elements)); lastToken = token; } } else if (depth === 0 && isTemplateLiteralEnd(token)) { quasis.push(findQuasi(lastToken, token, context, elements)); lastToken = token; break; } } return { quasis, unmappedExpressions, start: startToken.start, end: lastToken.end }; } function getElements(node, context) { if (node instanceof import_nodes7.Op && isImplicitPlusOp(node, context)) { if (!node.second) { throw new Error("Expected second operand on plus op."); } return [ ...getElements(node.first, context), ...getElements(node.second, context) ]; } return [node]; } function getStartToken(start, tokens) { let tokenIndex = tokens.indexOfTokenNearSourceIndex(start); for (let i = 0; i < 5; i++) { const token = tokens.tokenAtIndex(tokenIndex); if (!token) { throw new Error("Expected to find a start token in a template literal."); } if (isTemplateLiteralStart(token)) { return { startToken: token, startTokenIndex: tokenIndex }; } const prevToken = tokenIndex.previous(); if (!prevToken) { throw new Error("Expected a previous token when searching for a template start."); } tokenIndex = prevToken; } throw new Error("Expected a template literal start token."); } function findQuasi(leftToken, rightToken, context, elements) { const matchingElements = elements.filter((elem) => { const range = context.getRange(elem); if (!range) { throw new Error("Unexpected invalid range."); } return range[0] >= leftToken.start && range[1] <= rightToken.end; }); const start = leftToken.end; const end = rightToken.start; const startLoc = context.linesAndColumns.locationForIndex(leftToken.end); if (!startLoc) { throw new Error(`Expected to find a location for index ${leftToken.end}.`); } const raw = context.source.slice(start, end); if (matchingElements.length === 0) { return new Quasi(startLoc.line + 1, startLoc.column + 1, start, end, raw, ""); } else if (matchingElements.length === 1) { const element = matchingElements[0]; let literal; if (element instanceof import_nodes7.Literal) { literal = element; } else if (element instanceof import_nodes7.Value && element.properties.length === 0 && element.base instanceof import_nodes7.Literal) { literal = element.base; } else { throw new Error("Expected quasi element to be either a literal or a value containing only a literal."); } const stringValue = parseString(literal.value); return new Quasi(startLoc.line + 1, startLoc.column + 1, start, end, raw, stringValue !== void 0 ? stringValue : literal.value); } else { throw new Error("Unexpectedly found multiple elements in string interpolation."); } } function findExpression(leftToken, rightToken, context, elements) { const matchingElements = elements.filter((elem) => { const range = context.getRange(elem); if (!rang