UNPKG

ki

Version:

lisp + mori, sweet.js

1,455 lines (1,454 loc) 149 kB
// Generated by CommonJS Everywhere 0.8.1 (function (global) { function require(file, parentModule) { if ({}.hasOwnProperty.call(require.cache, file)) return require.cache[file]; var resolved = require.resolve(file); if (!resolved) throw new Error('Failed to resolve module ' + file); var module$ = { id: file, require: require, filename: file, exports: {}, loaded: false, parent: parentModule, children: [] }; if (parentModule) parentModule.children.push(module$); var dirname = file.slice(0, file.lastIndexOf('/') + 1); require.cache[file] = module$.exports; resolved.call(module$.exports, module$, module$.exports, dirname, file); module$.loaded = true; return require.cache[file] = module$.exports; } require.modules = {}; require.cache = {}; require.resolve = function (file) { return {}.hasOwnProperty.call(require.modules, file) ? require.modules[file] : void 0; }; require.define = function (file, fn) { require.modules[file] = fn; }; var process = function () { var cwd = '/'; return { title: 'browser', version: 'v0.10.24', browser: true, env: {}, argv: [], nextTick: global.setImmediate || function (fn) { setTimeout(fn, 0); }, cwd: function () { return cwd; }, chdir: function (dir) { cwd = dir; } }; }(); require.define('/tools/entry-point.js', function (module, exports, __dirname, __filename) { (function () { 'use strict'; global.escodegen = require('/escodegen.js', module); escodegen.browser = true; }()); }); require.define('/escodegen.js', function (module, exports, __dirname, __filename) { (function () { 'use strict'; var Syntax, Precedence, BinaryPrecedence, SourceNode, estraverse, esutils, isArray, base, indent, json, renumber, hexadecimal, quotes, escapeless, newline, space, parentheses, semicolons, safeConcatenation, directive, extra, parse, sourceMap, FORMAT_MINIFY, FORMAT_DEFAULTS; estraverse = require('/node_modules/estraverse/estraverse.js', module); esutils = require('/node_modules/esutils/lib/utils.js', module); Syntax = { AssignmentExpression: 'AssignmentExpression', ArrayExpression: 'ArrayExpression', ArrayPattern: 'ArrayPattern', ArrowFunctionExpression: 'ArrowFunctionExpression', BlockStatement: 'BlockStatement', BinaryExpression: 'BinaryExpression', BreakStatement: 'BreakStatement', CallExpression: 'CallExpression', CatchClause: 'CatchClause', ComprehensionBlock: 'ComprehensionBlock', ComprehensionExpression: 'ComprehensionExpression', ConditionalExpression: 'ConditionalExpression', ContinueStatement: 'ContinueStatement', DirectiveStatement: 'DirectiveStatement', DoWhileStatement: 'DoWhileStatement', DebuggerStatement: 'DebuggerStatement', EmptyStatement: 'EmptyStatement', ExportDeclaration: 'ExportDeclaration', ExpressionStatement: 'ExpressionStatement', ForStatement: 'ForStatement', ForInStatement: 'ForInStatement', FunctionDeclaration: 'FunctionDeclaration', FunctionExpression: 'FunctionExpression', GeneratorExpression: 'GeneratorExpression', Identifier: 'Identifier', IfStatement: 'IfStatement', Literal: 'Literal', LabeledStatement: 'LabeledStatement', LogicalExpression: 'LogicalExpression', MemberExpression: 'MemberExpression', NewExpression: 'NewExpression', ObjectExpression: 'ObjectExpression', ObjectPattern: 'ObjectPattern', Program: 'Program', Property: 'Property', ReturnStatement: 'ReturnStatement', SequenceExpression: 'SequenceExpression', SwitchStatement: 'SwitchStatement', SwitchCase: 'SwitchCase', ThisExpression: 'ThisExpression', ThrowStatement: 'ThrowStatement', TryStatement: 'TryStatement', UnaryExpression: 'UnaryExpression', UpdateExpression: 'UpdateExpression', VariableDeclaration: 'VariableDeclaration', VariableDeclarator: 'VariableDeclarator', WhileStatement: 'WhileStatement', WithStatement: 'WithStatement', YieldExpression: 'YieldExpression' }; Precedence = { Sequence: 0, Yield: 1, Assignment: 1, Conditional: 2, ArrowFunction: 2, LogicalOR: 3, LogicalAND: 4, BitwiseOR: 5, BitwiseXOR: 6, BitwiseAND: 7, Equality: 8, Relational: 9, BitwiseSHIFT: 10, Additive: 11, Multiplicative: 12, Unary: 13, Postfix: 14, Call: 15, New: 16, Member: 17, Primary: 18 }; BinaryPrecedence = { '||': Precedence.LogicalOR, '&&': Precedence.LogicalAND, '|': Precedence.BitwiseOR, '^': Precedence.BitwiseXOR, '&': Precedence.BitwiseAND, '==': Precedence.Equality, '!=': Precedence.Equality, '===': Precedence.Equality, '!==': Precedence.Equality, 'is': Precedence.Equality, 'isnt': Precedence.Equality, '<': Precedence.Relational, '>': Precedence.Relational, '<=': Precedence.Relational, '>=': Precedence.Relational, 'in': Precedence.Relational, 'instanceof': Precedence.Relational, '<<': Precedence.BitwiseSHIFT, '>>': Precedence.BitwiseSHIFT, '>>>': Precedence.BitwiseSHIFT, '+': Precedence.Additive, '-': Precedence.Additive, '*': Precedence.Multiplicative, '%': Precedence.Multiplicative, '/': Precedence.Multiplicative }; function getDefaultOptions() { return { indent: null, base: null, parse: null, comment: false, format: { indent: { style: ' ', base: 0, adjustMultilineComment: false }, newline: '\n', space: ' ', json: false, renumber: false, hexadecimal: false, quotes: 'single', escapeless: false, compact: false, parentheses: true, semicolons: true, safeConcatenation: false }, moz: { comprehensionExpressionStartsWithAssignment: false, starlessGenerator: false, parenthesizedComprehensionBlock: false }, sourceMap: null, sourceMapRoot: null, sourceMapWithCode: false, directive: false, verbatim: null }; } function stringRepeat(str, num) { var result = ''; for (num |= 0; num > 0; num >>>= 1, str += str) { if (num & 1) { result += str; } } return result; } isArray = Array.isArray; if (!isArray) { isArray = function isArray(array) { return Object.prototype.toString.call(array) === '[object Array]'; }; } function hasLineTerminator(str) { return /[\r\n]/g.test(str); } function endsWithLineTerminator(str) { var len = str.length; return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1)); } function updateDeeply(target, override) { var key, val; function isHashObject(target) { return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp); } for (key in override) { if (override.hasOwnProperty(key)) { val = override[key]; if (isHashObject(val)) { if (isHashObject(target[key])) { updateDeeply(target[key], val); } else { target[key] = updateDeeply({}, val); } } else { target[key] = val; } } } return target; } function generateNumber(value) { var result, point, temp, exponent, pos; if (value !== value) { throw new Error('Numeric literal whose value is NaN'); } if (value < 0 || value === 0 && 1 / value < 0) { throw new Error('Numeric literal whose value is negative'); } if (value === 1 / 0) { return json ? 'null' : renumber ? '1e400' : '1e+400'; } result = '' + value; if (!renumber || result.length < 3) { return result; } point = result.indexOf('.'); if (!json && result.charCodeAt(0) === 48 && point === 1) { point = 0; result = result.slice(1); } temp = result; result = result.replace('e+', 'e'); exponent = 0; if ((pos = temp.indexOf('e')) > 0) { exponent = +temp.slice(pos + 1); temp = temp.slice(0, pos); } if (point >= 0) { exponent -= temp.length - point - 1; temp = +(temp.slice(0, point) + temp.slice(point + 1)) + ''; } pos = 0; while (temp.charCodeAt(temp.length + pos - 1) === 48) { --pos; } if (pos !== 0) { exponent -= pos; temp = temp.slice(0, pos); } if (exponent !== 0) { temp += 'e' + exponent; } if ((temp.length < result.length || hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length) && +temp === value) { result = temp; } return result; } function escapeRegExpCharacter(ch, previousIsBackslash) { if ((ch & ~1) === 8232) { return (previousIsBackslash ? 'u' : '\\u') + (ch === 8232 ? '2028' : '2029'); } else if (ch === 10 || ch === 13) { return (previousIsBackslash ? '' : '\\') + (ch === 10 ? 'n' : 'r'); } return String.fromCharCode(ch); } function generateRegExp(reg) { var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash; result = reg.toString(); if (reg.source) { match = result.match(/\/([^/]*)$/); if (!match) { return result; } flags = match[1]; result = ''; characterInBrack = false; previousIsBackslash = false; for (i = 0, iz = reg.source.length; i < iz; ++i) { ch = reg.source.charCodeAt(i); if (!previousIsBackslash) { if (characterInBrack) { if (ch === 93) { characterInBrack = false; } } else { if (ch === 47) { result += '\\'; } else if (ch === 91) { characterInBrack = true; } } result += escapeRegExpCharacter(ch, previousIsBackslash); previousIsBackslash = ch === 92; } else { result += escapeRegExpCharacter(ch, previousIsBackslash); previousIsBackslash = false; } } return '/' + result + '/' + flags; } return result; } function escapeAllowedCharacter(code, next) { var hex, result = '\\'; switch (code) { case 8: result += 'b'; break; case 12: result += 'f'; break; case 9: result += 't'; break; default: hex = code.toString(16).toUpperCase(); if (json || code > 255) { result += 'u' + '0000'.slice(hex.length) + hex; } else if (code === 0 && !esutils.code.isDecimalDigit(next)) { result += '0'; } else if (code === 11) { result += 'x0B'; } else { result += 'x' + '00'.slice(hex.length) + hex; } break; } return result; } function escapeDisallowedCharacter(code) { var result = '\\'; switch (code) { case 92: result += '\\'; break; case 10: result += 'n'; break; case 13: result += 'r'; break; case 8232: result += 'u2028'; break; case 8233: result += 'u2029'; break; default: throw new Error('Incorrectly classified character'); } return result; } function escapeDirective(str) { var i, iz, code, quote; quote = quotes === 'double' ? '"' : "'"; for (i = 0, iz = str.length; i < iz; ++i) { code = str.charCodeAt(i); if (code === 39) { quote = '"'; break; } else if (code === 34) { quote = "'"; break; } else if (code === 92) { ++i; } } return quote + str + quote; } function escapeString(str) { var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote; for (i = 0, len = str.length; i < len; ++i) { code = str.charCodeAt(i); if (code === 39) { ++singleQuotes; } else if (code === 34) { ++doubleQuotes; } else if (code === 47 && json) { result += '\\'; } else if (esutils.code.isLineTerminator(code) || code === 92) { result += escapeDisallowedCharacter(code); continue; } else if (json && code < 32 || !(json || escapeless || code >= 32 && code <= 126)) { result += escapeAllowedCharacter(code, str.charCodeAt(i + 1)); continue; } result += String.fromCharCode(code); } single = !(quotes === 'double' || quotes === 'auto' && doubleQuotes < singleQuotes); quote = single ? "'" : '"'; if (!(single ? singleQuotes : doubleQuotes)) { return quote + result + quote; } str = result; result = quote; for (i = 0, len = str.length; i < len; ++i) { code = str.charCodeAt(i); if (code === 39 && single || code === 34 && !single) { result += '\\'; } result += String.fromCharCode(code); } return result + quote; } function flattenToString(arr) { var i, iz, elem, result = ''; for (i = 0, iz = arr.length; i < iz; ++i) { elem = arr[i]; result += isArray(elem) ? flattenToString(elem) : elem; } return result; } function toSourceNodeWhenNeeded(generated, node) { if (!sourceMap) { if (isArray(generated)) { return flattenToString(generated); } else { return generated; } } if (node == null) { if (generated instanceof SourceNode) { return generated; } else { node = {}; } } if (node.loc == null) { return new SourceNode(null, null, sourceMap, generated, node.name || null); } return new SourceNode(node.loc.start.line, node.loc.start.column, sourceMap === true ? node.loc.source || null : sourceMap, generated, node.name || null); } function noEmptySpace() { return space ? space : ' '; } function join(left, right) { var leftSource = toSourceNodeWhenNeeded(left).toString(), rightSource = toSourceNodeWhenNeeded(right).toString(), leftCharCode = leftSource.charCodeAt(leftSource.length - 1), rightCharCode = rightSource.charCodeAt(0); if ((leftCharCode === 43 || leftCharCode === 45) && leftCharCode === rightCharCode || esutils.code.isIdentifierPart(leftCharCode) && esutils.code.isIdentifierPart(rightCharCode) || leftCharCode === 47 && rightCharCode === 105) { return [ left, noEmptySpace(), right ]; } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) || esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) { return [ left, right ]; } return [ left, space, right ]; } function addIndent(stmt) { return [ base, stmt ]; } function withIndent(fn) { var previousBase, result; previousBase = base; base += indent; result = fn.call(this, base); base = previousBase; return result; } function calculateSpaces(str) { var i; for (i = str.length - 1; i >= 0; --i) { if (esutils.code.isLineTerminator(str.charCodeAt(i))) { break; } } return str.length - 1 - i; } function adjustMultilineComment(value, specialBase) { var array, i, len, line, j, spaces, previousBase, sn; array = value.split(/\r\n|[\r\n]/); spaces = Number.MAX_VALUE; for (i = 1, len = array.length; i < len; ++i) { line = array[i]; j = 0; while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) { ++j; } if (spaces > j) { spaces = j; } } if (typeof specialBase !== 'undefined') { previousBase = base; if (array[1][spaces] === '*') { specialBase += ' '; } base = specialBase; } else { if (spaces & 1) { --spaces; } previousBase = base; } for (i = 1, len = array.length; i < len; ++i) { sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces))); array[i] = sourceMap ? sn.join('') : sn; } base = previousBase; return array.join('\n'); } function generateComment(comment, specialBase) { if (comment.type === 'Line') { if (endsWithLineTerminator(comment.value)) { return '//' + comment.value; } else { return '//' + comment.value + '\n'; } } if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) { return adjustMultilineComment('/*' + comment.value + '*/', specialBase); } return '/*' + comment.value + '*/'; } function addCommentsToStatement(stmt, result) { var i, len, comment, save, tailingToStatement, specialBase, fragment; if (stmt.leadingComments && stmt.leadingComments.length > 0) { save = result; comment = stmt.leadingComments[0]; result = []; if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) { result.push('\n'); } result.push(generateComment(comment)); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push('\n'); } for (i = 1, len = stmt.leadingComments.length; i < len; ++i) { comment = stmt.leadingComments[i]; fragment = [generateComment(comment)]; if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { fragment.push('\n'); } result.push(addIndent(fragment)); } result.push(addIndent(save)); } if (stmt.trailingComments) { tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([ base, result, indent ]).toString())); for (i = 0, len = stmt.trailingComments.length; i < len; ++i) { comment = stmt.trailingComments[i]; if (tailingToStatement) { if (i === 0) { result = [ result, indent ]; } else { result = [ result, specialBase ]; } result.push(generateComment(comment, specialBase)); } else { result = [ result, addIndent(generateComment(comment)) ]; } if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result = [ result, '\n' ]; } } } return result; } function parenthesize(text, current, should) { if (current < should) { return [ '(', text, ')' ]; } return text; } function maybeBlock(stmt, semicolonOptional, functionBody) { var result, noLeadingComment; noLeadingComment = !extra.comment || !stmt.leadingComments; if (stmt.type === Syntax.BlockStatement && noLeadingComment) { return [ space, generateStatement(stmt, { functionBody: functionBody }) ]; } if (stmt.type === Syntax.EmptyStatement && noLeadingComment) { return ';'; } withIndent(function () { result = [ newline, addIndent(generateStatement(stmt, { semicolonOptional: semicolonOptional, functionBody: functionBody })) ]; }); return result; } function maybeBlockSuffix(stmt, result) { var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) { return [ result, space ]; } if (ends) { return [ result, base ]; } return [ result, newline, base ]; } function generateVerbatim(expr, option) { var i, result; result = expr[extra.verbatim].split(/\r\n|\n/); for (i = 1; i < result.length; i++) { result[i] = newline + base + result[i]; } result = parenthesize(result, Precedence.Sequence, option.precedence); return toSourceNodeWhenNeeded(result, expr); } function generateIdentifier(node) { return toSourceNodeWhenNeeded(node.name, node); } function generatePattern(node, options) { var result; if (node.type === Syntax.Identifier) { result = generateIdentifier(node); } else { result = generateExpression(node, { precedence: options.precedence, allowIn: options.allowIn, allowCall: true }); } return result; } function generateFunctionBody(node) { var result, i, len, expr, arrow; arrow = node.type === Syntax.ArrowFunctionExpression; if (arrow && node.params.length === 1 && node.params[0].type === Syntax.Identifier) { result = [generateIdentifier(node.params[0])]; } else { result = ['(']; for (i = 0, len = node.params.length; i < len; ++i) { result.push(generatePattern(node.params[i], { precedence: Precedence.Assignment, allowIn: true })); if (i + 1 < len) { result.push(',' + space); } } result.push(')'); } if (arrow) { result.push(space, '=>'); } if (node.expression) { result.push(space); expr = generateExpression(node.body, { precedence: Precedence.Assignment, allowIn: true, allowCall: true }); if (expr.toString().charAt(0) === '{') { expr = [ '(', expr, ')' ]; } result.push(expr); } else { result.push(maybeBlock(node.body, false, true)); } return result; } function generateExpression(expr, option) { var result, precedence, type, currentPrecedence, i, len, raw, fragment, multiline, leftCharCode, leftSource, rightCharCode, allowIn, allowCall, allowUnparenthesizedNew, property, isGenerator; precedence = option.precedence; allowIn = option.allowIn; allowCall = option.allowCall; type = expr.type || option.type; if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) { return generateVerbatim(expr, option); } switch (type) { case Syntax.SequenceExpression: result = []; allowIn |= Precedence.Sequence < precedence; for (i = 0, len = expr.expressions.length; i < len; ++i) { result.push(generateExpression(expr.expressions[i], { precedence: Precedence.Assignment, allowIn: allowIn, allowCall: true })); if (i + 1 < len) { result.push(',' + space); } } result = parenthesize(result, Precedence.Sequence, precedence); break; case Syntax.AssignmentExpression: allowIn |= Precedence.Assignment < precedence; result = parenthesize([ generateExpression(expr.left, { precedence: Precedence.Call, allowIn: allowIn, allowCall: true }), space + expr.operator + space, generateExpression(expr.right, { precedence: Precedence.Assignment, allowIn: allowIn, allowCall: true }) ], Precedence.Assignment, precedence); break; case Syntax.ArrowFunctionExpression: allowIn |= Precedence.ArrowFunction < precedence; result = parenthesize(generateFunctionBody(expr), Precedence.ArrowFunction, precedence); break; case Syntax.ConditionalExpression: allowIn |= Precedence.Conditional < precedence; result = parenthesize([ generateExpression(expr.test, { precedence: Precedence.LogicalOR, allowIn: allowIn, allowCall: true }), space + '?' + space, generateExpression(expr.consequent, { precedence: Precedence.Assignment, allowIn: allowIn, allowCall: true }), space + ':' + space, generateExpression(expr.alternate, { precedence: Precedence.Assignment, allowIn: allowIn, allowCall: true }) ], Precedence.Conditional, precedence); break; case Syntax.LogicalExpression: case Syntax.BinaryExpression: currentPrecedence = BinaryPrecedence[expr.operator]; allowIn |= currentPrecedence < precedence; fragment = generateExpression(expr.left, { precedence: currentPrecedence, allowIn: allowIn, allowCall: true }); leftSource = fragment.toString(); if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPart(expr.operator.charCodeAt(0))) { result = [ fragment, noEmptySpace(), expr.operator ]; } else { result = join(fragment, expr.operator); } fragment = generateExpression(expr.right, { precedence: currentPrecedence + 1, allowIn: allowIn, allowCall: true }); if (expr.operator === '/' && fragment.toString().charAt(0) === '/' || expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') { result.push(noEmptySpace(), fragment); } else { result = join(result, fragment); } if (expr.operator === 'in' && !allowIn) { result = [ '(', result, ')' ]; } else { result = parenthesize(result, currentPrecedence, precedence); } break; case Syntax.CallExpression: result = [generateExpression(expr.callee, { precedence: Precedence.Call, allowIn: true, allowCall: true, allowUnparenthesizedNew: false })]; result.push('('); for (i = 0, len = expr['arguments'].length; i < len; ++i) { result.push(generateExpression(expr['arguments'][i], { precedence: Precedence.Assignment, allowIn: true, allowCall: true })); if (i + 1 < len) { result.push(',' + space); } } result.push(')'); if (!allowCall) { result = [ '(', result, ')' ]; } else { result = parenthesize(result, Precedence.Call, precedence); } break; case Syntax.NewExpression: len = expr['arguments'].length; allowUnparenthesizedNew = option.allowUnparenthesizedNew === undefined || option.allowUnparenthesizedNew; result = join('new', generateExpression(expr.callee, { precedence: Precedence.New, allowIn: true, allowCall: false, allowUnparenthesizedNew: allowUnparenthesizedNew && !parentheses && len === 0 })); if (!allowUnparenthesizedNew || parentheses || len > 0) { result.push('('); for (i = 0; i < len; ++i) { result.push(generateExpression(expr['arguments'][i], { precedence: Precedence.Assignment, allowIn: true, allowCall: true })); if (i + 1 < len) { result.push(',' + space); } } result.push(')'); } result = parenthesize(result, Precedence.New, precedence); break; case Syntax.MemberExpression: result = [generateExpression(expr.object, { precedence: Precedence.Call, allowIn: true, allowCall: allowCall, allowUnparenthesizedNew: false })]; if (expr.computed) { result.push('[', generateExpression(expr.property, { precedence: Precedence.Sequence, allowIn: true, allowCall: allowCall }), ']'); } else { if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') { fragment = toSourceNodeWhenNeeded(result).toString(); if (fragment.indexOf('.') < 0 && !/[eExX]/.test(fragment) && esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) && !(fragment.length >= 2 && fragment.charCodeAt(0) === 48)) { result.push('.'); } } result.push('.', generateIdentifier(expr.property)); } result = parenthesize(result, Precedence.Member, precedence); break; case Syntax.UnaryExpression: fragment = generateExpression(expr.argument, { precedence: Precedence.Unary, allowIn: true, allowCall: true }); if (space === '') { result = join(expr.operator, fragment); } else { result = [expr.operator]; if (expr.operator.length > 2) { result = join(result, fragment); } else { leftSource = toSourceNodeWhenNeeded(result).toString(); leftCharCode = leftSource.charCodeAt(leftSource.length - 1); rightCharCode = fragment.toString().charCodeAt(0); if ((leftCharCode === 43 || leftCharCode === 45) && leftCharCode === rightCharCode || esutils.code.isIdentifierPart(leftCharCode) && esutils.code.isIdentifierPart(rightCharCode)) { result.push(noEmptySpace(), fragment); } else { result.push(fragment); } } } result = parenthesize(result, Precedence.Unary, precedence); break; case Syntax.YieldExpression: if (expr.delegate) { result = 'yield*'; } else { result = 'yield'; } if (expr.argument) { result = join(result, generateExpression(expr.argument, { precedence: Precedence.Yield, allowIn: true, allowCall: true })); } result = parenthesize(result, Precedence.Yield, precedence); break; case Syntax.UpdateExpression: if (expr.prefix) { result = parenthesize([ expr.operator, generateExpression(expr.argument, { precedence: Precedence.Unary, allowIn: true, allowCall: true }) ], Precedence.Unary, precedence); } else { result = parenthesize([ generateExpression(expr.argument, { precedence: Precedence.Postfix, allowIn: true, allowCall: true }), expr.operator ], Precedence.Postfix, precedence); } break; case Syntax.FunctionExpression: isGenerator = expr.generator && !extra.moz.starlessGenerator; result = isGenerator ? 'function*' : 'function'; if (expr.id) { result = [ result, isGenerator ? space : noEmptySpace(), generateIdentifier(expr.id), generateFunctionBody(expr) ]; } else { result = [ result + space, generateFunctionBody(expr) ]; } break; case Syntax.ArrayPattern: case Syntax.ArrayExpression: if (!expr.elements.length) { result = '[]'; break; } multiline = expr.elements.length > 1; result = [ '[', multiline ? newline : '' ]; withIndent(function (indent) { for (i = 0, len = expr.elements.length; i < len; ++i) { if (!expr.elements[i]) { if (multiline) { result.push(indent); } if (i + 1 === len) { result.push(','); } } else { result.push(multiline ? indent : '', generateExpression(expr.elements[i], { precedence: Precedence.Assignment, allowIn: true, allowCall: true })); } if (i + 1 < len) { result.push(',' + (multiline ? newline : space)); } } }); if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(multiline ? base : '', ']'); break; case Syntax.Property: if (expr.kind === 'get' || expr.kind === 'set') { result = [ expr.kind, noEmptySpace(), generateExpression(expr.key, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }), generateFunctionBody(expr.value) ]; } else { if (expr.shorthand) { result = generateExpression(expr.key, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }); } else if (expr.method) { result = []; if (expr.value.generator) { result.push('*'); } result.push(generateExpression(expr.key, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }), generateFunctionBody(expr.value)); } else { result = [ generateExpression(expr.key, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }), ':' + space, generateExpression(expr.value, { precedence: Precedence.Assignment, allowIn: true, allowCall: true }) ]; } } break; case Syntax.ObjectExpression: if (!expr.properties.length) { result = '{}'; break; } multiline = expr.properties.length > 1; withIndent(function () { fragment = generateExpression(expr.properties[0], { precedence: Precedence.Sequence, allowIn: true, allowCall: true, type: Syntax.Property }); }); if (!multiline) { if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { result = [ '{', space, fragment, space, '}' ]; break; } } withIndent(function (indent) { result = [ '{', newline, indent, fragment ]; if (multiline) { result.push(',' + newline); for (i = 1, len = expr.properties.length; i < len; ++i) { result.push(indent, generateExpression(expr.properties[i], { precedence: Precedence.Sequence, allowIn: true, allowCall: true, type: Syntax.Property })); if (i + 1 < len) { result.push(',' + newline); } } } }); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(base, '}'); break; case Syntax.ObjectPattern: if (!expr.properties.length) { result = '{}'; break; } multiline = false; if (expr.properties.length === 1) { property = expr.properties[0]; if (property.value.type !== Syntax.Identifier) { multiline = true; } } else { for (i = 0, len = expr.properties.length; i < len; ++i) { property = expr.properties[i]; if (!property.shorthand) { multiline = true; break; } } } result = [ '{', multiline ? newline : '' ]; withIndent(function (indent) { for (i = 0, len = expr.properties.length; i < len; ++i) { result.push(multiline ? indent : '', generateExpression(expr.properties[i], { precedence: Precedence.Sequence, allowIn: true, allowCall: true })); if (i + 1 < len) { result.push(',' + (multiline ? newline : space)); } } }); if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(multiline ? base : '', '}'); break; case Syntax.ThisExpression: result = 'this'; break; case Syntax.Identifier: result = generateIdentifier(expr); break; case Syntax.Literal: if (expr.hasOwnProperty('raw') && parse) { try { raw = parse(expr.raw).body[0].expression; if (raw.type === Syntax.Literal) { if (raw.value === expr.value) { result = expr.raw; break; } } } catch (e) { } } if (expr.value === null) { result = 'null'; break; } if (typeof expr.value === 'string') { result = escapeString(expr.value); break; } if (typeof expr.value === 'number') { result = generateNumber(expr.value); break; } if (typeof expr.value === 'boolean') { result = expr.value ? 'true' : 'false'; break; } result = generateRegExp(expr.value); break; case Syntax.GeneratorExpression: case Syntax.ComprehensionExpression: result = type === Syntax.GeneratorExpression ? ['('] : ['[']; if (extra.moz.comprehensionExpressionStartsWithAssignment) { fragment = generateExpression(expr.body, { precedence: Precedence.Assignment, allowIn: true, allowCall: true }); result.push(fragment); } if (expr.blocks) { withIndent(function () { for (i = 0, len = expr.blocks.length; i < len; ++i) { fragment = generateExpression(expr.blocks[i], { precedence: Precedence.Sequence, allowIn: true, allowCall: true }); if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) { result = join(result, fragment); } else { result.push(fragment); } } }); } if (expr.filter) { result = join(result, 'if' + space); fragment = generateExpression(expr.filter, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }); if (extra.moz.parenthesizedComprehensionBlock) { result = join(result, [ '(', fragment, ')' ]); } else { result = join(result, fragment); } } if (!extra.moz.comprehensionExpressionStartsWithAssignment) { fragment = generateExpression(expr.body, { precedence: Precedence.Assignment, allowIn: true, allowCall: true }); result = join(result, fragment); } result.push(type === Syntax.GeneratorExpression ? ')' : ']'); break; case Syntax.ComprehensionBlock: if (expr.left.type === Syntax.VariableDeclaration) { fragment = [ expr.left.kind, noEmptySpace(), generateStatement(expr.left.declarations[0], { allowIn: false }) ]; } else { fragment = generateExpression(expr.left, { precedence: Precedence.Call, allowIn: true, allowCall: true }); } fragment = join(fragment, expr.of ? 'of' : 'in'); fragment = join(fragment, generateExpression(expr.right, { precedence: Precedence.Sequence, allowIn: true, allowCall: true })); if (extra.moz.parenthesizedComprehensionBlock) { result = [ 'for' + space + '(', fragment, ')' ]; } else { result = join('for' + space, fragment); } break; default: throw new Error('Unknown expression type: ' + expr.type); } return toSourceNodeWhenNeeded(result, expr); } function generateStatement(stmt, option) { var i, len, result, node, allowIn, functionBody, directiveContext, fragment, semicolon, isGenerator; allowIn = true; semicolon = ';'; functionBody = false; directiveContext = false; if (option) { allowIn = option.allowIn === undefined || option.allowIn; if (!semicolons && option.semicolonOptional === true) { semicolon = ''; } functionBody = option.functionBody; directiveContext = option.directiveContext; } switch (stmt.type) { case Syntax.BlockStatement: result = [ '{', newline ]; withIndent(function () { for (i = 0, len = stmt.body.length; i < len; ++i) { fragment = addIndent(generateStatement(stmt.body[i], { semicolonOptional: i === len - 1, directiveContext: functionBody })); result.push(fragment); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { result.push(newline); } } }); result.push(addIndent('}')); break; case Syntax.BreakStatement: if (stmt.label) { result = 'break ' + stmt.label.name + semicolon; } else { result = 'break' + semicolon; } break; case Syntax.ContinueStatement: if (stmt.label) { result = 'continue ' + stmt.label.name + semicolon; } else { result = 'continue' + semicolon; } break; case Syntax.DirectiveStatement: if (stmt.raw) { result = stmt.raw + semicolon; } else { result = escapeDirective(stmt.directive) + semicolon; } break; case Syntax.DoWhileStatement: result = join('do', maybeBlock(stmt.body)); result = maybeBlockSuffix(stmt.body, result); result = join(result, [ 'while' + space + '(', generateExpression(stmt.test, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }), ')' + semicolon ]); break; case Syntax.CatchClause: withIndent(function () { var guard; result = [ 'catch' + space + '(', generateExpression(stmt.param, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }), ')' ]; if (stmt.guard) { guard = generateExpression(stmt.guard, { precedence: Precedence.Sequence, allowIn: true, allowCall: true }); result.splice(2, 0, ' if ', guard); } }); result.push(maybeBlock(stmt.body)); break; case Syntax.DebuggerStatement: result = 'debugger' + semicolon; break; case Syntax.EmptyStatement: result = ';'; break; case Syntax.ExportDeclaration: result = 'export '; if (stmt.declaration) { result = [ result, generateStatement(stmt.declaration, { semicolonOptional: semicolon === '' }) ]; break; } break; case Syntax.ExpressionStatement: result = [generateExpression(stmt.expression, { precedence: Precedence.Sequence, allowIn: true, allowCall: true })]; fragment = toSourceNodeWhenNeeded(result).toString(); if (fragment.charAt(0) === '{' || fragment.slice(0, 8) === 'function' && '* ('.indexOf(fragment.charAt(8)) >= 0 || directive && directiveContext && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string') { result = [ '(', result, ')' + semicolon ]; } else { result.push(semicolon); } break; case Syntax.VariableDeclarator: if (stmt.init) { result = [ generateExpression(stmt.id, { precedence: Precedence.Assignment, allowIn: allowIn, allowCall: true }), space, '=', space, generateExpression(stmt.init, { precedence: Precedence.Assignment, allowIn: allowIn, allowCall: true }) ]; } else { result = generatePattern(stmt.id, { precedence: Precedence.Assignment, allowIn: allowIn }); } break; case Syntax.VariableDeclaration: result = [stmt.kind];