react / wstein / node_modules / browserify / node_modules / module-deps / node_modules / detective / node_modules / escodegen / escodegen.js
80556 views/*1Copyright (C) 2012-2014 Yusuke Suzuki <[email protected]>2Copyright (C) 2015 Ingvar Stepanyan <[email protected]>3Copyright (C) 2014 Ivan Nikulin <[email protected]>4Copyright (C) 2012-2013 Michael Ficarra <[email protected]>5Copyright (C) 2012-2013 Mathias Bynens <[email protected]>6Copyright (C) 2013 Irakli Gozalishvili <[email protected]>7Copyright (C) 2012 Robert Gust-Bardon <[email protected]>8Copyright (C) 2012 John Freeman <[email protected]>9Copyright (C) 2011-2012 Ariya Hidayat <[email protected]>10Copyright (C) 2012 Joost-Wim Boekesteijn <[email protected]>11Copyright (C) 2012 Kris Kowal <[email protected]>12Copyright (C) 2012 Arpad Borsos <[email protected]>1314Redistribution and use in source and binary forms, with or without15modification, are permitted provided that the following conditions are met:1617* Redistributions of source code must retain the above copyright18notice, this list of conditions and the following disclaimer.19* Redistributions in binary form must reproduce the above copyright20notice, this list of conditions and the following disclaimer in the21documentation and/or other materials provided with the distribution.2223THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"24AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE25IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE26ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY27DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES28(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;29LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND30ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT31(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF32THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.33*/3435/*global exports:true, require:true, global:true*/36(function () {37'use strict';3839var Syntax,40Precedence,41BinaryPrecedence,42SourceNode,43estraverse,44esutils,45isArray,46base,47indent,48json,49renumber,50hexadecimal,51quotes,52escapeless,53newline,54space,55parentheses,56semicolons,57safeConcatenation,58directive,59extra,60parse,61sourceMap,62sourceCode,63preserveBlankLines,64FORMAT_MINIFY,65FORMAT_DEFAULTS;6667estraverse = require('estraverse');68esutils = require('esutils');6970Syntax = estraverse.Syntax;7172// Generation is done by generateExpression.73function isExpression(node) {74return CodeGenerator.Expression.hasOwnProperty(node.type);75}7677// Generation is done by generateStatement.78function isStatement(node) {79return CodeGenerator.Statement.hasOwnProperty(node.type);80}8182Precedence = {83Sequence: 0,84Yield: 1,85Await: 1,86Assignment: 1,87Conditional: 2,88ArrowFunction: 2,89LogicalOR: 3,90LogicalAND: 4,91BitwiseOR: 5,92BitwiseXOR: 6,93BitwiseAND: 7,94Equality: 8,95Relational: 9,96BitwiseSHIFT: 10,97Additive: 11,98Multiplicative: 12,99Unary: 13,100Postfix: 14,101Call: 15,102New: 16,103TaggedTemplate: 17,104Member: 18,105Primary: 19106};107108BinaryPrecedence = {109'||': Precedence.LogicalOR,110'&&': Precedence.LogicalAND,111'|': Precedence.BitwiseOR,112'^': Precedence.BitwiseXOR,113'&': Precedence.BitwiseAND,114'==': Precedence.Equality,115'!=': Precedence.Equality,116'===': Precedence.Equality,117'!==': Precedence.Equality,118'is': Precedence.Equality,119'isnt': Precedence.Equality,120'<': Precedence.Relational,121'>': Precedence.Relational,122'<=': Precedence.Relational,123'>=': Precedence.Relational,124'in': Precedence.Relational,125'instanceof': Precedence.Relational,126'<<': Precedence.BitwiseSHIFT,127'>>': Precedence.BitwiseSHIFT,128'>>>': Precedence.BitwiseSHIFT,129'+': Precedence.Additive,130'-': Precedence.Additive,131'*': Precedence.Multiplicative,132'%': Precedence.Multiplicative,133'/': Precedence.Multiplicative134};135136//Flags137var F_ALLOW_IN = 1,138F_ALLOW_CALL = 1 << 1,139F_ALLOW_UNPARATH_NEW = 1 << 2,140F_FUNC_BODY = 1 << 3,141F_DIRECTIVE_CTX = 1 << 4,142F_SEMICOLON_OPT = 1 << 5;143144//Expression flag sets145//NOTE: Flag order:146// F_ALLOW_IN147// F_ALLOW_CALL148// F_ALLOW_UNPARATH_NEW149var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,150E_TTF = F_ALLOW_IN | F_ALLOW_CALL,151E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW,152E_TFF = F_ALLOW_IN,153E_FFT = F_ALLOW_UNPARATH_NEW,154E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW;155156//Statement flag sets157//NOTE: Flag order:158// F_ALLOW_IN159// F_FUNC_BODY160// F_DIRECTIVE_CTX161// F_SEMICOLON_OPT162var S_TFFF = F_ALLOW_IN,163S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT,164S_FFFF = 0x00,165S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX,166S_TTFF = F_ALLOW_IN | F_FUNC_BODY;167168function getDefaultOptions() {169// default options170return {171indent: null,172base: null,173parse: null,174comment: false,175format: {176indent: {177style: ' ',178base: 0,179adjustMultilineComment: false180},181newline: '\n',182space: ' ',183json: false,184renumber: false,185hexadecimal: false,186quotes: 'single',187escapeless: false,188compact: false,189parentheses: true,190semicolons: true,191safeConcatenation: false,192preserveBlankLines: false193},194moz: {195comprehensionExpressionStartsWithAssignment: false,196starlessGenerator: false197},198sourceMap: null,199sourceMapRoot: null,200sourceMapWithCode: false,201directive: false,202raw: true,203verbatim: null,204sourceCode: null205};206}207208function stringRepeat(str, num) {209var result = '';210211for (num |= 0; num > 0; num >>>= 1, str += str) {212if (num & 1) {213result += str;214}215}216217return result;218}219220isArray = Array.isArray;221if (!isArray) {222isArray = function isArray(array) {223return Object.prototype.toString.call(array) === '[object Array]';224};225}226227function hasLineTerminator(str) {228return (/[\r\n]/g).test(str);229}230231function endsWithLineTerminator(str) {232var len = str.length;233return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1));234}235236function merge(target, override) {237var key;238for (key in override) {239if (override.hasOwnProperty(key)) {240target[key] = override[key];241}242}243return target;244}245246function updateDeeply(target, override) {247var key, val;248249function isHashObject(target) {250return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp);251}252253for (key in override) {254if (override.hasOwnProperty(key)) {255val = override[key];256if (isHashObject(val)) {257if (isHashObject(target[key])) {258updateDeeply(target[key], val);259} else {260target[key] = updateDeeply({}, val);261}262} else {263target[key] = val;264}265}266}267return target;268}269270function generateNumber(value) {271var result, point, temp, exponent, pos;272273if (value !== value) {274throw new Error('Numeric literal whose value is NaN');275}276if (value < 0 || (value === 0 && 1 / value < 0)) {277throw new Error('Numeric literal whose value is negative');278}279280if (value === 1 / 0) {281return json ? 'null' : renumber ? '1e400' : '1e+400';282}283284result = '' + value;285if (!renumber || result.length < 3) {286return result;287}288289point = result.indexOf('.');290if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) {291point = 0;292result = result.slice(1);293}294temp = result;295result = result.replace('e+', 'e');296exponent = 0;297if ((pos = temp.indexOf('e')) > 0) {298exponent = +temp.slice(pos + 1);299temp = temp.slice(0, pos);300}301if (point >= 0) {302exponent -= temp.length - point - 1;303temp = +(temp.slice(0, point) + temp.slice(point + 1)) + '';304}305pos = 0;306while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) {307--pos;308}309if (pos !== 0) {310exponent -= pos;311temp = temp.slice(0, pos);312}313if (exponent !== 0) {314temp += 'e' + exponent;315}316if ((temp.length < result.length ||317(hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) &&318+temp === value) {319result = temp;320}321322return result;323}324325// Generate valid RegExp expression.326// This function is based on https://github.com/Constellation/iv Engine327328function escapeRegExpCharacter(ch, previousIsBackslash) {329// not handling '\' and handling \u2028 or \u2029 to unicode escape sequence330if ((ch & ~1) === 0x2028) {331return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029');332} else if (ch === 10 || ch === 13) { // \n, \r333return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r');334}335return String.fromCharCode(ch);336}337338function generateRegExp(reg) {339var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash;340341result = reg.toString();342343if (reg.source) {344// extract flag from toString result345match = result.match(/\/([^/]*)$/);346if (!match) {347return result;348}349350flags = match[1];351result = '';352353characterInBrack = false;354previousIsBackslash = false;355for (i = 0, iz = reg.source.length; i < iz; ++i) {356ch = reg.source.charCodeAt(i);357358if (!previousIsBackslash) {359if (characterInBrack) {360if (ch === 93) { // ]361characterInBrack = false;362}363} else {364if (ch === 47) { // /365result += '\\';366} else if (ch === 91) { // [367characterInBrack = true;368}369}370result += escapeRegExpCharacter(ch, previousIsBackslash);371previousIsBackslash = ch === 92; // \372} else {373// if new RegExp("\\\n') is provided, create /\n/374result += escapeRegExpCharacter(ch, previousIsBackslash);375// prevent like /\\[/]/376previousIsBackslash = false;377}378}379380return '/' + result + '/' + flags;381}382383return result;384}385386function escapeAllowedCharacter(code, next) {387var hex;388389if (code === 0x08 /* \b */) {390return '\\b';391}392393if (code === 0x0C /* \f */) {394return '\\f';395}396397if (code === 0x09 /* \t */) {398return '\\t';399}400401hex = code.toString(16).toUpperCase();402if (json || code > 0xFF) {403return '\\u' + '0000'.slice(hex.length) + hex;404} else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) {405return '\\0';406} else if (code === 0x000B /* \v */) { // '\v'407return '\\x0B';408} else {409return '\\x' + '00'.slice(hex.length) + hex;410}411}412413function escapeDisallowedCharacter(code) {414if (code === 0x5C /* \ */) {415return '\\\\';416}417418if (code === 0x0A /* \n */) {419return '\\n';420}421422if (code === 0x0D /* \r */) {423return '\\r';424}425426if (code === 0x2028) {427return '\\u2028';428}429430if (code === 0x2029) {431return '\\u2029';432}433434throw new Error('Incorrectly classified character');435}436437function escapeDirective(str) {438var i, iz, code, quote;439440quote = quotes === 'double' ? '"' : '\'';441for (i = 0, iz = str.length; i < iz; ++i) {442code = str.charCodeAt(i);443if (code === 0x27 /* ' */) {444quote = '"';445break;446} else if (code === 0x22 /* " */) {447quote = '\'';448break;449} else if (code === 0x5C /* \ */) {450++i;451}452}453454return quote + str + quote;455}456457function escapeString(str) {458var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote;459460for (i = 0, len = str.length; i < len; ++i) {461code = str.charCodeAt(i);462if (code === 0x27 /* ' */) {463++singleQuotes;464} else if (code === 0x22 /* " */) {465++doubleQuotes;466} else if (code === 0x2F /* / */ && json) {467result += '\\';468} else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) {469result += escapeDisallowedCharacter(code);470continue;471} else if ((json && code < 0x20 /* SP */) || !(json || escapeless || (code >= 0x20 /* SP */ && code <= 0x7E /* ~ */))) {472result += escapeAllowedCharacter(code, str.charCodeAt(i + 1));473continue;474}475result += String.fromCharCode(code);476}477478single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes));479quote = single ? '\'' : '"';480481if (!(single ? singleQuotes : doubleQuotes)) {482return quote + result + quote;483}484485str = result;486result = quote;487488for (i = 0, len = str.length; i < len; ++i) {489code = str.charCodeAt(i);490if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) {491result += '\\';492}493result += String.fromCharCode(code);494}495496return result + quote;497}498499/**500* flatten an array to a string, where the array can contain501* either strings or nested arrays502*/503function flattenToString(arr) {504var i, iz, elem, result = '';505for (i = 0, iz = arr.length; i < iz; ++i) {506elem = arr[i];507result += isArray(elem) ? flattenToString(elem) : elem;508}509return result;510}511512/**513* convert generated to a SourceNode when source maps are enabled.514*/515function toSourceNodeWhenNeeded(generated, node) {516if (!sourceMap) {517// with no source maps, generated is either an518// array or a string. if an array, flatten it.519// if a string, just return it520if (isArray(generated)) {521return flattenToString(generated);522} else {523return generated;524}525}526if (node == null) {527if (generated instanceof SourceNode) {528return generated;529} else {530node = {};531}532}533if (node.loc == null) {534return new SourceNode(null, null, sourceMap, generated, node.name || null);535}536return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap === true ? node.loc.source || null : sourceMap), generated, node.name || null);537}538539function noEmptySpace() {540return (space) ? space : ' ';541}542543function join(left, right) {544var leftSource,545rightSource,546leftCharCode,547rightCharCode;548549leftSource = toSourceNodeWhenNeeded(left).toString();550if (leftSource.length === 0) {551return [right];552}553554rightSource = toSourceNodeWhenNeeded(right).toString();555if (rightSource.length === 0) {556return [left];557}558559leftCharCode = leftSource.charCodeAt(leftSource.length - 1);560rightCharCode = rightSource.charCodeAt(0);561562if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode ||563esutils.code.isIdentifierPart(leftCharCode) && esutils.code.isIdentifierPart(rightCharCode) ||564leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i`565return [left, noEmptySpace(), right];566} else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) ||567esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) {568return [left, right];569}570return [left, space, right];571}572573function addIndent(stmt) {574return [base, stmt];575}576577function withIndent(fn) {578var previousBase;579previousBase = base;580base += indent;581fn(base);582base = previousBase;583}584585function calculateSpaces(str) {586var i;587for (i = str.length - 1; i >= 0; --i) {588if (esutils.code.isLineTerminator(str.charCodeAt(i))) {589break;590}591}592return (str.length - 1) - i;593}594595function adjustMultilineComment(value, specialBase) {596var array, i, len, line, j, spaces, previousBase, sn;597598array = value.split(/\r\n|[\r\n]/);599spaces = Number.MAX_VALUE;600601// first line doesn't have indentation602for (i = 1, len = array.length; i < len; ++i) {603line = array[i];604j = 0;605while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) {606++j;607}608if (spaces > j) {609spaces = j;610}611}612613if (typeof specialBase !== 'undefined') {614// pattern like615// {616// var t = 20; /*617// * this is comment618// */619// }620previousBase = base;621if (array[1][spaces] === '*') {622specialBase += ' ';623}624base = specialBase;625} else {626if (spaces & 1) {627// /*628// *629// */630// If spaces are odd number, above pattern is considered.631// We waste 1 space.632--spaces;633}634previousBase = base;635}636637for (i = 1, len = array.length; i < len; ++i) {638sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces)));639array[i] = sourceMap ? sn.join('') : sn;640}641642base = previousBase;643644return array.join('\n');645}646647function generateComment(comment, specialBase) {648if (comment.type === 'Line') {649if (endsWithLineTerminator(comment.value)) {650return '//' + comment.value;651} else {652// Always use LineTerminator653var result = '//' + comment.value;654if (!preserveBlankLines) {655result += '\n';656}657return result;658}659}660if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) {661return adjustMultilineComment('/*' + comment.value + '*/', specialBase);662}663return '/*' + comment.value + '*/';664}665666function addComments(stmt, result) {667var i, len, comment, save, tailingToStatement, specialBase, fragment,668extRange, range, prevRange, prefix, infix, suffix, count;669670if (stmt.leadingComments && stmt.leadingComments.length > 0) {671save = result;672673if (preserveBlankLines) {674comment = stmt.leadingComments[0];675result = [];676677extRange = comment.extendedRange;678range = comment.range;679680prefix = sourceCode.substring(extRange[0], range[0]);681count = (prefix.match(/\n/g) || []).length;682if (count > 0) {683result.push(stringRepeat('\n', count));684result.push(addIndent(generateComment(comment)));685} else {686result.push(prefix);687result.push(generateComment(comment));688}689690prevRange = range;691692for (i = 1, len = stmt.leadingComments.length; i < len; i++) {693comment = stmt.leadingComments[i];694range = comment.range;695696infix = sourceCode.substring(prevRange[1], range[0]);697count = (infix.match(/\n/g) || []).length;698result.push(stringRepeat('\n', count));699result.push(addIndent(generateComment(comment)));700701prevRange = range;702}703704suffix = sourceCode.substring(range[1], extRange[1]);705count = (suffix.match(/\n/g) || []).length;706result.push(stringRepeat('\n', count));707} else {708comment = stmt.leadingComments[0];709result = [];710if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) {711result.push('\n');712}713result.push(generateComment(comment));714if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {715result.push('\n');716}717718for (i = 1, len = stmt.leadingComments.length; i < len; ++i) {719comment = stmt.leadingComments[i];720fragment = [generateComment(comment)];721if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {722fragment.push('\n');723}724result.push(addIndent(fragment));725}726}727728result.push(addIndent(save));729}730731if (stmt.trailingComments) {732733if (preserveBlankLines) {734comment = stmt.trailingComments[0];735extRange = comment.extendedRange;736range = comment.range;737738prefix = sourceCode.substring(extRange[0], range[0]);739count = (prefix.match(/\n/g) || []).length;740741if (count > 0) {742result.push(stringRepeat('\n', count));743result.push(addIndent(generateComment(comment)));744} else {745result.push(prefix);746result.push(generateComment(comment));747}748} else {749tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());750specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString()));751for (i = 0, len = stmt.trailingComments.length; i < len; ++i) {752comment = stmt.trailingComments[i];753if (tailingToStatement) {754// We assume target like following script755//756// var t = 20; /**757// * This is comment of t758// */759if (i === 0) {760// first case761result = [result, indent];762} else {763result = [result, specialBase];764}765result.push(generateComment(comment, specialBase));766} else {767result = [result, addIndent(generateComment(comment))];768}769if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {770result = [result, '\n'];771}772}773}774}775776return result;777}778779function generateBlankLines(start, end, result) {780var j, newlineCount = 0;781782for (j = start; j < end; j++) {783if (sourceCode[j] === '\n') {784newlineCount++;785}786}787788for (j = 1; j < newlineCount; j++) {789result.push(newline);790}791}792793function parenthesize(text, current, should) {794if (current < should) {795return ['(', text, ')'];796}797return text;798}799800function generateVerbatimString(string) {801var i, iz, result;802result = string.split(/\r\n|\n/);803for (i = 1, iz = result.length; i < iz; i++) {804result[i] = newline + base + result[i];805}806return result;807}808809function generateVerbatim(expr, precedence) {810var verbatim, result, prec;811verbatim = expr[extra.verbatim];812813if (typeof verbatim === 'string') {814result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence);815} else {816// verbatim is object817result = generateVerbatimString(verbatim.content);818prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence;819result = parenthesize(result, prec, precedence);820}821822return toSourceNodeWhenNeeded(result, expr);823}824825function CodeGenerator() {826}827828// Helpers.829830CodeGenerator.prototype.maybeBlock = function(stmt, flags) {831var result, noLeadingComment, that = this;832833noLeadingComment = !extra.comment || !stmt.leadingComments;834835if (stmt.type === Syntax.BlockStatement && noLeadingComment) {836return [space, this.generateStatement(stmt, flags)];837}838839if (stmt.type === Syntax.EmptyStatement && noLeadingComment) {840return ';';841}842843withIndent(function () {844result = [845newline,846addIndent(that.generateStatement(stmt, flags))847];848});849850return result;851};852853CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) {854var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString());855if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) {856return [result, space];857}858if (ends) {859return [result, base];860}861return [result, newline, base];862};863864function generateIdentifier(node) {865return toSourceNodeWhenNeeded(node.name, node);866}867868function generateAsyncPrefix(node, spaceRequired) {869return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : '';870}871872function generateStarSuffix(node) {873var isGenerator = node.generator && !extra.moz.starlessGenerator;874return isGenerator ? '*' + space : '';875}876877function generateMethodPrefix(prop) {878var func = prop.value;879if (func.async) {880return generateAsyncPrefix(func, !prop.computed);881} else {882// avoid space before method name883return generateStarSuffix(func) ? '*' : '';884}885}886887CodeGenerator.prototype.generatePattern = function (node, precedence, flags) {888if (node.type === Syntax.Identifier) {889return generateIdentifier(node);890}891return this.generateExpression(node, precedence, flags);892};893894CodeGenerator.prototype.generateFunctionParams = function (node) {895var i, iz, result, hasDefault;896897hasDefault = false;898899if (node.type === Syntax.ArrowFunctionExpression &&900!node.rest && (!node.defaults || node.defaults.length === 0) &&901node.params.length === 1 && node.params[0].type === Syntax.Identifier) {902// arg => { } case903result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])];904} else {905result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : [];906result.push('(');907if (node.defaults) {908hasDefault = true;909}910for (i = 0, iz = node.params.length; i < iz; ++i) {911if (hasDefault && node.defaults[i]) {912// Handle default values.913result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT));914} else {915result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT));916}917if (i + 1 < iz) {918result.push(',' + space);919}920}921922if (node.rest) {923if (node.params.length) {924result.push(',' + space);925}926result.push('...');927result.push(generateIdentifier(node.rest));928}929930result.push(')');931}932933return result;934};935936CodeGenerator.prototype.generateFunctionBody = function (node) {937var result, expr;938939result = this.generateFunctionParams(node);940941if (node.type === Syntax.ArrowFunctionExpression) {942result.push(space);943result.push('=>');944}945946if (node.expression) {947result.push(space);948expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT);949if (expr.toString().charAt(0) === '{') {950expr = ['(', expr, ')'];951}952result.push(expr);953} else {954result.push(this.maybeBlock(node.body, S_TTFF));955}956957return result;958};959960CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) {961var result = ['for' + space + '('], that = this;962withIndent(function () {963if (stmt.left.type === Syntax.VariableDeclaration) {964withIndent(function () {965result.push(stmt.left.kind + noEmptySpace());966result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF));967});968} else {969result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));970}971972result = join(result, operator);973result = [join(974result,975that.generateExpression(stmt.right, Precedence.Sequence, E_TTT)976), ')'];977});978result.push(this.maybeBlock(stmt.body, flags));979return result;980};981982CodeGenerator.prototype.generatePropertyKey = function (expr, computed) {983var result = [];984985if (computed) {986result.push('[');987}988989result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT));990if (computed) {991result.push(']');992}993994return result;995};996997CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) {998if (Precedence.Assignment < precedence) {999flags |= F_ALLOW_IN;1000}10011002return parenthesize(1003[1004this.generateExpression(left, Precedence.Call, flags),1005space + operator + space,1006this.generateExpression(right, Precedence.Assignment, flags)1007],1008Precedence.Assignment,1009precedence1010);1011};10121013CodeGenerator.prototype.semicolon = function (flags) {1014if (!semicolons && flags & F_SEMICOLON_OPT) {1015return '';1016}1017return ';';1018};10191020// Statements.10211022CodeGenerator.Statement = {10231024BlockStatement: function (stmt, flags) {1025var range, content, result = ['{', newline], that = this;10261027withIndent(function () {1028// handle functions without any code1029if (stmt.body.length === 0 && preserveBlankLines) {1030range = stmt.range;1031if (range[1] - range[0] > 2) {1032content = sourceCode.substring(range[0] + 1, range[1] - 1);1033if (content[0] === '\n') {1034result = ['{'];1035}1036result.push(content);1037}1038}10391040var i, iz, fragment, bodyFlags;1041bodyFlags = S_TFFF;1042if (flags & F_FUNC_BODY) {1043bodyFlags |= F_DIRECTIVE_CTX;1044}10451046for (i = 0, iz = stmt.body.length; i < iz; ++i) {1047if (preserveBlankLines) {1048// handle spaces before the first line1049if (i === 0) {1050if (stmt.body[0].leadingComments) {1051range = stmt.body[0].leadingComments[0].extendedRange;1052content = sourceCode.substring(range[0], range[1]);1053if (content[0] === '\n') {1054result = ['{'];1055}1056}1057if (!stmt.body[0].leadingComments) {1058generateBlankLines(stmt.range[0], stmt.body[0].range[0], result);1059}1060}10611062// handle spaces between lines1063if (i > 0) {1064if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {1065generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);1066}1067}1068}10691070if (i === iz - 1) {1071bodyFlags |= F_SEMICOLON_OPT;1072}10731074if (stmt.body[i].leadingComments && preserveBlankLines) {1075fragment = that.generateStatement(stmt.body[i], bodyFlags);1076} else {1077fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags));1078}10791080result.push(fragment);1081if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {1082if (preserveBlankLines && i < iz - 1) {1083// don't add a new line if there are leading coments1084// in the next statement1085if (!stmt.body[i + 1].leadingComments) {1086result.push(newline);1087}1088} else {1089result.push(newline);1090}1091}10921093if (preserveBlankLines) {1094// handle spaces after the last line1095if (i === iz - 1) {1096if (!stmt.body[i].trailingComments) {1097generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);1098}1099}1100}1101}1102});11031104result.push(addIndent('}'));1105return result;1106},11071108BreakStatement: function (stmt, flags) {1109if (stmt.label) {1110return 'break ' + stmt.label.name + this.semicolon(flags);1111}1112return 'break' + this.semicolon(flags);1113},11141115ContinueStatement: function (stmt, flags) {1116if (stmt.label) {1117return 'continue ' + stmt.label.name + this.semicolon(flags);1118}1119return 'continue' + this.semicolon(flags);1120},11211122ClassBody: function (stmt, flags) {1123var result = [ '{', newline], that = this;11241125withIndent(function (indent) {1126var i, iz;11271128for (i = 0, iz = stmt.body.length; i < iz; ++i) {1129result.push(indent);1130result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT));1131if (i + 1 < iz) {1132result.push(newline);1133}1134}1135});11361137if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {1138result.push(newline);1139}1140result.push(base);1141result.push('}');1142return result;1143},11441145ClassDeclaration: function (stmt, flags) {1146var result, fragment;1147result = ['class ' + stmt.id.name];1148if (stmt.superClass) {1149fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Assignment, E_TTT));1150result = join(result, fragment);1151}1152result.push(space);1153result.push(this.generateStatement(stmt.body, S_TFFT));1154return result;1155},11561157DirectiveStatement: function (stmt, flags) {1158if (extra.raw && stmt.raw) {1159return stmt.raw + this.semicolon(flags);1160}1161return escapeDirective(stmt.directive) + this.semicolon(flags);1162},11631164DoWhileStatement: function (stmt, flags) {1165// Because `do 42 while (cond)` is Syntax Error. We need semicolon.1166var result = join('do', this.maybeBlock(stmt.body, S_TFFF));1167result = this.maybeBlockSuffix(stmt.body, result);1168return join(result, [1169'while' + space + '(',1170this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),1171')' + this.semicolon(flags)1172]);1173},11741175CatchClause: function (stmt, flags) {1176var result, that = this;1177withIndent(function () {1178var guard;11791180result = [1181'catch' + space + '(',1182that.generateExpression(stmt.param, Precedence.Sequence, E_TTT),1183')'1184];11851186if (stmt.guard) {1187guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT);1188result.splice(2, 0, ' if ', guard);1189}1190});1191result.push(this.maybeBlock(stmt.body, S_TFFF));1192return result;1193},11941195DebuggerStatement: function (stmt, flags) {1196return 'debugger' + this.semicolon(flags);1197},11981199EmptyStatement: function (stmt, flags) {1200return ';';1201},12021203ExportDeclaration: function (stmt, flags) {1204var result = [ 'export' ], bodyFlags, that = this;12051206bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF;12071208// export default HoistableDeclaration[Default]1209// export default AssignmentExpression[In] ;1210if (stmt['default']) {1211result = join(result, 'default');1212if (isStatement(stmt.declaration)) {1213result = join(result, this.generateStatement(stmt.declaration, bodyFlags));1214} else {1215result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));1216}1217return result;1218}12191220// export VariableStatement1221// export Declaration[Default]1222if (stmt.declaration) {1223return join(result, this.generateStatement(stmt.declaration, bodyFlags));1224}12251226// export * FromClause ;1227// export ExportClause[NoReference] FromClause ;1228// export ExportClause ;1229if (stmt.specifiers) {1230if (stmt.specifiers.length === 0) {1231result = join(result, '{' + space + '}');1232} else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {1233result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));1234} else {1235result = join(result, '{');1236withIndent(function (indent) {1237var i, iz;1238result.push(newline);1239for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) {1240result.push(indent);1241result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));1242if (i + 1 < iz) {1243result.push(',' + newline);1244}1245}1246});1247if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {1248result.push(newline);1249}1250result.push(base + '}');1251}12521253if (stmt.source) {1254result = join(result, [1255'from' + space,1256// ModuleSpecifier1257this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),1258this.semicolon(flags)1259]);1260} else {1261result.push(this.semicolon(flags));1262}1263}1264return result;1265},12661267ExpressionStatement: function (stmt, flags) {1268var result, fragment;12691270function isClassPrefixed(fragment) {1271var code;1272if (fragment.slice(0, 5) !== 'class') {1273return false;1274}1275code = fragment.charCodeAt(5);1276return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code);1277}12781279function isFunctionPrefixed(fragment) {1280var code;1281if (fragment.slice(0, 8) !== 'function') {1282return false;1283}1284code = fragment.charCodeAt(8);1285return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);1286}12871288function isAsyncPrefixed(fragment) {1289var code, i, iz;1290if (fragment.slice(0, 5) !== 'async') {1291return false;1292}1293if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) {1294return false;1295}1296for (i = 6, iz = fragment.length; i < iz; ++i) {1297if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) {1298break;1299}1300}1301if (i === iz) {1302return false;1303}1304if (fragment.slice(i, i + 8) !== 'function') {1305return false;1306}1307code = fragment.charCodeAt(i + 8);1308return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code);1309}13101311result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)];1312// 12.4 '{', 'function', 'class' is not allowed in this position.1313// wrap expression with parentheses1314fragment = toSourceNodeWhenNeeded(result).toString();1315if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression1316isClassPrefixed(fragment) ||1317isFunctionPrefixed(fragment) ||1318isAsyncPrefixed(fragment) ||1319(directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) {1320result = ['(', result, ')' + this.semicolon(flags)];1321} else {1322result.push(this.semicolon(flags));1323}1324return result;1325},13261327ImportDeclaration: function (stmt, flags) {1328// ES6: 15.2.1 valid import declarations:1329// - import ImportClause FromClause ;1330// - import ModuleSpecifier ;1331var result, cursor, that = this;13321333// If no ImportClause is present,1334// this should be `import ModuleSpecifier` so skip `from`1335// ModuleSpecifier is StringLiteral.1336if (stmt.specifiers.length === 0) {1337// import ModuleSpecifier ;1338return [1339'import',1340space,1341// ModuleSpecifier1342this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),1343this.semicolon(flags)1344];1345}13461347// import ImportClause FromClause ;1348result = [1349'import'1350];1351cursor = 0;13521353// ImportedBinding1354if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {1355result = join(result, [1356this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)1357]);1358++cursor;1359}13601361if (stmt.specifiers[cursor]) {1362if (cursor !== 0) {1363result.push(',');1364}13651366if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {1367// NameSpaceImport1368result = join(result, [1369space,1370this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)1371]);1372} else {1373// NamedImports1374result.push(space + '{');13751376if ((stmt.specifiers.length - cursor) === 1) {1377// import { ... } from "...";1378result.push(space);1379result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT));1380result.push(space + '}' + space);1381} else {1382// import {1383// ...,1384// ...,1385// } from "...";1386withIndent(function (indent) {1387var i, iz;1388result.push(newline);1389for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) {1390result.push(indent);1391result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT));1392if (i + 1 < iz) {1393result.push(',' + newline);1394}1395}1396});1397if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {1398result.push(newline);1399}1400result.push(base + '}' + space);1401}1402}1403}14041405result = join(result, [1406'from' + space,1407// ModuleSpecifier1408this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),1409this.semicolon(flags)1410]);1411return result;1412},14131414VariableDeclarator: function (stmt, flags) {1415var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT;1416if (stmt.init) {1417return [1418this.generateExpression(stmt.id, Precedence.Assignment, itemFlags),1419space,1420'=',1421space,1422this.generateExpression(stmt.init, Precedence.Assignment, itemFlags)1423];1424}1425return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags);1426},14271428VariableDeclaration: function (stmt, flags) {1429// VariableDeclarator is typed as Statement,1430// but joined with comma (not LineTerminator).1431// So if comment is attached to target node, we should specialize.1432var result, i, iz, node, bodyFlags, that = this;14331434result = [ stmt.kind ];14351436bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF;14371438function block() {1439node = stmt.declarations[0];1440if (extra.comment && node.leadingComments) {1441result.push('\n');1442result.push(addIndent(that.generateStatement(node, bodyFlags)));1443} else {1444result.push(noEmptySpace());1445result.push(that.generateStatement(node, bodyFlags));1446}14471448for (i = 1, iz = stmt.declarations.length; i < iz; ++i) {1449node = stmt.declarations[i];1450if (extra.comment && node.leadingComments) {1451result.push(',' + newline);1452result.push(addIndent(that.generateStatement(node, bodyFlags)));1453} else {1454result.push(',' + space);1455result.push(that.generateStatement(node, bodyFlags));1456}1457}1458}14591460if (stmt.declarations.length > 1) {1461withIndent(block);1462} else {1463block();1464}14651466result.push(this.semicolon(flags));14671468return result;1469},14701471ThrowStatement: function (stmt, flags) {1472return [join(1473'throw',1474this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)1475), this.semicolon(flags)];1476},14771478TryStatement: function (stmt, flags) {1479var result, i, iz, guardedHandlers;14801481result = ['try', this.maybeBlock(stmt.block, S_TFFF)];1482result = this.maybeBlockSuffix(stmt.block, result);14831484if (stmt.handlers) {1485// old interface1486for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {1487result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF));1488if (stmt.finalizer || i + 1 !== iz) {1489result = this.maybeBlockSuffix(stmt.handlers[i].body, result);1490}1491}1492} else {1493guardedHandlers = stmt.guardedHandlers || [];14941495for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {1496result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF));1497if (stmt.finalizer || i + 1 !== iz) {1498result = this.maybeBlockSuffix(guardedHandlers[i].body, result);1499}1500}15011502// new interface1503if (stmt.handler) {1504if (isArray(stmt.handler)) {1505for (i = 0, iz = stmt.handler.length; i < iz; ++i) {1506result = join(result, this.generateStatement(stmt.handler[i], S_TFFF));1507if (stmt.finalizer || i + 1 !== iz) {1508result = this.maybeBlockSuffix(stmt.handler[i].body, result);1509}1510}1511} else {1512result = join(result, this.generateStatement(stmt.handler, S_TFFF));1513if (stmt.finalizer) {1514result = this.maybeBlockSuffix(stmt.handler.body, result);1515}1516}1517}1518}1519if (stmt.finalizer) {1520result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]);1521}1522return result;1523},15241525SwitchStatement: function (stmt, flags) {1526var result, fragment, i, iz, bodyFlags, that = this;1527withIndent(function () {1528result = [1529'switch' + space + '(',1530that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT),1531')' + space + '{' + newline1532];1533});1534if (stmt.cases) {1535bodyFlags = S_TFFF;1536for (i = 0, iz = stmt.cases.length; i < iz; ++i) {1537if (i === iz - 1) {1538bodyFlags |= F_SEMICOLON_OPT;1539}1540fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags));1541result.push(fragment);1542if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {1543result.push(newline);1544}1545}1546}1547result.push(addIndent('}'));1548return result;1549},15501551SwitchCase: function (stmt, flags) {1552var result, fragment, i, iz, bodyFlags, that = this;1553withIndent(function () {1554if (stmt.test) {1555result = [1556join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),1557':'1558];1559} else {1560result = ['default:'];1561}15621563i = 0;1564iz = stmt.consequent.length;1565if (iz && stmt.consequent[0].type === Syntax.BlockStatement) {1566fragment = that.maybeBlock(stmt.consequent[0], S_TFFF);1567result.push(fragment);1568i = 1;1569}15701571if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {1572result.push(newline);1573}15741575bodyFlags = S_TFFF;1576for (; i < iz; ++i) {1577if (i === iz - 1 && flags & F_SEMICOLON_OPT) {1578bodyFlags |= F_SEMICOLON_OPT;1579}1580fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags));1581result.push(fragment);1582if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {1583result.push(newline);1584}1585}1586});1587return result;1588},15891590IfStatement: function (stmt, flags) {1591var result, bodyFlags, semicolonOptional, that = this;1592withIndent(function () {1593result = [1594'if' + space + '(',1595that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),1596')'1597];1598});1599semicolonOptional = flags & F_SEMICOLON_OPT;1600bodyFlags = S_TFFF;1601if (semicolonOptional) {1602bodyFlags |= F_SEMICOLON_OPT;1603}1604if (stmt.alternate) {1605result.push(this.maybeBlock(stmt.consequent, S_TFFF));1606result = this.maybeBlockSuffix(stmt.consequent, result);1607if (stmt.alternate.type === Syntax.IfStatement) {1608result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]);1609} else {1610result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags)));1611}1612} else {1613result.push(this.maybeBlock(stmt.consequent, bodyFlags));1614}1615return result;1616},16171618ForStatement: function (stmt, flags) {1619var result, that = this;1620withIndent(function () {1621result = ['for' + space + '('];1622if (stmt.init) {1623if (stmt.init.type === Syntax.VariableDeclaration) {1624result.push(that.generateStatement(stmt.init, S_FFFF));1625} else {1626// F_ALLOW_IN becomes false.1627result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT));1628result.push(';');1629}1630} else {1631result.push(';');1632}16331634if (stmt.test) {1635result.push(space);1636result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT));1637result.push(';');1638} else {1639result.push(';');1640}16411642if (stmt.update) {1643result.push(space);1644result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT));1645result.push(')');1646} else {1647result.push(')');1648}1649});16501651result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));1652return result;1653},16541655ForInStatement: function (stmt, flags) {1656return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);1657},16581659ForOfStatement: function (stmt, flags) {1660return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF);1661},16621663LabeledStatement: function (stmt, flags) {1664return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)];1665},16661667Program: function (stmt, flags) {1668var result, fragment, i, iz, bodyFlags;1669iz = stmt.body.length;1670result = [safeConcatenation && iz > 0 ? '\n' : ''];1671bodyFlags = S_TFTF;1672for (i = 0; i < iz; ++i) {1673if (!safeConcatenation && i === iz - 1) {1674bodyFlags |= F_SEMICOLON_OPT;1675}16761677if (preserveBlankLines) {1678// handle spaces before the first line1679if (i === 0) {1680if (!stmt.body[0].leadingComments) {1681generateBlankLines(stmt.range[0], stmt.body[i].range[0], result);1682}1683}16841685// handle spaces between lines1686if (i > 0) {1687if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) {1688generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result);1689}1690}1691}16921693fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags));1694result.push(fragment);1695if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {1696if (preserveBlankLines) {1697if (!stmt.body[i + 1].leadingComments) {1698result.push(newline);1699}1700} else {1701result.push(newline);1702}1703}17041705if (preserveBlankLines) {1706// handle spaces after the last line1707if (i === iz - 1) {1708if (!stmt.body[i].trailingComments) {1709generateBlankLines(stmt.body[i].range[1], stmt.range[1], result);1710}1711}1712}1713}1714return result;1715},17161717FunctionDeclaration: function (stmt, flags) {1718return [1719generateAsyncPrefix(stmt, true),1720'function',1721generateStarSuffix(stmt) || noEmptySpace(),1722generateIdentifier(stmt.id),1723this.generateFunctionBody(stmt)1724];1725},17261727ReturnStatement: function (stmt, flags) {1728if (stmt.argument) {1729return [join(1730'return',1731this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)1732), this.semicolon(flags)];1733}1734return ['return' + this.semicolon(flags)];1735},17361737WhileStatement: function (stmt, flags) {1738var result, that = this;1739withIndent(function () {1740result = [1741'while' + space + '(',1742that.generateExpression(stmt.test, Precedence.Sequence, E_TTT),1743')'1744];1745});1746result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));1747return result;1748},17491750WithStatement: function (stmt, flags) {1751var result, that = this;1752withIndent(function () {1753result = [1754'with' + space + '(',1755that.generateExpression(stmt.object, Precedence.Sequence, E_TTT),1756')'1757];1758});1759result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF));1760return result;1761}17621763};17641765merge(CodeGenerator.prototype, CodeGenerator.Statement);17661767// Expressions.17681769CodeGenerator.Expression = {17701771SequenceExpression: function (expr, precedence, flags) {1772var result, i, iz;1773if (Precedence.Sequence < precedence) {1774flags |= F_ALLOW_IN;1775}1776result = [];1777for (i = 0, iz = expr.expressions.length; i < iz; ++i) {1778result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags));1779if (i + 1 < iz) {1780result.push(',' + space);1781}1782}1783return parenthesize(result, Precedence.Sequence, precedence);1784},17851786AssignmentExpression: function (expr, precedence, flags) {1787return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags);1788},17891790ArrowFunctionExpression: function (expr, precedence, flags) {1791return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence);1792},17931794ConditionalExpression: function (expr, precedence, flags) {1795if (Precedence.Conditional < precedence) {1796flags |= F_ALLOW_IN;1797}1798return parenthesize(1799[1800this.generateExpression(expr.test, Precedence.LogicalOR, flags),1801space + '?' + space,1802this.generateExpression(expr.consequent, Precedence.Assignment, flags),1803space + ':' + space,1804this.generateExpression(expr.alternate, Precedence.Assignment, flags)1805],1806Precedence.Conditional,1807precedence1808);1809},18101811LogicalExpression: function (expr, precedence, flags) {1812return this.BinaryExpression(expr, precedence, flags);1813},18141815BinaryExpression: function (expr, precedence, flags) {1816var result, currentPrecedence, fragment, leftSource;1817currentPrecedence = BinaryPrecedence[expr.operator];18181819if (currentPrecedence < precedence) {1820flags |= F_ALLOW_IN;1821}18221823fragment = this.generateExpression(expr.left, currentPrecedence, flags);18241825leftSource = fragment.toString();18261827if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPart(expr.operator.charCodeAt(0))) {1828result = [fragment, noEmptySpace(), expr.operator];1829} else {1830result = join(fragment, expr.operator);1831}18321833fragment = this.generateExpression(expr.right, currentPrecedence + 1, flags);18341835if (expr.operator === '/' && fragment.toString().charAt(0) === '/' ||1836expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') {1837// If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start1838result.push(noEmptySpace());1839result.push(fragment);1840} else {1841result = join(result, fragment);1842}18431844if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) {1845return ['(', result, ')'];1846}1847return parenthesize(result, currentPrecedence, precedence);1848},18491850CallExpression: function (expr, precedence, flags) {1851var result, i, iz;1852// F_ALLOW_UNPARATH_NEW becomes false.1853result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)];1854result.push('(');1855for (i = 0, iz = expr['arguments'].length; i < iz; ++i) {1856result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));1857if (i + 1 < iz) {1858result.push(',' + space);1859}1860}1861result.push(')');18621863if (!(flags & F_ALLOW_CALL)) {1864return ['(', result, ')'];1865}1866return parenthesize(result, Precedence.Call, precedence);1867},18681869NewExpression: function (expr, precedence, flags) {1870var result, length, i, iz, itemFlags;1871length = expr['arguments'].length;18721873// F_ALLOW_CALL becomes false.1874// F_ALLOW_UNPARATH_NEW may become false.1875itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF;18761877result = join(1878'new',1879this.generateExpression(expr.callee, Precedence.New, itemFlags)1880);18811882if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) {1883result.push('(');1884for (i = 0, iz = length; i < iz; ++i) {1885result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT));1886if (i + 1 < iz) {1887result.push(',' + space);1888}1889}1890result.push(')');1891}18921893return parenthesize(result, Precedence.New, precedence);1894},18951896MemberExpression: function (expr, precedence, flags) {1897var result, fragment;18981899// F_ALLOW_UNPARATH_NEW becomes false.1900result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)];19011902if (expr.computed) {1903result.push('[');1904result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT));1905result.push(']');1906} else {1907if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') {1908fragment = toSourceNodeWhenNeeded(result).toString();1909// When the following conditions are all true,1910// 1. No floating point1911// 2. Don't have exponents1912// 3. The last character is a decimal digit1913// 4. Not hexadecimal OR octal number literal1914// we should add a floating point.1915if (1916fragment.indexOf('.') < 0 &&1917!/[eExX]/.test(fragment) &&1918esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) &&1919!(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0'1920) {1921result.push('.');1922}1923}1924result.push('.');1925result.push(generateIdentifier(expr.property));1926}19271928return parenthesize(result, Precedence.Member, precedence);1929},19301931UnaryExpression: function (expr, precedence, flags) {1932var result, fragment, rightCharCode, leftSource, leftCharCode;1933fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);19341935if (space === '') {1936result = join(expr.operator, fragment);1937} else {1938result = [expr.operator];1939if (expr.operator.length > 2) {1940// delete, void, typeof1941// get `typeof []`, not `typeof[]`1942result = join(result, fragment);1943} else {1944// Prevent inserting spaces between operator and argument if it is unnecessary1945// like, `!cond`1946leftSource = toSourceNodeWhenNeeded(result).toString();1947leftCharCode = leftSource.charCodeAt(leftSource.length - 1);1948rightCharCode = fragment.toString().charCodeAt(0);19491950if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) ||1951(esutils.code.isIdentifierPart(leftCharCode) && esutils.code.isIdentifierPart(rightCharCode))) {1952result.push(noEmptySpace());1953result.push(fragment);1954} else {1955result.push(fragment);1956}1957}1958}1959return parenthesize(result, Precedence.Unary, precedence);1960},19611962YieldExpression: function (expr, precedence, flags) {1963var result;1964if (expr.delegate) {1965result = 'yield*';1966} else {1967result = 'yield';1968}1969if (expr.argument) {1970result = join(1971result,1972this.generateExpression(expr.argument, Precedence.Yield, E_TTT)1973);1974}1975return parenthesize(result, Precedence.Yield, precedence);1976},19771978AwaitExpression: function (expr, precedence, flags) {1979var result = join(1980expr.delegate ? 'await*' : 'await',1981this.generateExpression(expr.argument, Precedence.Await, E_TTT)1982);1983return parenthesize(result, Precedence.Await, precedence);1984},19851986UpdateExpression: function (expr, precedence, flags) {1987if (expr.prefix) {1988return parenthesize(1989[1990expr.operator,1991this.generateExpression(expr.argument, Precedence.Unary, E_TTT)1992],1993Precedence.Unary,1994precedence1995);1996}1997return parenthesize(1998[1999this.generateExpression(expr.argument, Precedence.Postfix, E_TTT),2000expr.operator2001],2002Precedence.Postfix,2003precedence2004);2005},20062007FunctionExpression: function (expr, precedence, flags) {2008var result = [2009generateAsyncPrefix(expr, true),2010'function'2011];2012if (expr.id) {2013result.push(generateStarSuffix(expr) || noEmptySpace());2014result.push(generateIdentifier(expr.id));2015} else {2016result.push(generateStarSuffix(expr) || space);2017}2018result.push(this.generateFunctionBody(expr));2019return result;2020},20212022ExportBatchSpecifier: function (expr, precedence, flags) {2023return '*';2024},20252026ArrayPattern: function (expr, precedence, flags) {2027return this.ArrayExpression(expr, precedence, flags);2028},20292030ArrayExpression: function (expr, precedence, flags) {2031var result, multiline, that = this;2032if (!expr.elements.length) {2033return '[]';2034}2035multiline = expr.elements.length > 1;2036result = ['[', multiline ? newline : ''];2037withIndent(function (indent) {2038var i, iz;2039for (i = 0, iz = expr.elements.length; i < iz; ++i) {2040if (!expr.elements[i]) {2041if (multiline) {2042result.push(indent);2043}2044if (i + 1 === iz) {2045result.push(',');2046}2047} else {2048result.push(multiline ? indent : '');2049result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT));2050}2051if (i + 1 < iz) {2052result.push(',' + (multiline ? newline : space));2053}2054}2055});2056if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {2057result.push(newline);2058}2059result.push(multiline ? base : '');2060result.push(']');2061return result;2062},20632064ClassExpression: function (expr, precedence, flags) {2065var result, fragment;2066result = ['class'];2067if (expr.id) {2068result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));2069}2070if (expr.superClass) {2071fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Assignment, E_TTT));2072result = join(result, fragment);2073}2074result.push(space);2075result.push(this.generateStatement(expr.body, S_TFFT));2076return result;2077},20782079MethodDefinition: function (expr, precedence, flags) {2080var result, fragment;2081if (expr['static']) {2082result = ['static' + space];2083} else {2084result = [];2085}2086if (expr.kind === 'get' || expr.kind === 'set') {2087fragment = [2088join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),2089this.generateFunctionBody(expr.value)2090];2091} else {2092fragment = [2093generateMethodPrefix(expr),2094this.generatePropertyKey(expr.key, expr.computed),2095this.generateFunctionBody(expr.value)2096];2097}2098return join(result, fragment);2099},21002101Property: function (expr, precedence, flags) {2102if (expr.kind === 'get' || expr.kind === 'set') {2103return [2104expr.kind, noEmptySpace(),2105this.generatePropertyKey(expr.key, expr.computed),2106this.generateFunctionBody(expr.value)2107];2108}21092110if (expr.shorthand) {2111return this.generatePropertyKey(expr.key, expr.computed);2112}21132114if (expr.method) {2115return [2116generateMethodPrefix(expr),2117this.generatePropertyKey(expr.key, expr.computed),2118this.generateFunctionBody(expr.value)2119];2120}21212122return [2123this.generatePropertyKey(expr.key, expr.computed),2124':' + space,2125this.generateExpression(expr.value, Precedence.Assignment, E_TTT)2126];2127},21282129ObjectExpression: function (expr, precedence, flags) {2130var multiline, result, fragment, that = this;21312132if (!expr.properties.length) {2133return '{}';2134}2135multiline = expr.properties.length > 1;21362137withIndent(function () {2138fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT);2139});21402141if (!multiline) {2142// issues 42143// Do not transform from2144// dejavu.Class.declare({2145// method2: function () {}2146// });2147// to2148// dejavu.Class.declare({method2: function () {2149// }});2150if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) {2151return [ '{', space, fragment, space, '}' ];2152}2153}21542155withIndent(function (indent) {2156var i, iz;2157result = [ '{', newline, indent, fragment ];21582159if (multiline) {2160result.push(',' + newline);2161for (i = 1, iz = expr.properties.length; i < iz; ++i) {2162result.push(indent);2163result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));2164if (i + 1 < iz) {2165result.push(',' + newline);2166}2167}2168}2169});21702171if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {2172result.push(newline);2173}2174result.push(base);2175result.push('}');2176return result;2177},21782179ObjectPattern: function (expr, precedence, flags) {2180var result, i, iz, multiline, property, that = this;2181if (!expr.properties.length) {2182return '{}';2183}21842185multiline = false;2186if (expr.properties.length === 1) {2187property = expr.properties[0];2188if (property.value.type !== Syntax.Identifier) {2189multiline = true;2190}2191} else {2192for (i = 0, iz = expr.properties.length; i < iz; ++i) {2193property = expr.properties[i];2194if (!property.shorthand) {2195multiline = true;2196break;2197}2198}2199}2200result = ['{', multiline ? newline : '' ];22012202withIndent(function (indent) {2203var i, iz;2204for (i = 0, iz = expr.properties.length; i < iz; ++i) {2205result.push(multiline ? indent : '');2206result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT));2207if (i + 1 < iz) {2208result.push(',' + (multiline ? newline : space));2209}2210}2211});22122213if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) {2214result.push(newline);2215}2216result.push(multiline ? base : '');2217result.push('}');2218return result;2219},22202221ThisExpression: function (expr, precedence, flags) {2222return 'this';2223},22242225Identifier: function (expr, precedence, flags) {2226return generateIdentifier(expr);2227},22282229ImportDefaultSpecifier: function (expr, precedence, flags) {2230return generateIdentifier(expr.id);2231},22322233ImportNamespaceSpecifier: function (expr, precedence, flags) {2234var result = ['*'];2235if (expr.id) {2236result.push(space + 'as' + noEmptySpace() + generateIdentifier(expr.id));2237}2238return result;2239},22402241ImportSpecifier: function (expr, precedence, flags) {2242return this.ExportSpecifier(expr, precedence, flags);2243},22442245ExportSpecifier: function (expr, precedence, flags) {2246var result = [ expr.id.name ];2247if (expr.name) {2248result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(expr.name));2249}2250return result;2251},22522253Literal: function (expr, precedence, flags) {2254var raw;2255if (expr.hasOwnProperty('raw') && parse && extra.raw) {2256try {2257raw = parse(expr.raw).body[0].expression;2258if (raw.type === Syntax.Literal) {2259if (raw.value === expr.value) {2260return expr.raw;2261}2262}2263} catch (e) {2264// not use raw property2265}2266}22672268if (expr.value === null) {2269return 'null';2270}22712272if (typeof expr.value === 'string') {2273return escapeString(expr.value);2274}22752276if (typeof expr.value === 'number') {2277return generateNumber(expr.value);2278}22792280if (typeof expr.value === 'boolean') {2281return expr.value ? 'true' : 'false';2282}22832284return generateRegExp(expr.value);2285},22862287GeneratorExpression: function (expr, precedence, flags) {2288return this.ComprehensionExpression(expr, precedence, flags);2289},22902291ComprehensionExpression: function (expr, precedence, flags) {2292// GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...]2293// Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES622942295var result, i, iz, fragment, that = this;2296result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['['];22972298if (extra.moz.comprehensionExpressionStartsWithAssignment) {2299fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);2300result.push(fragment);2301}23022303if (expr.blocks) {2304withIndent(function () {2305for (i = 0, iz = expr.blocks.length; i < iz; ++i) {2306fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);2307if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {2308result = join(result, fragment);2309} else {2310result.push(fragment);2311}2312}2313});2314}23152316if (expr.filter) {2317result = join(result, 'if' + space);2318fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);2319result = join(result, [ '(', fragment, ')' ]);2320}23212322if (!extra.moz.comprehensionExpressionStartsWithAssignment) {2323fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);23242325result = join(result, fragment);2326}23272328result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']');2329return result;2330},23312332ComprehensionBlock: function (expr, precedence, flags) {2333var fragment;2334if (expr.left.type === Syntax.VariableDeclaration) {2335fragment = [2336expr.left.kind, noEmptySpace(),2337this.generateStatement(expr.left.declarations[0], S_FFFF)2338];2339} else {2340fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);2341}23422343fragment = join(fragment, expr.of ? 'of' : 'in');2344fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));23452346return [ 'for' + space + '(', fragment, ')' ];2347},23482349SpreadElement: function (expr, precedence, flags) {2350return [2351'...',2352this.generateExpression(expr.argument, Precedence.Assignment, E_TTT)2353];2354},23552356TaggedTemplateExpression: function (expr, precedence, flags) {2357var itemFlags = E_TTF;2358if (!(flags & F_ALLOW_CALL)) {2359itemFlags = E_TFF;2360}2361var result = [2362this.generateExpression(expr.tag, Precedence.Call, itemFlags),2363this.generateExpression(expr.quasi, Precedence.Primary, E_FFT)2364];2365return parenthesize(result, Precedence.TaggedTemplate, precedence);2366},23672368TemplateElement: function (expr, precedence, flags) {2369// Don't use "cooked". Since tagged template can use raw template2370// representation. So if we do so, it breaks the script semantics.2371return expr.value.raw;2372},23732374TemplateLiteral: function (expr, precedence, flags) {2375var result, i, iz;2376result = [ '`' ];2377for (i = 0, iz = expr.quasis.length; i < iz; ++i) {2378result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT));2379if (i + 1 < iz) {2380result.push('${' + space);2381result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT));2382result.push(space + '}');2383}2384}2385result.push('`');2386return result;2387},23882389ModuleSpecifier: function (expr, precedence, flags) {2390return this.Literal(expr, precedence, flags);2391}23922393};23942395merge(CodeGenerator.prototype, CodeGenerator.Expression);23962397CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) {2398var result, type;23992400type = expr.type || Syntax.Property;24012402if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) {2403return generateVerbatim(expr, precedence);2404}24052406result = this[type](expr, precedence, flags);240724082409if (extra.comment) {2410result = addComments(expr,result);2411}2412return toSourceNodeWhenNeeded(result, expr);2413};24142415CodeGenerator.prototype.generateStatement = function (stmt, flags) {2416var result,2417fragment;24182419result = this[stmt.type](stmt, flags);24202421// Attach comments24222423if (extra.comment) {2424result = addComments(stmt, result);2425}24262427fragment = toSourceNodeWhenNeeded(result).toString();2428if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') {2429result = sourceMap ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, '');2430}24312432return toSourceNodeWhenNeeded(result, stmt);2433};24342435function generateInternal(node) {2436var codegen;24372438codegen = new CodeGenerator();2439if (isStatement(node)) {2440return codegen.generateStatement(node, S_TFFF);2441}24422443if (isExpression(node)) {2444return codegen.generateExpression(node, Precedence.Sequence, E_TTT);2445}24462447throw new Error('Unknown node type: ' + node.type);2448}24492450function generate(node, options) {2451var defaultOptions = getDefaultOptions(), result, pair;24522453if (options != null) {2454// Obsolete options2455//2456// `options.indent`2457// `options.base`2458//2459// Instead of them, we can use `option.format.indent`.2460if (typeof options.indent === 'string') {2461defaultOptions.format.indent.style = options.indent;2462}2463if (typeof options.base === 'number') {2464defaultOptions.format.indent.base = options.base;2465}2466options = updateDeeply(defaultOptions, options);2467indent = options.format.indent.style;2468if (typeof options.base === 'string') {2469base = options.base;2470} else {2471base = stringRepeat(indent, options.format.indent.base);2472}2473} else {2474options = defaultOptions;2475indent = options.format.indent.style;2476base = stringRepeat(indent, options.format.indent.base);2477}2478json = options.format.json;2479renumber = options.format.renumber;2480hexadecimal = json ? false : options.format.hexadecimal;2481quotes = json ? 'double' : options.format.quotes;2482escapeless = options.format.escapeless;2483newline = options.format.newline;2484space = options.format.space;2485if (options.format.compact) {2486newline = space = indent = base = '';2487}2488parentheses = options.format.parentheses;2489semicolons = options.format.semicolons;2490safeConcatenation = options.format.safeConcatenation;2491directive = options.directive;2492parse = json ? null : options.parse;2493sourceMap = options.sourceMap;2494sourceCode = options.sourceCode;2495preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null;2496extra = options;24972498if (sourceMap) {2499if (!exports.browser) {2500// We assume environment is node.js2501// And prevent from including source-map by browserify2502SourceNode = require('source-map').SourceNode;2503} else {2504SourceNode = global.sourceMap.SourceNode;2505}2506}25072508result = generateInternal(node);25092510if (!sourceMap) {2511pair = {code: result.toString(), map: null};2512return options.sourceMapWithCode ? pair : pair.code;2513}251425152516pair = result.toStringWithSourceMap({2517file: options.file,2518sourceRoot: options.sourceMapRoot2519});25202521if (options.sourceContent) {2522pair.map.setSourceContent(options.sourceMap,2523options.sourceContent);2524}25252526if (options.sourceMapWithCode) {2527return pair;2528}25292530return pair.map.toString();2531}25322533FORMAT_MINIFY = {2534indent: {2535style: '',2536base: 02537},2538renumber: true,2539hexadecimal: true,2540quotes: 'auto',2541escapeless: true,2542compact: true,2543parentheses: false,2544semicolons: false2545};25462547FORMAT_DEFAULTS = getDefaultOptions().format;25482549exports.version = require('./package.json').version;2550exports.generate = generate;2551exports.attachComments = estraverse.attachComments;2552exports.Precedence = updateDeeply({}, Precedence);2553exports.browser = false;2554exports.FORMAT_MINIFY = FORMAT_MINIFY;2555exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS;2556}());2557/* vim: set sw=4 ts=4 et tw=80 : */255825592560