diff --git a/blocks/logic.js b/blocks/logic.js index 9fcecbfce..8de2ae6d4 100644 --- a/blocks/logic.js +++ b/blocks/logic.js @@ -305,6 +305,12 @@ Blockly.Constants.Logic.CONTROLS_IF_MUTATOR_MIXIN = { elseifCount_: 0, elseCount_: 0, + /** + * Don't automatically add STATEMENT_PREFIX and STATEMENT_SUFFIX to generated + * code. These will be handled manually in this block's generators. + */ + suppressPrefixSuffix: true, + /** * Create XML to represent the number of else-if and else inputs. * @return {Element} XML storage element. diff --git a/blocks/loops.js b/blocks/loops.js index eb245a808..d8dae09ba 100644 --- a/blocks/loops.js +++ b/blocks/loops.js @@ -302,8 +302,19 @@ Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = { * To add a new loop type add this to your code: * Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.LOOP_TYPES.push('custom_loop'); */ - LOOP_TYPES: ['controls_repeat', 'controls_repeat_ext', 'controls_forEach', - 'controls_for', 'controls_whileUntil'], + LOOP_TYPES: [ + 'controls_repeat', + 'controls_repeat_ext', + 'controls_forEach', + 'controls_for', + 'controls_whileUntil' + ], + + /** + * Don't automatically add STATEMENT_PREFIX and STATEMENT_SUFFIX to generated + * code. These will be handled manually in this block's generators. + */ + suppressPrefixSuffix: true, /** * Is the given block enclosed (at any level) by a loop? diff --git a/blocks/procedures.js b/blocks/procedures.js index 5188ac8b9..a95babe47 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -642,6 +642,12 @@ Blockly.Blocks['procedures_callnoreturn'] = { this.previousEnabledState_ = true; }, + /** + * Don't automatically add STATEMENT_PREFIX and STATEMENT_SUFFIX to generated + * code. These will be handled manually in this block's generators. + */ + suppressPrefixSuffix: true, + /** * Returns the name of the procedure this block calls. * @return {string} Procedure name. diff --git a/core/generator.js b/core/generator.js index e9baf59a7..bc2bf8e60 100644 --- a/core/generator.js +++ b/core/generator.js @@ -198,10 +198,10 @@ Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { } return [this.scrub_(block, code[0], opt_thisOnly), code[1]]; } else if (typeof code == 'string') { - if (this.STATEMENT_PREFIX) { + if (this.STATEMENT_PREFIX && !block.suppressPrefixSuffix) { code = this.injectId(this.STATEMENT_PREFIX, block) + code; } - if (this.STATEMENT_SUFFIX) { + if (this.STATEMENT_SUFFIX && !block.suppressPrefixSuffix) { code = code + this.injectId(this.STATEMENT_SUFFIX, block); } return this.scrub_(block, code, opt_thisOnly); diff --git a/generators/dart/logic.js b/generators/dart/logic.js index 620b55da8..bd99aa2b3 100644 --- a/generators/dart/logic.js +++ b/generators/dart/logic.js @@ -33,18 +33,31 @@ Blockly.Dart['controls_if'] = function(block) { // If/elseif/else condition. var n = 0; var code = '', branchCode, conditionCode; + if (Blockly.Dart.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); + } do { conditionCode = Blockly.Dart.valueToCode(block, 'IF' + n, - Blockly.Dart.ORDER_NONE) || 'false'; + Blockly.Dart.ORDER_NONE) || 'false'; branchCode = Blockly.Dart.statementToCode(block, 'DO' + n); + if (Blockly.Dart.STATEMENT_SUFFIX) { + branchCode = Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), + Blockly.Dart.INDENT) + branchCode; + } code += (n > 0 ? 'else ' : '') + 'if (' + conditionCode + ') {\n' + branchCode + '}'; - ++n; } while (block.getInput('IF' + n)); - if (block.getInput('ELSE')) { + if (block.getInput('ELSE') || Blockly.Dart.STATEMENT_SUFFIX) { branchCode = Blockly.Dart.statementToCode(block, 'ELSE'); + if (Blockly.Dart.STATEMENT_SUFFIX) { + branchCode = Blockly.Dart.prefixLines( + Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block), + Blockly.Dart.INDENT) + branchCode; + } code += ' else {\n' + branchCode + '}'; } return code + '\n'; diff --git a/generators/dart/loops.js b/generators/dart/loops.js index adab0f593..b24895e97 100644 --- a/generators/dart/loops.js +++ b/generators/dart/loops.js @@ -153,23 +153,27 @@ Blockly.Dart['controls_forEach'] = function(block) { Blockly.Dart['controls_flow_statements'] = function(block) { // Flow statements: continue, break. - var flowType = block.getFieldValue('FLOW'); var xfix = ''; + if (Blockly.Dart.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); + } if (Blockly.Dart.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the break/continue is triggered. xfix += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block); } - if (Blockly.Dart.STATEMENT_PREFIX && flowType == 'CONTINUE') { + if (Blockly.Dart.STATEMENT_PREFIX) { var loop = Blockly.Constants.Loops .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); if (loop) { // Inject loop's statement prefix here since the regular one at the end - // of the loop will not get executed if the continue is triggered. + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. xfix += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, loop); } } - switch (flowType) { + switch (block.getFieldValue('FLOW')) { case 'BREAK': return xfix + 'break;\n'; case 'CONTINUE': diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js index 5af422147..fa751c1ef 100644 --- a/generators/dart/procedures.js +++ b/generators/dart/procedures.js @@ -87,14 +87,19 @@ Blockly.Dart['procedures_callreturn'] = function(block) { Blockly.Dart['procedures_callnoreturn'] = function(block) { // Call a procedure with no return value. - var funcName = Blockly.Dart.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.Dart.valueToCode(block, 'ARG' + i, - Blockly.Dart.ORDER_NONE) || 'null'; + var code = ''; + if (Blockly.Dart.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_PREFIX, block); } - var code = funcName + '(' + args.join(', ') + ');\n'; + if (Blockly.Dart.STATEMENT_SUFFIX) { + // Suffix needs to be added before the function call. + code += Blockly.Dart.injectId(Blockly.Dart.STATEMENT_SUFFIX, block); + } + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.Dart['procedures_callreturn'](block); + code += tuple[0] + ';\n'; return code; }; diff --git a/generators/javascript/logic.js b/generators/javascript/logic.js index 1c4d4b620..27c439f2b 100644 --- a/generators/javascript/logic.js +++ b/generators/javascript/logic.js @@ -33,18 +33,32 @@ Blockly.JavaScript['controls_if'] = function(block) { // If/elseif/else condition. var n = 0; var code = '', branchCode, conditionCode; + if (Blockly.JavaScript.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); + } do { conditionCode = Blockly.JavaScript.valueToCode(block, 'IF' + n, - Blockly.JavaScript.ORDER_NONE) || 'false'; + Blockly.JavaScript.ORDER_NONE) || 'false'; branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n); + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + branchCode = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block), Blockly.JavaScript.INDENT) + branchCode; + } code += (n > 0 ? ' else ' : '') + 'if (' + conditionCode + ') {\n' + branchCode + '}'; - ++n; } while (block.getInput('IF' + n)); - if (block.getInput('ELSE')) { + if (block.getInput('ELSE') || Blockly.JavaScript.STATEMENT_SUFFIX) { branchCode = Blockly.JavaScript.statementToCode(block, 'ELSE'); + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + branchCode = Blockly.JavaScript.prefixLines( + Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block), Blockly.JavaScript.INDENT) + branchCode; + } code += ' else {\n' + branchCode + '}'; } return code + '\n'; diff --git a/generators/javascript/loops.js b/generators/javascript/loops.js index 9f6c6001b..3ce74f6b0 100644 --- a/generators/javascript/loops.js +++ b/generators/javascript/loops.js @@ -165,25 +165,30 @@ Blockly.JavaScript['controls_forEach'] = function(block) { Blockly.JavaScript['controls_flow_statements'] = function(block) { // Flow statements: continue, break. - var flowType = block.getFieldValue('FLOW'); var xfix = ''; + if (Blockly.JavaScript.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); + } if (Blockly.JavaScript.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the break/continue is triggered. xfix += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, block); } - if (Blockly.JavaScript.STATEMENT_PREFIX && flowType == 'CONTINUE') { + if (Blockly.JavaScript.STATEMENT_PREFIX) { var loop = Blockly.Constants.Loops .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); if (loop) { // Inject loop's statement prefix here since the regular one at the end - // of the loop will not get executed if the continue is triggered. + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. xfix += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, loop); } } - switch (flowType) { + switch (block.getFieldValue('FLOW')) { case 'BREAK': return xfix + 'break;\n'; case 'CONTINUE': diff --git a/generators/javascript/procedures.js b/generators/javascript/procedures.js index ad6083f30..d2fba2d8e 100644 --- a/generators/javascript/procedures.js +++ b/generators/javascript/procedures.js @@ -87,14 +87,21 @@ Blockly.JavaScript['procedures_callreturn'] = function(block) { Blockly.JavaScript['procedures_callnoreturn'] = function(block) { // Call a procedure with no return value. - var funcName = Blockly.JavaScript.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.JavaScript.valueToCode(block, 'ARG' + i, - Blockly.JavaScript.ORDER_COMMA) || 'null'; + var code = ''; + if (Blockly.JavaScript.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX, + block); } - var code = funcName + '(' + args.join(', ') + ');\n'; + if (Blockly.JavaScript.STATEMENT_SUFFIX) { + // Suffix needs to be added before the function call. + code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX, + block); + } + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.JavaScript['procedures_callreturn'](block); + code += tuple[0] + ';\n'; return code; }; diff --git a/generators/lua/logic.js b/generators/lua/logic.js index 033c52e33..ac08521f7 100644 --- a/generators/lua/logic.js +++ b/generators/lua/logic.js @@ -33,18 +33,31 @@ Blockly.Lua['controls_if'] = function(block) { // If/elseif/else condition. var n = 0; var code = '', branchCode, conditionCode; + if (Blockly.Lua.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); + } do { conditionCode = Blockly.Lua.valueToCode(block, 'IF' + n, - Blockly.Lua.ORDER_NONE) || 'false'; + Blockly.Lua.ORDER_NONE) || 'false'; branchCode = Blockly.Lua.statementToCode(block, 'DO' + n); + if (Blockly.Lua.STATEMENT_SUFFIX) { + branchCode = Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), + Blockly.Lua.INDENT) + branchCode; + } code += (n > 0 ? 'else' : '') + 'if ' + conditionCode + ' then\n' + branchCode; - ++n; } while (block.getInput('IF' + n)); - if (block.getInput('ELSE')) { + if (block.getInput('ELSE') || Blockly.Lua.STATEMENT_SUFFIX) { branchCode = Blockly.Lua.statementToCode(block, 'ELSE'); + if (Blockly.Lua.STATEMENT_SUFFIX) { + branchCode = Blockly.Lua.prefixLines( + Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block), + Blockly.Lua.INDENT) + branchCode; + } code += 'else\n' + branchCode; } return code + 'end\n'; diff --git a/generators/lua/loops.js b/generators/lua/loops.js index 4205af07d..7a41d58b9 100644 --- a/generators/lua/loops.js +++ b/generators/lua/loops.js @@ -157,23 +157,27 @@ Blockly.Lua['controls_forEach'] = function(block) { Blockly.Lua['controls_flow_statements'] = function(block) { // Flow statements: continue, break. - var flowType = block.getFieldValue('FLOW'); var xfix = ''; + if (Blockly.Lua.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); + } if (Blockly.Lua.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the break/continue is triggered. xfix += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block); } - if (Blockly.Lua.STATEMENT_PREFIX && flowType == 'CONTINUE') { + if (Blockly.Lua.STATEMENT_PREFIX) { var loop = Blockly.Constants.Loops .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); if (loop) { // Inject loop's statement prefix here since the regular one at the end - // of the loop will not get executed if the continue is triggered. + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. xfix += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, loop); } } - switch (flowType) { + switch (block.getFieldValue('FLOW')) { case 'BREAK': return xfix + 'break\n'; case 'CONTINUE': diff --git a/generators/lua/procedures.js b/generators/lua/procedures.js index 7995c9d78..b1739cdd9 100644 --- a/generators/lua/procedures.js +++ b/generators/lua/procedures.js @@ -89,14 +89,19 @@ Blockly.Lua['procedures_callreturn'] = function(block) { Blockly.Lua['procedures_callnoreturn'] = function(block) { // Call a procedure with no return value. - var funcName = Blockly.Lua.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.Lua.valueToCode(block, 'ARG' + i, - Blockly.Lua.ORDER_NONE) || 'nil'; + var code = ''; + if (Blockly.Lua.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_PREFIX, block); } - var code = funcName + '(' + args.join(', ') + ')\n'; + if (Blockly.Lua.STATEMENT_SUFFIX) { + // Suffix needs to be added before the function call. + code += Blockly.Lua.injectId(Blockly.Lua.STATEMENT_SUFFIX, block); + } + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.Lua['procedures_callreturn'](block); + code += tuple[0] + '\n'; return code; }; diff --git a/generators/php/logic.js b/generators/php/logic.js index 475d2f703..fe618210b 100644 --- a/generators/php/logic.js +++ b/generators/php/logic.js @@ -33,18 +33,31 @@ Blockly.PHP['controls_if'] = function(block) { // If/elseif/else condition. var n = 0; var code = '', branchCode, conditionCode; + if (Blockly.PHP.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); + } do { conditionCode = Blockly.PHP.valueToCode(block, 'IF' + n, - Blockly.PHP.ORDER_NONE) || 'false'; + Blockly.PHP.ORDER_NONE) || 'false'; branchCode = Blockly.PHP.statementToCode(block, 'DO' + n); + if (Blockly.PHP.STATEMENT_SUFFIX) { + branchCode = Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), + Blockly.PHP.INDENT) + branchCode; + } code += (n > 0 ? ' else ' : '') + 'if (' + conditionCode + ') {\n' + branchCode + '}'; - ++n; } while (block.getInput('IF' + n)); - if (block.getInput('ELSE')) { + if (block.getInput('ELSE') || Blockly.PHP.STATEMENT_SUFFIX) { branchCode = Blockly.PHP.statementToCode(block, 'ELSE'); + if (Blockly.PHP.STATEMENT_SUFFIX) { + branchCode = Blockly.PHP.prefixLines( + Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block), + Blockly.PHP.INDENT) + branchCode; + } code += ' else {\n' + branchCode + '}'; } return code + '\n'; diff --git a/generators/php/loops.js b/generators/php/loops.js index 490f7e152..7b277156e 100644 --- a/generators/php/loops.js +++ b/generators/php/loops.js @@ -154,23 +154,27 @@ Blockly.PHP['controls_forEach'] = function(block) { Blockly.PHP['controls_flow_statements'] = function(block) { // Flow statements: continue, break. - var flowType = block.getFieldValue('FLOW'); var xfix = ''; + if (Blockly.PHP.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); + } if (Blockly.PHP.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the break/continue is triggered. xfix += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block); } - if (Blockly.PHP.STATEMENT_PREFIX && flowType == 'CONTINUE') { + if (Blockly.PHP.STATEMENT_PREFIX) { var loop = Blockly.Constants.Loops .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); if (loop) { // Inject loop's statement prefix here since the regular one at the end - // of the loop will not get executed if the continue is triggered. + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. xfix += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, loop); } } - switch (flowType) { + switch (block.getFieldValue('FLOW')) { case 'BREAK': return xfix + 'break;\n'; case 'CONTINUE': diff --git a/generators/php/procedures.js b/generators/php/procedures.js index 56e042dcd..fe51de408 100644 --- a/generators/php/procedures.js +++ b/generators/php/procedures.js @@ -108,14 +108,19 @@ Blockly.PHP['procedures_callreturn'] = function(block) { Blockly.PHP['procedures_callnoreturn'] = function(block) { // Call a procedure with no return value. - var funcName = Blockly.PHP.variableDB_.getName( - block.getFieldValue('NAME'), Blockly.Procedures.NAME_TYPE); - var args = []; - for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.PHP.valueToCode(block, 'ARG' + i, - Blockly.PHP.ORDER_COMMA) || 'null'; + var code = ''; + if (Blockly.PHP.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_PREFIX, block); } - var code = funcName + '(' + args.join(', ') + ');\n'; + if (Blockly.PHP.STATEMENT_SUFFIX) { + // Suffix needs to be added before the function call. + code += Blockly.PHP.injectId(Blockly.PHP.STATEMENT_SUFFIX, block); + } + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.PHP['procedures_callreturn'](block); + code += tuple[0] + ';\n'; return code; }; diff --git a/generators/python/logic.js b/generators/python/logic.js index fe0364868..1642ef5b0 100644 --- a/generators/python/logic.js +++ b/generators/python/logic.js @@ -33,19 +33,32 @@ Blockly.Python['controls_if'] = function(block) { // If/elseif/else condition. var n = 0; var code = '', branchCode, conditionCode; + if (Blockly.Python.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); + } do { conditionCode = Blockly.Python.valueToCode(block, 'IF' + n, Blockly.Python.ORDER_NONE) || 'False'; branchCode = Blockly.Python.statementToCode(block, 'DO' + n) || Blockly.Python.PASS; + if (Blockly.Python.STATEMENT_SUFFIX) { + branchCode = Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), + Blockly.Python.INDENT) + branchCode; + } code += (n == 0 ? 'if ' : 'elif ' ) + conditionCode + ':\n' + branchCode; - ++n; } while (block.getInput('IF' + n)); - if (block.getInput('ELSE')) { + if (block.getInput('ELSE') || Blockly.Python.STATEMENT_SUFFIX) { branchCode = Blockly.Python.statementToCode(block, 'ELSE') || Blockly.Python.PASS; + if (Blockly.Python.STATEMENT_SUFFIX) { + branchCode = Blockly.Python.prefixLines( + Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block), + Blockly.Python.INDENT) + branchCode; + } code += 'else:\n' + branchCode; } return code; diff --git a/generators/python/loops.js b/generators/python/loops.js index a29b8d787..f0e31a2cd 100644 --- a/generators/python/loops.js +++ b/generators/python/loops.js @@ -197,23 +197,27 @@ Blockly.Python['controls_forEach'] = function(block) { Blockly.Python['controls_flow_statements'] = function(block) { // Flow statements: continue, break. - var flowType = block.getFieldValue('FLOW'); var xfix = ''; + if (Blockly.Python.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + xfix += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); + } if (Blockly.Python.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the break/continue is triggered. xfix += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block); } - if (Blockly.Python.STATEMENT_PREFIX && flowType == 'CONTINUE') { + if (Blockly.Python.STATEMENT_PREFIX) { var loop = Blockly.Constants.Loops .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); if (loop) { // Inject loop's statement prefix here since the regular one at the end - // of the loop will not get executed if the continue is triggered. + // of the loop will not get executed if 'continue' is triggered. + // In the case of 'break', a prefix is needed due to the loop's suffix. xfix += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, loop); } } - switch (flowType) { + switch (block.getFieldValue('FLOW')) { case 'BREAK': return xfix + 'break\n'; case 'CONTINUE': diff --git a/generators/python/procedures.js b/generators/python/procedures.js index efdd73850..76bd11687 100644 --- a/generators/python/procedures.js +++ b/generators/python/procedures.js @@ -111,14 +111,19 @@ Blockly.Python['procedures_callreturn'] = function(block) { Blockly.Python['procedures_callnoreturn'] = function(block) { // Call a procedure with no return value. - var funcName = Blockly.Python.variableDB_.getName(block.getFieldValue('NAME'), - Blockly.Procedures.NAME_TYPE); - var args = []; - for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.Python.valueToCode(block, 'ARG' + i, - Blockly.Python.ORDER_NONE) || 'None'; + var code = ''; + if (Blockly.Python.STATEMENT_PREFIX) { + // Automatic prefix insertion is switched off for this block. Add manually. + code += Blockly.Python.injectId(Blockly.Python.STATEMENT_PREFIX, block); } - var code = funcName + '(' + args.join(', ') + ')\n'; + if (Blockly.Python.STATEMENT_SUFFIX) { + // Suffix needs to be added before the function call. + code += Blockly.Python.injectId(Blockly.Python.STATEMENT_SUFFIX, block); + } + // Generated code is for a function call as a statement is the same as a + // function call as a value, with the addition of line ending. + var tuple = Blockly.Python['procedures_callreturn'](block); + code += tuple[0] + '\n'; return code; };