From c0e14c3a7c621803dbce73758b4bc3b57689aed9 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Tue, 14 May 2019 13:59:19 -0700 Subject: [PATCH] Add method to suppress prefix/suffix from blocks. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This allows generators to have more control over the placement of suffix. Needed for ‘if’ blocks and function calls which require their suffix code to be somewhere other than the end. Also, add loop’s prefix to ‘break’ blocks, since the loop’s suffix will be the next statement hit. Also, reuse procedures_callreturn generator for procedures_callnoreturn. --- blocks/logic.js | 6 ++++++ blocks/loops.js | 15 +++++++++++++-- blocks/procedures.js | 6 ++++++ core/generator.js | 4 ++-- generators/dart/logic.js | 19 ++++++++++++++++--- generators/dart/loops.js | 12 ++++++++---- generators/dart/procedures.js | 19 ++++++++++++------- generators/javascript/logic.js | 20 +++++++++++++++++--- generators/javascript/loops.js | 13 +++++++++---- generators/javascript/procedures.js | 21 ++++++++++++++------- generators/lua/logic.js | 19 ++++++++++++++++--- generators/lua/loops.js | 12 ++++++++---- generators/lua/procedures.js | 19 ++++++++++++------- generators/php/logic.js | 19 ++++++++++++++++--- generators/php/loops.js | 12 ++++++++---- generators/php/procedures.js | 19 ++++++++++++------- generators/python/logic.js | 17 +++++++++++++++-- generators/python/loops.js | 12 ++++++++---- generators/python/procedures.js | 19 ++++++++++++------- 19 files changed, 210 insertions(+), 73 deletions(-) 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; };