diff --git a/lib/xjst/compiler/helpers/inliner.js b/lib/xjst/compiler/helpers/inliner.js index e89be74..1ae4388 100644 --- a/lib/xjst/compiler/helpers/inliner.js +++ b/lib/xjst/compiler/helpers/inliner.js @@ -27,6 +27,43 @@ Inliner.prototype.inline = function run(ast) { }; Inliner.prototype.enter = function enter(node, parent) { + // while (...) (function() {})() + // for (...) (function() {})() + if ((node.type === 'WhileStatement' || + node.type === 'ForStatement') && + node.body.type === 'ExpressionStatement') { + var block = { type: 'BlockStatement', body: [ node.body ] }; + return { + type: node.type, + init: node.init, + test: node.test, + update: node.update, + body: block + }; + + // if (...) (function() {})() + } else if (node.type === 'IfStatement') { + var clone = { + type: node.type, + test: node.test, + consequent: node.consequent, + alternate: node.alternate + }; + + var change = false; + if (clone.consequent.type === 'ExpressionStatement') { + change = true; + clone.consequent = { type: 'BlockStatement', body: [ clone.consequent ] }; + } + if (clone.alternate && clone.alternate.type === 'ExpressionStatement') { + change = true; + clone.alternate = { type: 'BlockStatement', body: [ clone.alternate ] }; + } + + if (change) + return clone; + } + if (Array.isArray(node.body)) { this.blockHistory.push(node); this.lastBlock = node;