Add extra suffix when generating if/return block.

Also fix loops in Lua.
This commit is contained in:
Neil Fraser
2019-05-13 14:26:38 -07:00
committed by Neil Fraser
parent ba18ae2159
commit 0259f8bb48
11 changed files with 117 additions and 79 deletions

View File

@@ -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}

View File

@@ -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;

View File

@@ -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';

View File

@@ -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;

View File

@@ -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';

View File

@@ -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;

View File

@@ -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';

View File

@@ -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';

View File

@@ -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';

View File

@@ -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;
};

View File

@@ -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';