php-unparse
Version:
Unparse the AST produced by glayzzle/php-parser back to code.
1,700 lines (1,387 loc) • 45.5 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.phpUnparser = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var CodeGen = require('./node_translators');
module.exports = function (ast, opts) {
opts = opts || {};
var codeGen = new CodeGen(opts);
return codeGen.process(ast, '');
};
},{"./node_translators":37}],2:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen, elements, that, body, space;
codegen = this.process.bind(this);
that = this;
function processElement(indent) {
return function (ele) {
var value = codegen(ele.value, indent);
if (ele.key) {
return codegen(ele.key, indent) + that.ws + '=>' + that.ws + value;
}
return value;
};
}
elements = node.items.map(processElement(indent));
if (elements.join().length > 80) {
space = that.nl + indent + this.indent;
elements = node.items.map(processElement(indent + this.indent));
body = space + elements.join(',' + space) + that.nl + indent;
} else {
body = elements.join(',' + that.ws);
}
if (node.shortForm || this.shortArray) {
return '[' + body + ']';
}
return 'array(' + body + ')';
};
},{}],3:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return codegen(node.left, indent) + this.ws + node.operator + this.ws + codegen(node.right, indent);
};
},{}],4:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen, str, firstpart, secondpart;
codegen = this.process.bind(this);
firstpart = codegen(node.left, indent);
secondpart = codegen(node.right, indent);
str = firstpart + this.ws + node.type + this.ws + secondpart;
if (str.length > 80) {
str = firstpart + this.ws + node.type + this.nl + indent + this.indent + secondpart;
}
return str;
};
},{}],5:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
// block
module.exports = function (node, indent) {
var codegen, str = '';
codegen = this.process.bind(this);
str += this.nl + indent + '{' + this.nl;
str += doBody.call(this, codegen, indent, node.children);
str += indent + '}' + this.nl;
return str;
};
},{"./helper/body":31}],6:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
return node.value ? 'true' : 'false';
};
},{}],7:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
if (node.level) {
var codegen = this.process.bind(this);
return 'break ' + codegen(node.level, indent);
}
return 'break';
};
},{}],8:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var params = require('./helper/parameters');
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return codegen(node.what, indent) +
'(' + params(node.arguments, indent, this) + ')';
};
},{"./helper/parameters":33}],9:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen;
codegen = this.process.bind(this);
return '(' + node.type + ')' + codegen(node.what, indent);
};
},{}],10:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen, str, that;
codegen = this.process.bind(this);
str = '';
that = this;
// Start
if (node.isAbstract) {
str += 'abstract ';
} else if (node.isFinal) {
str += 'final ';
}
str += 'class';
if (node.name) {
str += ' ' + node.name;
}
if (node.extends) {
str += ' extends ' + codegen(node.extends, indent);
}
if (node.implements) {
str += ' implements ' + node.implements.map(function (x) {
return codegen(x, indent);
}).join(',' + that.ws);
}
// begin curly brace
if (node.name) {
if (this.options.bracketsNewLine) {
str += this.nl + indent + '{' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
} else {
str += this.ws + '{' + this.nl;
}
// class body
str += doBody.call(this, codegen, indent, node.body);
// end curly brace
str += indent + '}';
if (node.name) {
str += this.nl;
}
return str;
};
},{"./helper/body":31}],11:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
/**
* Constant declaration
*/
module.exports = function (node, indent) {
var codegen, str = '';
codegen = this.process.bind(this);
if (node.visibility) {
str += node.visibility + ' ';
}
str += 'const ';
str += node.name;
if (node.value) {
str += this.ws + '=' + this.ws;
str += codegen(node.value, indent);
}
return str;
};
},{}],12:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen;
codegen = this.process.bind(this);
return 'clone ' + codegen(node.what, indent);
};
},{}],13:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
var args = require('./helper/arguments');
var identifier = require('./helper/identifier');
// params, isRef, use, returnType
module.exports = function (node, indent) {
var codegen, str, useArgs;
codegen = this.process.bind(this);
// function header
str = 'function' + this.ws;
if (node.byref) {
str += '&';
}
str += args(node.arguments, indent, this);
// use statement
if (node.uses && node.uses.length > 0) {
useArgs = node.uses.map(function (arg) {
return (arg.byref ? '&$' : '$') + arg.name;
});
str += this.ws + 'use' + this.ws + '(' + useArgs.join(',' + this.ws) + ')';
}
// php7 / return type
if (node.type) {
str += this.ws + ':' + this.ws;
if (node.nullable) {
str += '?';
}
str += identifier(node.type);
}
str += this.ws + '{' + this.nl;
str += doBody.call(this, codegen, indent, node.body.children);
str += indent + '}';
return str;
};
},{"./helper/arguments":30,"./helper/body":31,"./helper/identifier":32}],14:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
/**
* Constant declaration
*/
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
// a namespace constant (name, value)
str = 'const ';
str += node.name;
str += this.ws + '=' + this.ws;
str += codegen(node.value, indent);
return str;
};
},{}],15:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var identifier = require('./helper/identifier');
/**
* Constant usage
*/
module.exports = function (node) {
if (typeof node.name === 'string') {
return identifier(node);
}
return identifier(node.name);
};
},{"./helper/identifier":32}],16:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
if (node.level) {
return 'continue ' + codegen(node.level, indent);
}
return 'continue';
};
},{}],17:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen, str, items = [], k;
codegen = this.process.bind(this);
for (k in node.what) {
if (node.what.hasOwnProperty(k) && node.what[k]) {
items.push(k + this.ws + '=' + this.ws + codegen(node.what[k]));
}
}
str = 'declare(' + items.join(',' + this.ws) + ')';
if (node.mode !== 'none') {
str += this.ws + '{' + this.nl;
str += doBody.call(this, codegen, indent, node.children);
str += indent + '}' + this.nl;
} else {
str += ';' + this.nl;
str += doBody.call(this, codegen, indent, node.children, true);
}
return str;
};
},{"./helper/body":31}],18:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = 'do' + this.ws + '{' + this.nl;
str += doBody.call(this, codegen, indent, node.body.children);
str += indent + '}' + this.ws + 'while' + this.ws + '(' + codegen(node.test, indent) + ')';
return str;
};
},{"./helper/body":31}],19:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var self = this, union, body;
if (node.alreadyParsed) {
return '';
}
if (node.isDoc) {
body = node.lines.join(this.nl + indent + ' * ');
if (body.substring(body.length - 3) === ' * ') {
body = body.substring(0, body.length - 3);
}
return this.nl + indent + '/** ' + body + ' */';
}
union = self.nl + indent + self.ws + self.ws;
return node.lines.reduce(function (acc, line) {
if (line.indexOf('\n') > -1) {
return acc.concat('/*' + line.split("\n").join(union) + '*/');
}
return acc.concat('// ' + line);
}, []).join(self.nl + indent);
};
},{}],20:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var params = require('./helper/parameters');
module.exports = function (node, indent) {
var str = params(node.arguments, indent, this);
if (node.isInlineEcho) {
return str + this.ws + '?>';
}
return 'echo ' + str;
};
},{"./helper/parameters":33}],21:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'empty(' + codegen(node.arguments[0], indent) + ')';
};
},{}],22:[function(require,module,exports){
/*jslint node: true, indent: 2, unparam:true */
;
module.exports = function (node, indent, opt) {
var body = '', codegen = this.process.bind(this);
node.value.forEach(function (item) {
if (item.kind === 'string') {
body += item.value;
} else {
body += '{' + codegen(item, indent) + '}';
}
});
if (node.type === 'heredoc') {
return '<<<' + node.label + this.nl + body + node.label;
}
if (node.type === 'nowdoc') {
return '<<<\'' + node.label + '\'' + this.nl + body + node.label;
}
if (node.type === 'shell') {
return '`' + body + '`';
}
if (node.isDoubleQuote) {
return '"' + body + '"';
}
return '\'' + body + '\'';
};
},{}],23:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'eval(' + codegen(node.source, indent) + ')';
};
},{}],24:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
/**
* Exit statement
*/
module.exports = function (node, indent) {
var codegen;
codegen = this.process.bind(this);
if (node.status === null) {
return 'exit';
}
return 'exit(' + codegen(node.status, indent) + ')';
};
},{}],25:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = 'for' + this.ws + '(';
if (node.init) {
str += node.init.map(function (x) {
if (x) {
return codegen(x, indent);
}
return '';
}).join(',' + this.ws);
}
str += ';' + this.ws;
if (node.test) {
str += node.test.map(function (x) {
if (x) {
return codegen(x, indent);
}
return '';
}).join(',' + this.ws);
}
str += ';' + this.ws;
if (node.increment) {
str += node.increment.map(function (x) {
if (x) {
return codegen(x, indent);
}
return '';
}).join(',' + this.ws);
}
str += ')';
if (this.shortForm) {
str += ':' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
str += doBody.call(this, codegen, indent, node.body.children || [node.body]);
if (this.shortForm) {
str += indent + 'endfor;';
} else {
str += indent + '}';
}
return str;
};
},{"./helper/body":31}],26:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = 'foreach' + this.ws + '(' + codegen(node.source, indent) + this.ws + 'as' + this.ws;
if (node.key) {
str += codegen(node.key, indent) + this.ws + '=>' + this.ws;
}
str += codegen(node.value, indent) + ')';
if (node.shortForm) {
str += ':' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
str += doBody.call(this, codegen, indent, node.body.children || [node.body]);
if (node.shortForm) {
str += indent + 'endforeach;';
} else {
str += indent + '}';
}
return str;
};
},{"./helper/body":31}],27:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
var args = require('./helper/arguments');
var identifier = require('./helper/identifier');
// name, params, isRef, returnType, body
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = 'function ';
if (node.byref) {
str += '&';
}
str += node.name;
str += args(node.arguments, indent, this);
// php7 / return type
if (node.type) {
str += this.ws + ':' + this.ws;
if (node.nullable) {
str += '?';
}
str += identifier(node.type);
}
if (this.options.bracketsNewLine) {
str += this.nl + indent + '{' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
str += doBody.call(this, codegen, indent, node.body.children);
str += indent + '}' + this.nl;
return str;
};
},{"./helper/arguments":30,"./helper/body":31,"./helper/identifier":32}],28:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'global ' + node.items.map(function (x) {
return codegen(x, indent);
}).join(',' + this.ws);
};
},{}],29:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
return 'goto ' + node.label;
};
},{}],30:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
// name, type, value, isRef, isVariadic
function processElement(indent, ws, codegen) {
return function (arg) {
var str = '';
if (arg.nullable) {
str += '?';
}
if (arg.type) { // type hint
str += codegen(arg.type, indent) + ws;
}
if (arg.byref) { // byref
str += '&';
}
if (arg.variadic) { // variadic
str += '...';
}
str += '$' + arg.name; // name
if (arg.value) { // default value
str += ws + '=' + ws + codegen(arg.value, indent);
}
return str;
};
}
module.exports = function (nodes, indent, self) {
var codegen, args, space, listArgs;
codegen = self.process.bind(self);
args = nodes.map(processElement(indent, self.ws, codegen));
listArgs = args.join(',' + self.ws);
if (listArgs.length > 80) {
space = self.nl + indent + self.indent;
args = nodes.map(processElement(indent + self.indent, self.ws, codegen));
listArgs = space + args.join(',' + space) + self.nl + indent;
}
return '(' + listArgs + ')';
};
},{}],31:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var noSemiColons = [
'class', 'interface', 'trait', 'namespace', 'try',
'if', 'switch', 'for', 'foreach', 'function', 'method',
'while', 'doc', 'comment', 'label', 'declare',
'usegroup', 'traituse', 'inline', 'block'
];
module.exports = function (codegen, currentIndent, body, isProgram, dontIncreaseIndent) {
var str = '', expr, i, indentation, delimiter, that = this, line, next, after, dontUseNewLine, isInlineEcho;
// Set the rows delimiter
delimiter = that.options.collapseEmptyLines ? '' : '\n';
// Set the indentation
if (dontIncreaseIndent) {
indentation = currentIndent;
} else {
indentation = isProgram ? '' : currentIndent + that.indent;
}
// Force body as an array
if (!Array.isArray(body)) {
body = [body];
}
for (i = 0; i < body.length; i += 1) {
expr = body[i];
next = body[i + 1] || {};
after = body[i + 2] || {};
// Return empty string
if (expr !== null) {
/**
* If this expression is an inline, the next is an echo, and the one after
* is another expression inline, treat it as an inline echo
*/
if (expr.kind === 'inline' && next.kind === 'echo' && after.kind === 'inline') {
expr.isInlineEcho = true;
next.isInlineEcho = true;
after.omitClosingTag = true;
dontUseNewLine = true;
}
// Is this expr the echo of an inline echo?
isInlineEcho = expr.kind === 'echo' && expr.isInlineEcho === true;
if (expr.kind === 'label' || isInlineEcho || expr.omitClosingTag) {
line = codegen(expr, indentation);
} else {
line = indentation + codegen(expr, indentation);
}
// This expressions don't require semicolons
if (noSemiColons.indexOf(expr.kind) === -1 && !isInlineEcho) {
line += ';';
}
// Check if the next expression is a comment that should be
// on the same line as this expression
if (next.kind === 'doc' && next.loc && expr.loc && next.loc.start.line === expr.loc.start.line) {
line += that.ws + codegen(next, '').trim();
next.alreadyParsed = true; // prevent to parse again the comment
}
str += line;
if (!dontUseNewLine && !isInlineEcho) {
str += that.nl + delimiter;
}
}
}
// Return the generated string
return str;
};
},{}],32:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function identifier(id) {
if (id.resolution === 'rn') {
return 'namespace\\' + id.name;
}
return id.name;
};
},{}],33:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (args, indent, self) {
var codegen, useArgs = [], space, raw;
codegen = self.process.bind(self);
function processElement(indent) {
return function (arg) {
return codegen(arg, indent);
};
}
if (args && args.length > 0) {
useArgs = args.map(processElement(indent));
}
raw = useArgs.join();
if ((raw.indexOf("\n") > -1 && raw.substr(0, raw.indexOf("\n")).length > 80) || (raw.indexOf("\n") === -1 && raw.length > 80)) {
useArgs = args.map(processElement(indent + self.indent));
space = self.nl + indent + self.indent;
args = space + useArgs.join(',' + space) + self.nl + indent;
} else {
args = useArgs.join(',' + self.ws);
}
return args;
};
},{}],34:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
if (node.resolution === 'rn') {
return 'namespace\\' + node.name;
}
return node.name;
};
},{}],35:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function processIf(node, indent, inner) {
var codegen, str, that = this;
codegen = this.process.bind(this);
str = 'if' + this.ws + '(' + codegen(node.test, indent) + ')';
if (node.body) {
if (node.shortForm) {
str += ':' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
str += doBody.call(this, codegen, indent, node.body.children || [node.body]);
if (!node.shortForm) {
str += indent + '}';
}
} else if (!node.alternate) {
return str + ';';
}
if (node.alternate) {
str += (function () {
var out = '';
// is an "elseif"
if (node.alternate.kind === 'if') {
if (node.shortForm) {
return indent + 'else' + processIf.call(that, node.alternate, indent, true);
}
return that.ws + 'else' + processIf.call(that, node.alternate, indent, true);
}
// is an "else"
if (node.shortForm) {
out += indent + 'else:' + that.nl;
} else {
out += that.ws + 'else' + that.ws + '{' + that.nl;
}
out += doBody.call(that, codegen, indent, node.alternate.children || [node.alternate]);
if (!node.shortForm) {
out += indent + '}' + that.nl;
}
return out;
}());
}
if (node.shortForm && !inner) {
str += indent + 'endif;' + this.nl;
}
return str;
};
},{"./helper/body":31}],36:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var str, codegen;
str = node.require ? 'require' : 'include';
if (node.once) {
str += '_once';
}
codegen = this.process.bind(this);
return str + ' ' + codegen(node.target, indent);
};
},{}],37:[function(require,module,exports){
/*jslint node: true, indent: 2, nomen:true, evil: true */
;
var defaults = {
indent: ' ',
dontUseWhitespaces: false,
shortArray: false,
bracketsNewLine: true,
forceNamespaceBrackets: false,
collapseEmptyLines: true
};
function CodeGen(options) {
// Get options
this.options = Object.assign({}, defaults, options);
this.ws = this.options.dontUseWhitespaces ? '' : ' ';
this.indent = typeof this.options.indent === 'string' ? this.options.indent : ' ';
this.nl = this.indent !== '' ? '\n' : '';
this.shortArray = this.options.shortArray || false;
this.forceNamespaceBrackets = this.options.forceNamespaceBrackets || false;
this.process = function (node, indent) {
var err;
if (node === null) {
return indent;
}
if (node && node.kind) {
if (typeof this[node.kind] === 'function') {
return this[node.kind](node, indent);
}
err = new Error(
'Unhandled node type [' + node.kind + ']' + (
node.loc ? ' at line ' + node.loc.start.line : ''
)
);
} else {
console.log('Node:', node);
console.log('Node kind:', node.kind);
err = new Error('Bad AST structure');
}
err.node = node;
throw err;
};
}
module.exports = CodeGen;
// node translators
CodeGen.prototype.array = require("./array.js");
CodeGen.prototype.assign = require("./assign.js");
CodeGen.prototype.bin = require("./bin.js");
CodeGen.prototype.block = require("./block.js");
CodeGen.prototype.boolean = require("./boolean.js");
CodeGen.prototype.break = require("./break.js");
CodeGen.prototype.call = require("./call.js");
CodeGen.prototype.cast = require("./cast.js");
CodeGen.prototype.classconstant = require("./classconstant.js");
CodeGen.prototype.class = require("./class.js");
CodeGen.prototype.clone = require("./clone.js");
CodeGen.prototype.closure = require("./closure.js");
CodeGen.prototype.constant = require("./constant.js");
CodeGen.prototype.constref = require("./constref.js");
CodeGen.prototype.continue = require("./continue.js");
CodeGen.prototype.declare = require("./declare.js");
CodeGen.prototype.doc = require("./doc.js");
CodeGen.prototype.do = require("./do.js");
CodeGen.prototype.echo = require("./echo.js");
CodeGen.prototype.empty = require("./empty.js");
CodeGen.prototype.encapsed = require("./encapsed.js");
CodeGen.prototype.eval = require("./eval.js");
CodeGen.prototype.exit = require("./exit.js");
CodeGen.prototype.foreach = require("./foreach.js");
CodeGen.prototype.for = require("./for.js");
CodeGen.prototype.function = require("./function.js");
CodeGen.prototype.global = require("./global.js");
CodeGen.prototype.goto = require("./goto.js");
CodeGen.prototype.identifier = require("./identifier.js");
CodeGen.prototype.if = require("./if.js");
CodeGen.prototype.include = require("./include.js");
CodeGen.prototype.inline = require("./inline.js");
CodeGen.prototype.interface = require("./interface.js");
CodeGen.prototype.isset = require("./isset.js");
CodeGen.prototype.label = require("./label.js");
CodeGen.prototype.list = require("./list.js");
CodeGen.prototype.magic = require("./magic.js");
CodeGen.prototype.method = require("./method.js");
CodeGen.prototype.namespace = require("./namespace.js");
CodeGen.prototype.new = require("./new.js");
CodeGen.prototype.nowdoc = require("./nowdoc.js");
CodeGen.prototype.number = require("./number.js");
CodeGen.prototype.offsetlookup = require("./offsetlookup.js");
CodeGen.prototype.parenthesis = require("./parenthesis.js");
CodeGen.prototype.post = require("./post.js");
CodeGen.prototype.pre = require("./pre.js");
CodeGen.prototype.print = require("./print.js");
CodeGen.prototype.program = require("./program.js");
CodeGen.prototype.property = require("./property.js");
CodeGen.prototype.propertylookup = require("./propertylookup.js");
CodeGen.prototype.retif = require("./retif.js");
CodeGen.prototype.return = require("./return.js");
CodeGen.prototype.silent = require("./silent.js");
CodeGen.prototype.static = require("./static.js");
CodeGen.prototype.staticlookup = require("./staticlookup.js");
CodeGen.prototype.string = require("./string.js");
CodeGen.prototype.switch = require("./switch.js");
CodeGen.prototype.throw = require("./throw.js");
CodeGen.prototype.trait = require("./trait.js");
CodeGen.prototype.traituse = require("./traituse.js");
CodeGen.prototype.try = require("./try.js");
CodeGen.prototype.unary = require("./unary.js");
CodeGen.prototype.unset = require("./unset.js");
CodeGen.prototype.usegroup = require("./usegroup.js");
CodeGen.prototype.variable = require("./variable.js");
CodeGen.prototype.variadic = require("./variadic.js");
CodeGen.prototype.while = require("./while.js");
CodeGen.prototype.yieldfrom = require("./yieldfrom.js");
CodeGen.prototype.yield = require("./yield.js");
},{"./array.js":2,"./assign.js":3,"./bin.js":4,"./block.js":5,"./boolean.js":6,"./break.js":7,"./call.js":8,"./cast.js":9,"./class.js":10,"./classconstant.js":11,"./clone.js":12,"./closure.js":13,"./constant.js":14,"./constref.js":15,"./continue.js":16,"./declare.js":17,"./do.js":18,"./doc.js":19,"./echo.js":20,"./empty.js":21,"./encapsed.js":22,"./eval.js":23,"./exit.js":24,"./for.js":25,"./foreach.js":26,"./function.js":27,"./global.js":28,"./goto.js":29,"./identifier.js":34,"./if.js":35,"./include.js":36,"./inline.js":38,"./interface.js":39,"./isset.js":40,"./label.js":41,"./list.js":42,"./magic.js":43,"./method.js":44,"./namespace.js":45,"./new.js":46,"./nowdoc.js":47,"./number.js":48,"./offsetlookup.js":49,"./parenthesis.js":50,"./post.js":51,"./pre.js":52,"./print.js":53,"./program.js":54,"./property.js":55,"./propertylookup.js":56,"./retif.js":57,"./return.js":58,"./silent.js":59,"./static.js":60,"./staticlookup.js":61,"./string.js":62,"./switch.js":63,"./throw.js":64,"./trait.js":65,"./traituse.js":66,"./try.js":67,"./unary.js":68,"./unset.js":69,"./usegroup.js":70,"./variable.js":71,"./variadic.js":72,"./while.js":73,"./yield.js":74,"./yieldfrom.js":75}],38:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
var str;
str = node.omitClosingTag ? '' : '?>';
str += node.value;
if (node.isInlineEcho) {
return str + '<?=' + this.ws;
}
return str + (node.isLast ? '' : '<?php' + this.nl);
};
},{}],39:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
var identifier = require('./helper/identifier');
module.exports = function (node, indent) {
var codegen, str = '';
codegen = this.process.bind(this);
// Start
if (node.isFinal) {
str = 'final ';
}
str += 'interface ' + node.name;
if (node.extends) {
str += ' extends ' + node.extends.map(identifier).join(',' + this.ws);
}
// begin curly brace
if (this.options.bracketsNewLine) {
str += this.nl + indent + '{' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
// interface body
str += doBody.call(this, codegen, indent, node.body);
// end curly brace
str += indent + '}\n';
return str;
};
},{"./helper/body":31,"./helper/identifier":32}],40:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var params = require('./helper/parameters');
module.exports = function (node, indent) {
return 'isset(' + params(node.arguments, indent, this) + ')';
};
},{"./helper/parameters":33}],41:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
return node.name + ':';
};
},{}],42:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var params = require('./helper/parameters');
module.exports = function (node, indent) {
return 'list(' + params(node.arguments, indent, this) + ')';
};
},{"./helper/parameters":33}],43:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
return node.value;
};
},{}],44:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
var args = require('./helper/arguments');
var identifier = require('./helper/identifier');
// name, params, isRef, returnType, body, flags
module.exports = function (node, indent) {
var codegen, str = '';
if (node.isAbstract) {
str += 'abstract ';
}
if (node.isFinal) {
str += 'final ';
}
if (node.isStatic) {
str += 'static ';
}
// Fall back to public if nothing is specified
if (!node.visibility) {
node.visibility = 'public';
}
str += node.visibility + ' function ';
if (node.byref) {
str += '&';
}
str += node.name;
str += args(node.arguments, indent, this);
// php7 / return type
if (node.type) {
str += this.ws + ':' + this.ws;
if (node.nullable) {
str += '?';
}
str += identifier(node.type);
}
// It lacks body. Must be an abstract method declaration.
if (node.isAbstract || !node.body) {
return str + ';';
}
codegen = this.process.bind(this);
if (this.options.bracketsNewLine) {
str += this.nl + indent + '{' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
str += doBody.call(this, codegen, indent, node.body.children);
str += indent + '}';
return str;
};
},{"./helper/arguments":30,"./helper/body":31,"./helper/identifier":32}],45:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var str, codegen;
str = 'namespace ' + node.name + this.ws + '\n{\n\n';
codegen = this.process.bind(this);
str += doBody.call(this, codegen, indent, node.children);
str += '}';
return str;
};
},{"./helper/body":31}],46:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var params = require('./helper/parameters');
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = codegen(node.what, indent);
if (node.what.kind !== 'class') {
str += '(';
if (node.arguments && node.arguments.length > 0) {
str += params(node.arguments, indent, this);
}
str += ')';
}
return 'new ' + str;
};
},{"./helper/parameters":33}],47:[function(require,module,exports){
/*jslint node: true, indent: 2, unparam:true */
;
module.exports = function (node) {
return '<<<\'' + node.label + '\'' + this.nl + node.value + this.nl + node.label;
};
},{}],48:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node) {
return node.value.toString();
};
},{}],49:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen, offset;
codegen = this.process.bind(this);
offset = node.offset ? codegen(node.offset, indent) : '';
return codegen(node.what, indent) + '[' + offset + ']';
};
},{}],50:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return '(' + codegen(node.inner, indent) + ')';
};
},{}],51:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return codegen(node.what, indent) + node.type + node.type;
};
},{}],52:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return node.type + node.type + codegen(node.what, indent);
};
},{}],53:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'print ' + codegen(node.arguments, indent);
};
},{}],54:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node) {
if (!node.children || node.children.length === 0) {
return '';
}
var codegen = this.process.bind(this), str = '<?php' + this.nl;
if (node.children[0].kind === 'inline') {
str = '';
node.children[0].omitClosingTag = true;
}
// Is the last expression and an inline
if (node.children[node.children.length - 1].kind === 'inline') {
node.children[node.children.length - 1].isLast = true;
}
if (
!this.forceNamespaceBrackets &&
node.children.length === 1 &&
node.children[0].kind === 'namespace'
) {
return str + 'namespace ' + node.children[0].name + ';' +
this.nl + this.nl +
doBody.call(this, codegen, '', node.children[0].children, true);
}
return str + doBody.call(this, codegen, '', node.children, true);
};
},{"./helper/body":31}],55:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function property(node, indent) {
var codegen, str = '';
if (node.isFinal) {
str += 'final ';
}
if (node.isStatic) {
str += 'static ';
}
str += node.visibility;
str += ' $' + node.name;
if (node.value) {
codegen = this.process.bind(this);
str += ' = ' + codegen(node.value, indent);
}
return str;
};
},{}],56:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen, prop;
codegen = this.process.bind(this);
prop = (function () {
var child = node.offset;
if (child.kind === 'constref') {
return child.name;
}
if (child.kind === 'variable') {
return codegen(child, indent);
}
return '{' + codegen(child, indent) + '}';
}());
return codegen(node.what, indent) + '->' + prop;
};
},{}],57:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen, left, right = '';
codegen = this.process.bind(this);
if (node.trueExpr) {
left = codegen(node.trueExpr, indent);
}
if (node.falseExpr) {
right = codegen(node.falseExpr, indent);
}
return codegen(node.test, indent) + this.ws + '?' +
(left ? this.ws + left + this.ws : '') + ':' +
(right ? this.ws + right : '');
};
},{}],58:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen;
if (!node.expr) {
return 'return';
}
codegen = this.process.bind(this);
return 'return ' + codegen(node.expr, indent);
};
},{}],59:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return '@' + codegen(node.expr, indent);
};
},{}],60:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'static ' + node.items.map(function (x) {
return codegen(x, indent);
}).join(',' + this.ws);
};
},{}],61:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return codegen(node.what, indent) + '::' + codegen(node.offset, indent);
};
},{}],62:[function(require,module,exports){
/*jslint node: true, indent: 2, unparam:true */
;
module.exports = function (node, indent, opt) {
opt = opt || {};
if (opt.raw) {
return node.value;
}
return JSON.stringify(node.value).replace(/\$/g, '\\$');
};
},{}],63:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen, str, that = this, cases;
codegen = this.process.bind(this);
str = 'switch' + this.ws + '(' + codegen(node.test, indent) + ')';
if (node.shortForm) {
str += ':' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
cases = node.body.children.map(function (item) {
var head;
if (item.test) {
head = indent + that.indent + 'case ' + codegen(item.test, indent) + ':' + that.nl;
} else {
head = indent + that.indent + 'default:' + that.nl;
}
if (item.body) {
head += doBody.call(that, codegen, indent + that.indent, item.body.children || [item.body]);
}
return head;
});
str += cases.join('');
if (node.shortForm) {
str += indent + 'endswitch;';
} else {
str += indent + '}';
}
return str;
};
},{"./helper/body":31}],64:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'throw ' + codegen(node.what, indent);
};
},{}],65:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
var identifier = require('./helper/identifier');
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = 'trait ' + node.name;
if (node.extends) {
str += ' extends ' + identifier(node.extends);
}
if (node.implements) {
str += ' implements ' + node.implements.map(identifier).join(',' + this.ws);
}
// begin curly brace
if (this.options.bracketsNewLine) {
str += this.nl + indent + '{' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
// trait body
str += doBody.call(this, codegen, indent, node.body);
// end curly brace
str += indent + '}\n';
return str;
};
},{"./helper/body":31,"./helper/identifier":32}],66:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var identifier = require('./helper/identifier');
/**
* Usage declaration
*/
module.exports = function (node, indent) {
var str = 'use' + this.ws, items = [], glue, codegen;
codegen = this.process.bind(this);
node.traits.forEach(function (item) {
items.push(
codegen(item, indent)
);
});
str += items.join(',' + this.ws);
if (node.adaptations) {
glue = this.nl + indent + this.indent;
str += this.ws + '{' + glue;
str += node.adaptations.map(function (item) {
var out = '';
if (item.trait) {
out += codegen(item.trait, indent) + '::';
}
if (item.method) {
out += item.method;
}
if (item.kind === 'traitprecedence') {
out += ' insteadof ';// + codegen(item.insteadof);
out += item.instead.map(identifier).join(', ');
} else {
out += ' as ';
if (item.visibility) {
out += item.visibility + ' ';
}
out += item.as;
}
return out + ';';
}).join(glue) + this.nl;
str += indent + '}';
} else {
str += ';';
}
return str + this.nl;
};
},{"./helper/identifier":32}],67:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
var identifier = require('./helper/identifier');
function resolveExceptions(items) {
var result = [], i;
for (i = 0; i < items.length; i += 1) {
result.push(identifier(items[i]));
}
return result.join('|');
}
module.exports = function (node, indent) {
var codegen, str;
codegen = this.process.bind(this);
str = 'try' + this.ws + '{' + this.nl;
str += doBody.call(this, codegen, indent, node.body.children);
str += indent + '}';
str += node.catches.map(function (except) {
var out = this.ws + 'catch' + this.ws + '(' + resolveExceptions(except.what) + ' ' + codegen(except.variable) + ')' + this.ws + '{' + this.nl;
out += doBody.call(this, codegen, indent, except.body.children);
out += indent + '}';
return out;
}, this).join('');
if (node.always) {
str += this.ws + 'finally' + this.ws + '{' + this.nl;
str += doBody.call(this, codegen, indent, node.always.children);
str += indent + '}';
}
return str;
};
},{"./helper/body":31,"./helper/identifier":32}],68:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return node.type + codegen(node.what, indent);
};
},{}],69:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var params = require('./helper/parameters');
module.exports = function (node, indent) {
return 'unset(' + params(node.arguments, indent, this) + ')';
};
},{"./helper/parameters":33}],70:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
/**
* Usage declaration
*/
module.exports = function (node, indent) {
var str = 'use' + this.ws, items, glue;
if (node.type) {
str += node.type + this.ws;
}
items = (node.items || []).map(function (item) {
var useItem = item.name;
if (item.alias) {
useItem += ' as ' + item.alias;
}
return useItem;
});
if (node.items.length > 1) {
glue = this.nl + indent + this.indent;
str += node.name + this.ws + '{' + glue;
str += items.join(',' + glue) + this.nl;
str += indent + '};' + this.nl;
} else {
str += items[0] + ';' + this.nl;
}
return str;
};
},{}],71:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
if (typeof node.name !== 'string') {
var codegen = this.process.bind(this);
node.name = codegen(node.name, indent);
}
return (node.byref ? '&$' : '$') + node.name;
};
},{}],72:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return '...' + codegen(node.what, indent);
};
},{}],73:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
var doBody = require('./helper/body');
module.exports = function (node, indent) {
var codegen = this.process.bind(this), str;
str = 'while' + this.ws + '(' + codegen(node.test, indent) + ')';
if (!node.body) {
return str;
}
if (node.shortForm) {
str += ':' + this.nl;
} else {
str += this.ws + '{' + this.nl;
}
str += doBody.call(this, codegen, indent, node.body.children || [node.body]);
if (node.shortForm) {
str += indent + 'endwhile;';
} else {
str += indent + '}';
}
return str;
};
},{"./helper/body":31}],74:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen, str;
str = 'yield';
if (node.value) {
codegen = this.process.bind(this);
if (node.key) {
// yield $key => $value
str += ' ' + codegen(node.key, indent) + ' =>';
}
// yield $value
str += ' ' + codegen(node.value, indent);
}
return str;
};
},{}],75:[function(require,module,exports){
/*jslint node: true, indent: 2 */
;
module.exports = function (node, indent) {
var codegen = this.process.bind(this);
return 'yield from ' + codegen(node.value, indent);
};
},{}]},{},[1])(1)
});