mirror of
https://github.com/google/blockly.git
synced 2026-01-09 10:00:09 +01:00
* chore: revert #5730 * fix: Fix compile failure due to incorrect visibility The CONTROL_FLOW_IN_LOOP_CHECK_MIXIN is intended to be used outside of blocks/ (it is, in particular, used in generators/) so it should have been marked @public from the beginning.
This commit is contained in:
@@ -19,7 +19,6 @@ goog.require('Blockly.FieldLabel');
|
||||
goog.require('Blockly.FieldNumber');
|
||||
goog.require('Blockly.FieldVariable');
|
||||
goog.require('Blockly.Warning');
|
||||
goog.require('Blockly.loopMixin');
|
||||
|
||||
|
||||
/**
|
||||
@@ -274,3 +273,73 @@ Blockly.Extensions.register('controls_for_tooltip',
|
||||
Blockly.Extensions.register('controls_forEach_tooltip',
|
||||
Blockly.Extensions.buildTooltipWithFieldText(
|
||||
'%{BKY_CONTROLS_FOREACH_TOOLTIP}', 'VAR'));
|
||||
|
||||
/**
|
||||
* This mixin adds a check to make sure the 'controls_flow_statements' block
|
||||
* is contained in a loop. Otherwise a warning is added to the block.
|
||||
* @mixin
|
||||
* @augments Blockly.Block
|
||||
* @public
|
||||
* @readonly
|
||||
*/
|
||||
Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN = {
|
||||
/**
|
||||
* List of block types that are loops and thus do not need warnings.
|
||||
* 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',
|
||||
],
|
||||
|
||||
/**
|
||||
* Is the given block enclosed (at any level) by a loop?
|
||||
* @param {!Blockly.Block} block Current block.
|
||||
* @return {Blockly.Block} The nearest surrounding loop, or null if none.
|
||||
*/
|
||||
getSurroundLoop: function(block) {
|
||||
// Is the block nested in a loop?
|
||||
do {
|
||||
if (Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.LOOP_TYPES
|
||||
.indexOf(block.type) !== -1) {
|
||||
return block;
|
||||
}
|
||||
block = block.getSurroundParent();
|
||||
} while (block);
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Called whenever anything on the workspace changes.
|
||||
* Add warning if this flow block is not nested inside a loop.
|
||||
* @param {!Blockly.Events.Abstract} e Change event.
|
||||
* @this {Blockly.Block}
|
||||
*/
|
||||
onchange: function(e) {
|
||||
// Don't change state if:
|
||||
// * It's at the start of a drag.
|
||||
// * It's not a move event.
|
||||
if (!this.workspace.isDragging || this.workspace.isDragging() ||
|
||||
e.type !== Blockly.Events.BLOCK_MOVE) {
|
||||
return;
|
||||
}
|
||||
const enabled = Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN
|
||||
.getSurroundLoop(this);
|
||||
this.setWarningText(enabled ? null :
|
||||
Blockly.Msg['CONTROLS_FLOW_STATEMENTS_WARNING']);
|
||||
if (!this.isInFlyout) {
|
||||
const group = Blockly.Events.getGroup();
|
||||
// Makes it so the move and the disable event get undone together.
|
||||
Blockly.Events.setGroup(e.group);
|
||||
this.setEnabled(enabled);
|
||||
Blockly.Events.setGroup(group);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
Blockly.Extensions.registerMixin('controls_flow_in_loop_check',
|
||||
Blockly.Constants.Loops.CONTROL_FLOW_IN_LOOP_CHECK_MIXIN);
|
||||
|
||||
Reference in New Issue
Block a user