diff --git a/core/generator.js b/core/generator.js index adacfbd08..81fdf1994 100644 --- a/core/generator.js +++ b/core/generator.js @@ -198,12 +198,11 @@ Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { } return [this.scrub_(block, code[0], opt_thisOnly), code[1]]; } else if (typeof code == 'string') { - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. if (this.STATEMENT_PREFIX) { - code = this.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\'') + code; + code = this.injectId(this.STATEMENT_PREFIX, block) + code; } if (this.STATEMENT_SUFFIX) { - code = code + this.STATEMENT_SUFFIX.replace(/%1/g, '\'' + id + '\''); + code = code + this.injectId(this.STATEMENT_SUFFIX, block); } return this.scrub_(block, code, opt_thisOnly); } else if (code === null) { @@ -315,26 +314,37 @@ Blockly.Generator.prototype.statementToCode = function(block, name) { * statement executes), and a statement prefix to the end of the loop block * (right before the loop statement executes). * @param {string} branch Code for loop contents. - * @param {string} id ID of enclosing block. + * @param {!Blockly.Block} block Enclosing block. * @return {string} Loop contents, with infinite loop trap added. */ -Blockly.Generator.prototype.addLoopTrap = function(branch, id) { - id = id.replace(/\$/g, '$$$$'); // Issue 251. +Blockly.Generator.prototype.addLoopTrap = function(branch, block) { if (this.INFINITE_LOOP_TRAP) { - branch = this.prefixLines(this.INFINITE_LOOP_TRAP.replace(/%1/g, - '\'' + id + '\''), this.INDENT) + branch; + branch = this.prefixLines(this.injectId(this.INFINITE_LOOP_TRAP, block), + this.INDENT) + branch; } if (this.STATEMENT_SUFFIX) { - branch = this.prefixLines(this.STATEMENT_SUFFIX.replace(/%1/g, - '\'' + id + '\''), this.INDENT) + branch; + branch = this.prefixLines(this.injectId(this.STATEMENT_SUFFIX, block), + this.INDENT) + branch; } if (this.STATEMENT_PREFIX) { - branch = branch + this.prefixLines(this.STATEMENT_PREFIX.replace(/%1/g, - '\'' + id + '\''), this.INDENT); + branch = branch + this.prefixLines(this.injectId(this.STATEMENT_PREFIX, + block), this.INDENT); } return branch; }; +/** + * Inject a block ID into a message to replace '%1'. + * Used for STATEMENT_PREFIX, STATEMENT_SUFFIX, and INFINITE_LOOP_TRAP. + * @param {string} msg Code snippet with '%1'. + * @param {!Blockly.Block} block Block which has an ID. + * @return {string} Code snippet with ID. + */ +Blockly.Generator.prototype.injectId = function(msg, block) { + var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. + return msg.replace(/%1/g, '\'' + id + '\''); +} + /** * Comma-separated list of reserved words. * @type {string} diff --git a/generators/dart/loops.js b/generators/dart/loops.js index 6c83a2fd5..c0d3bf9aa 100644 --- a/generators/dart/loops.js +++ b/generators/dart/loops.js @@ -40,7 +40,7 @@ Blockly.Dart['controls_repeat_ext'] = function(block) { Blockly.Dart.ORDER_ASSIGNMENT) || '0'; } var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); + branch = Blockly.Dart.addLoopTrap(branch, block); var code = ''; var loopVar = Blockly.Dart.variableDB_.getDistinctName( 'count', Blockly.Variables.NAME_TYPE); @@ -66,7 +66,7 @@ Blockly.Dart['controls_whileUntil'] = function(block) { until ? Blockly.Dart.ORDER_UNARY_PREFIX : Blockly.Dart.ORDER_NONE) || 'false'; var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); + branch = Blockly.Dart.addLoopTrap(branch, block); if (until) { argument0 = '!' + argument0; } @@ -84,7 +84,7 @@ Blockly.Dart['controls_for'] = function(block) { var increment = Blockly.Dart.valueToCode(block, 'BY', Blockly.Dart.ORDER_ASSIGNMENT) || '1'; var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); + branch = Blockly.Dart.addLoopTrap(branch, block); var code; if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && Blockly.isNumber(increment)) { @@ -145,7 +145,7 @@ Blockly.Dart['controls_forEach'] = function(block) { var argument0 = Blockly.Dart.valueToCode(block, 'LIST', Blockly.Dart.ORDER_ASSIGNMENT) || '[]'; var branch = Blockly.Dart.statementToCode(block, 'DO'); - branch = Blockly.Dart.addLoopTrap(branch, block.id); + branch = Blockly.Dart.addLoopTrap(branch, block); var code = 'for (var ' + variable0 + ' in ' + argument0 + ') {\n' + branch + '}\n'; return code; diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js index b9daf055a..5af422147 100644 --- a/generators/dart/procedures.js +++ b/generators/dart/procedures.js @@ -34,20 +34,19 @@ Blockly.Dart['procedures_defreturn'] = function(block) { var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); var branch = Blockly.Dart.statementToCode(block, 'STACK'); - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. if (Blockly.Dart.STATEMENT_SUFFIX) { branch = Blockly.Dart.prefixLines( - Blockly.Dart.STATEMENT_SUFFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), Blockly.Dart.INDENT) + branch; } if (Blockly.Dart.INFINITE_LOOP_TRAP) { branch = Blockly.Dart.prefixLines( - Blockly.Dart.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\''), + Blockly.Dart.injectId(Blockly.Dart.INFINITE_LOOP_TRAP, block), Blockly.Dart.INDENT) + branch; } if (Blockly.Dart.STATEMENT_PREFIX) { branch = Blockly.Dart.prefixLines( - Blockly.Dart.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block), Blockly.Dart.INDENT) + branch; } var returnValue = Blockly.Dart.valueToCode(block, 'RETURN', @@ -104,6 +103,13 @@ Blockly.Dart['procedures_ifreturn'] = function(block) { var condition = Blockly.Dart.valueToCode(block, 'CONDITION', Blockly.Dart.ORDER_NONE) || 'false'; var code = 'if (' + condition + ') {\n'; + if (Blockly.Dart.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), + Blockly.Dart.INDENT); + } if (block.hasReturnValue_) { var value = Blockly.Dart.valueToCode(block, 'VALUE', Blockly.Dart.ORDER_NONE) || 'null'; diff --git a/generators/javascript/loops.js b/generators/javascript/loops.js index 416bbc8be..c1ad595eb 100644 --- a/generators/javascript/loops.js +++ b/generators/javascript/loops.js @@ -40,7 +40,7 @@ Blockly.JavaScript['controls_repeat_ext'] = function(block) { Blockly.JavaScript.ORDER_ASSIGNMENT) || '0'; } var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + branch = Blockly.JavaScript.addLoopTrap(branch, block); var code = ''; var loopVar = Blockly.JavaScript.variableDB_.getDistinctName( 'count', Blockly.Variables.NAME_TYPE); @@ -67,7 +67,7 @@ Blockly.JavaScript['controls_whileUntil'] = function(block) { until ? Blockly.JavaScript.ORDER_LOGICAL_NOT : Blockly.JavaScript.ORDER_NONE) || 'false'; var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + branch = Blockly.JavaScript.addLoopTrap(branch, block); if (until) { argument0 = '!' + argument0; } @@ -85,7 +85,7 @@ Blockly.JavaScript['controls_for'] = function(block) { var increment = Blockly.JavaScript.valueToCode(block, 'BY', Blockly.JavaScript.ORDER_ASSIGNMENT) || '1'; var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + branch = Blockly.JavaScript.addLoopTrap(branch, block); var code; if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && Blockly.isNumber(increment)) { @@ -146,7 +146,7 @@ Blockly.JavaScript['controls_forEach'] = function(block) { var argument0 = Blockly.JavaScript.valueToCode(block, 'LIST', Blockly.JavaScript.ORDER_ASSIGNMENT) || '[]'; var branch = Blockly.JavaScript.statementToCode(block, 'DO'); - branch = Blockly.JavaScript.addLoopTrap(branch, block.id); + branch = Blockly.JavaScript.addLoopTrap(branch, block); var code = ''; // Cache non-trivial values to variables to prevent repeated look-ups. var listVar = argument0; diff --git a/generators/javascript/procedures.js b/generators/javascript/procedures.js index a3f9c88d6..2096ddef0 100644 --- a/generators/javascript/procedures.js +++ b/generators/javascript/procedures.js @@ -34,20 +34,19 @@ Blockly.JavaScript['procedures_defreturn'] = function(block) { var funcName = Blockly.JavaScript.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); var branch = Blockly.JavaScript.statementToCode(block, 'STACK'); - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. if (Blockly.JavaScript.STATEMENT_SUFFIX) { branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.STATEMENT_SUFFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, block), Blockly.JavaScript.INDENT) + branch; } if (Blockly.JavaScript.INFINITE_LOOP_TRAP) { branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\''), - Blockly.JavaScript.INDENT) + branch; + Blockly.JavaScript.injectId(Blockly.JavaScript.INFINITE_LOOP_TRAP, + block), Blockly.JavaScript.INDENT) + branch; } if (Blockly.JavaScript.STATEMENT_PREFIX) { branch = Blockly.JavaScript.prefixLines( - Blockly.JavaScript.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, block), Blockly.JavaScript.INDENT) + branch; } var returnValue = Blockly.JavaScript.valueToCode(block, 'RETURN', @@ -104,6 +103,14 @@ Blockly.JavaScript['procedures_ifreturn'] = function(block) { var condition = Blockly.JavaScript.valueToCode(block, 'CONDITION', Blockly.JavaScript.ORDER_NONE) || 'false'; var code = 'if (' + condition + ') {\n'; + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. + code += Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, block), + Blockly.JavaScript.INDENT); + } if (block.hasReturnValue_) { var value = Blockly.JavaScript.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE) || 'null'; diff --git a/generators/lua/loops.js b/generators/lua/loops.js index d671534a6..612f4ae78 100644 --- a/generators/lua/loops.js +++ b/generators/lua/loops.js @@ -45,37 +45,34 @@ Blockly.Lua.CONTINUE_STATEMENT = 'goto continue\n'; * * @param {string} branch Generated code of the loop body * @return {string} Generated label or '' if unnecessary + * @private */ -Blockly.Lua.addContinueLabel = function(branch) { - if (branch.indexOf(Blockly.Lua.CONTINUE_STATEMENT) > -1) { +Blockly.Lua.addContinueLabel_ = function(branch) { + if (branch.indexOf(Blockly.Lua.CONTINUE_STATEMENT) != -1) { return branch + Blockly.Lua.INDENT + '::continue::\n'; } else { return branch; } }; -Blockly.Lua['controls_repeat'] = function(block) { - // Repeat n times (internal number). - var repeats = parseInt(block.getFieldValue('TIMES'), 10); - var branch = Blockly.Lua.statementToCode(block, 'DO') || ''; - branch = Blockly.Lua.addContinueLabel(branch); - var loopVar = Blockly.Lua.variableDB_.getDistinctName( - 'count', Blockly.Variables.NAME_TYPE); - var code = 'for ' + loopVar + ' = 1, ' + repeats + ' do\n' + branch + 'end\n'; - return code; -}; - Blockly.Lua['controls_repeat_ext'] = function(block) { - // Repeat n times (external number). - var repeats = Blockly.Lua.valueToCode(block, 'TIMES', - Blockly.Lua.ORDER_NONE) || '0'; + // Repeat n times. + if (block.getField('TIMES')) { + // Internal number. + var repeats = String(Number(block.getFieldValue('TIMES'))); + } else { + // External number. + var repeats = Blockly.Lua.valueToCode(block, 'TIMES', + Blockly.Lua.ORDER_NONE) || '0'; + } if (Blockly.isNumber(repeats)) { repeats = parseInt(repeats, 10); } else { repeats = 'math.floor(' + repeats + ')'; } - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - branch = Blockly.Lua.addContinueLabel(branch); + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); var loopVar = Blockly.Lua.variableDB_.getDistinctName( 'count', Blockly.Variables.NAME_TYPE); var code = 'for ' + loopVar + ' = 1, ' + repeats + ' do\n' + @@ -83,15 +80,17 @@ Blockly.Lua['controls_repeat_ext'] = function(block) { return code; }; +Blockly.Lua['controls_repeat'] = Blockly.Lua['controls_repeat_ext']; + Blockly.Lua['controls_whileUntil'] = function(block) { // Do while/until loop. var until = block.getFieldValue('MODE') == 'UNTIL'; var argument0 = Blockly.Lua.valueToCode(block, 'BOOL', until ? Blockly.Lua.ORDER_UNARY : Blockly.Lua.ORDER_NONE) || 'false'; - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - branch = Blockly.Lua.addLoopTrap(branch, block.id); - branch = Blockly.Lua.addContinueLabel(branch); + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); if (until) { argument0 = 'not ' + argument0; } @@ -108,9 +107,9 @@ Blockly.Lua['controls_for'] = function(block) { Blockly.Lua.ORDER_NONE) || '0'; var increment = Blockly.Lua.valueToCode(block, 'BY', Blockly.Lua.ORDER_NONE) || '1'; - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - branch = Blockly.Lua.addLoopTrap(branch, block.id); - branch = Blockly.Lua.addContinueLabel(branch); + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); var code = ''; var incValue; if (Blockly.isNumber(startVar) && Blockly.isNumber(endVar) && @@ -147,8 +146,9 @@ Blockly.Lua['controls_forEach'] = function(block) { block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); var argument0 = Blockly.Lua.valueToCode(block, 'LIST', Blockly.Lua.ORDER_NONE) || '{}'; - var branch = Blockly.Lua.statementToCode(block, 'DO') || '\n'; - branch = Blockly.Lua.addContinueLabel(branch); + var branch = Blockly.Lua.statementToCode(block, 'DO'); + branch = Blockly.Lua.addLoopTrap(branch, block); + branch = Blockly.Lua.addContinueLabel_(branch); var code = 'for _, ' + variable0 + ' in ipairs(' + argument0 + ') do \n' + branch + 'end\n'; return code; diff --git a/generators/lua/procedures.js b/generators/lua/procedures.js index 58c32baba..7995c9d78 100644 --- a/generators/lua/procedures.js +++ b/generators/lua/procedures.js @@ -34,20 +34,19 @@ Blockly.Lua['procedures_defreturn'] = function(block) { var funcName = Blockly.Lua.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); var branch = Blockly.Lua.statementToCode(block, 'STACK'); - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. if (Blockly.Lua.STATEMENT_SUFFIX) { branch = Blockly.Lua.prefixLines( - Blockly.Lua.STATEMENT_SUFFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), Blockly.Lua.INDENT) + branch; } if (Blockly.Lua.INFINITE_LOOP_TRAP) { branch = Blockly.Lua.prefixLines( - Blockly.Lua.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\''), + Blockly.Lua.injectId(Blockly.Lua.INFINITE_LOOP_TRAP, block), Blockly.Lua.INDENT) + branch; } if (Blockly.Lua.STATEMENT_PREFIX) { branch = Blockly.Lua.prefixLines( - Blockly.Lua.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block), Blockly.Lua.INDENT) + branch; } var returnValue = Blockly.Lua.valueToCode(block, 'RETURN', @@ -106,6 +105,13 @@ Blockly.Lua['procedures_ifreturn'] = function(block) { var condition = Blockly.Lua.valueToCode(block, 'CONDITION', Blockly.Lua.ORDER_NONE) || 'false'; var code = 'if ' + condition + ' then\n'; + if (Blockly.Lua.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), + Blockly.Lua.INDENT); + } if (block.hasReturnValue_) { var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.Lua.ORDER_NONE) || 'nil'; diff --git a/generators/php/loops.js b/generators/php/loops.js index b504740ba..f85ce0116 100644 --- a/generators/php/loops.js +++ b/generators/php/loops.js @@ -40,7 +40,7 @@ Blockly.PHP['controls_repeat_ext'] = function(block) { Blockly.PHP.ORDER_ASSIGNMENT) || '0'; } var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); + branch = Blockly.PHP.addLoopTrap(branch, block); var code = ''; var loopVar = Blockly.PHP.variableDB_.getDistinctName( 'count', Blockly.Variables.NAME_TYPE); @@ -66,7 +66,7 @@ Blockly.PHP['controls_whileUntil'] = function(block) { until ? Blockly.PHP.ORDER_LOGICAL_NOT : Blockly.PHP.ORDER_NONE) || 'false'; var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); + branch = Blockly.PHP.addLoopTrap(branch, block); if (until) { argument0 = '!' + argument0; } @@ -84,7 +84,7 @@ Blockly.PHP['controls_for'] = function(block) { var increment = Blockly.PHP.valueToCode(block, 'BY', Blockly.PHP.ORDER_ASSIGNMENT) || '1'; var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); + branch = Blockly.PHP.addLoopTrap(branch, block); var code; if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && Blockly.isNumber(increment)) { @@ -145,7 +145,7 @@ Blockly.PHP['controls_forEach'] = function(block) { var argument0 = Blockly.PHP.valueToCode(block, 'LIST', Blockly.PHP.ORDER_ASSIGNMENT) || '[]'; var branch = Blockly.PHP.statementToCode(block, 'DO'); - branch = Blockly.PHP.addLoopTrap(branch, block.id); + branch = Blockly.PHP.addLoopTrap(branch, block); var code = ''; code += 'foreach (' + argument0 + ' as ' + variable0 + ') {\n' + branch + '}\n'; diff --git a/generators/php/procedures.js b/generators/php/procedures.js index d93d7cb63..d24a1d6c5 100644 --- a/generators/php/procedures.js +++ b/generators/php/procedures.js @@ -55,20 +55,19 @@ Blockly.PHP['procedures_defreturn'] = function(block) { var funcName = Blockly.PHP.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); var branch = Blockly.PHP.statementToCode(block, 'STACK'); - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. if (Blockly.PHP.STATEMENT_SUFFIX) { branch = Blockly.PHP.prefixLines( - Blockly.PHP.STATEMENT_SUFFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), Blockly.PHP.INDENT) + branch; } if (Blockly.PHP.INFINITE_LOOP_TRAP) { branch = Blockly.PHP.prefixLines( - Blockly.PHP.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\''), + Blockly.PHP.injectId(Blockly.PHP.INFINITE_LOOP_TRAP, block), Blockly.PHP.INDENT) + branch; } if (Blockly.PHP.STATEMENT_PREFIX) { branch = Blockly.PHP.prefixLines( - Blockly.PHP.STATEMENT_PREFIX.replace(/%1/g, '\'' + id + '\''), + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block), Blockly.PHP.INDENT) + branch; } var returnValue = Blockly.PHP.valueToCode(block, 'RETURN', @@ -125,6 +124,14 @@ Blockly.PHP['procedures_ifreturn'] = function(block) { var condition = Blockly.PHP.valueToCode(block, 'CONDITION', Blockly.PHP.ORDER_NONE) || 'false'; var code = 'if (' + condition + ') {\n'; + if (Blockly.PHP.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. + code += Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), + Blockly.PHP.INDENT); + } if (block.hasReturnValue_) { var value = Blockly.PHP.valueToCode(block, 'VALUE', Blockly.PHP.ORDER_NONE) || 'null'; diff --git a/generators/python/loops.js b/generators/python/loops.js index 918bcdfb5..e7047dee1 100644 --- a/generators/python/loops.js +++ b/generators/python/loops.js @@ -45,8 +45,7 @@ Blockly.Python['controls_repeat_ext'] = function(block) { repeats = 'int(' + repeats + ')'; } var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; + branch = Blockly.Python.addLoopTrap(branch, block) || Blockly.Python.PASS; var loopVar = Blockly.Python.variableDB_.getDistinctName( 'count', Blockly.Variables.NAME_TYPE); var code = 'for ' + loopVar + ' in range(' + repeats + '):\n' + branch; @@ -62,8 +61,7 @@ Blockly.Python['controls_whileUntil'] = function(block) { until ? Blockly.Python.ORDER_LOGICAL_NOT : Blockly.Python.ORDER_NONE) || 'False'; var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; + branch = Blockly.Python.addLoopTrap(branch, block) || Blockly.Python.PASS; if (until) { argument0 = 'not ' + argument0; } @@ -81,8 +79,7 @@ Blockly.Python['controls_for'] = function(block) { var increment = Blockly.Python.valueToCode(block, 'BY', Blockly.Python.ORDER_NONE) || '1'; var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; + branch = Blockly.Python.addLoopTrap(branch, block) || Blockly.Python.PASS; var code = ''; var range; @@ -193,8 +190,7 @@ Blockly.Python['controls_forEach'] = function(block) { var argument0 = Blockly.Python.valueToCode(block, 'LIST', Blockly.Python.ORDER_RELATIONAL) || '[]'; var branch = Blockly.Python.statementToCode(block, 'DO'); - branch = Blockly.Python.addLoopTrap(branch, block.id) || - Blockly.Python.PASS; + branch = Blockly.Python.addLoopTrap(branch, block) || Blockly.Python.PASS; var code = 'for ' + variable0 + ' in ' + argument0 + ':\n' + branch; return code; }; diff --git a/generators/python/procedures.js b/generators/python/procedures.js index c95c279f1..efdd73850 100644 --- a/generators/python/procedures.js +++ b/generators/python/procedures.js @@ -56,20 +56,19 @@ Blockly.Python['procedures_defreturn'] = function(block) { var funcName = Blockly.Python.variableDB_.getName( block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); var branch = Blockly.Python.statementToCode(block, 'STACK'); - var id = block.id.replace(/\$/g, '$$$$'); // Issue 251. if (Blockly.Python.STATEMENT_SUFFIX) { branch = Blockly.Python.prefixLines( - Blockly.Python.STATEMENT_SUFFIX.replace( /%1/g, '\'' + id + '\''), + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), Blockly.Python.INDENT) + branch; } if (Blockly.Python.INFINITE_LOOP_TRAP) { branch = Blockly.Python.prefixLines( - Blockly.Python.INFINITE_LOOP_TRAP.replace(/%1/g, '\'' + id + '\''), + Blockly.Python.injectId(Blockly.Python.INFINITE_LOOP_TRAP, block), Blockly.Python.INDENT) + branch; } if (Blockly.Python.STATEMENT_PREFIX) { branch = Blockly.Python.prefixLines( - Blockly.Python.STATEMENT_PREFIX.replace( /%1/g, '\'' + id + '\''), + Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block), Blockly.Python.INDENT) + branch; } var returnValue = Blockly.Python.valueToCode(block, 'RETURN', @@ -128,6 +127,13 @@ Blockly.Python['procedures_ifreturn'] = function(block) { var condition = Blockly.Python.valueToCode(block, 'CONDITION', Blockly.Python.ORDER_NONE) || 'False'; var code = 'if ' + condition + ':\n'; + if (Blockly.Python.STATEMENT_SUFFIX) { + // Inject any statement suffix here since the regular one at the end + // will not get executed if the return is triggered. + code += Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), + Blockly.Python.INDENT); + } if (block.hasReturnValue_) { var value = Blockly.Python.valueToCode(block, 'VALUE', Blockly.Python.ORDER_NONE) || 'None';