Skip to content

Commit e6dc3e8

Browse files
authored
Merge pull request #226 from smalruby/remove_wait_block
remove wait block when ruby to block.
2 parents c775446 + 4a4e04e commit e6dc3e8

File tree

5 files changed

+288
-173
lines changed

5 files changed

+288
-173
lines changed

src/lib/ruby-generator/control.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@ export default function (Generator) {
1212
Generator.control_repeat = function (block) {
1313
const times = Generator.valueToCode(block, 'TIMES', Generator.ORDER_ATOMIC) || 0;
1414
const branch = Generator.statementToCode(block, 'SUBSTACK') || '';
15-
return `${times}.times do\n${branch}${Generator.INDENT}wait\nend\n`;
15+
return `${times}.times do\n${branch}end\n`;
1616
};
1717

1818
Generator.control_forever = function (block) {
1919
const branch = Generator.statementToCode(block, 'SUBSTACK') || '';
20-
return `loop do\n${branch}${Generator.INDENT}wait\nend\n`;
20+
return `loop do\n${branch}end\n`;
2121
};
2222

2323
Generator.control_if = function (block) {
@@ -41,7 +41,7 @@ export default function (Generator) {
4141
Generator.control_repeat_until = function (block) {
4242
const operator = Generator.valueToCode(block, 'CONDITION', Generator.ORDER_NONE) || false;
4343
const branch = Generator.statementToCode(block, 'SUBSTACK') || '';
44-
return `until ${operator}\n${branch} wait\nend\n`;
44+
return `until ${operator}\n${branch}end\n`;
4545
};
4646

4747
Generator.control_stop = function (block) {

src/lib/ruby-to-blocks-converter/control.js

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,16 @@ const ControlConverter = {
3434
case 'repeat':
3535
if (args.length === 1 && this._isNumberOrBlock(args[0]) &&
3636
rubyBlockArgs && rubyBlockArgs.length === 0) {
37+
rubyBlock = this._removeWaitBlocks(rubyBlock);
3738
block = createControlRepeatBlock.call(this, args[0], rubyBlock);
3839
}
3940
break;
4041
case 'loop':
4142
case 'forever':
4243
if (args.length === 0 && rubyBlockArgs && rubyBlockArgs.length === 0 && rubyBlock) {
43-
let found;
44-
if (name === 'loop') {
45-
const b = this._popWaitBlock(rubyBlock);
46-
if (b) {
47-
if (b.id === rubyBlock.id) {
48-
rubyBlock = null;
49-
}
50-
found = true;
51-
}
52-
} else {
53-
found = true;
54-
}
55-
if (found) {
56-
block = this._createBlock('control_forever', 'terminate');
57-
this._addSubstack(block, rubyBlock);
58-
}
44+
rubyBlock = this._removeWaitBlocks(rubyBlock);
45+
block = this._createBlock('control_forever', 'terminate');
46+
this._addSubstack(block, rubyBlock);
5947
}
6048
break;
6149
case 'stop':
@@ -97,13 +85,8 @@ const ControlConverter = {
9785
case 'times':
9886
if (args.length === 0 &&
9987
rubyBlockArgs && rubyBlockArgs.length === 0 && rubyBlock) {
100-
const b = this._popWaitBlock(rubyBlock);
101-
if (b) {
102-
if (b.id === rubyBlock.id) {
103-
rubyBlock = null;
104-
}
105-
block = createControlRepeatBlock.call(this, receiver, rubyBlock);
106-
}
88+
rubyBlock = this._removeWaitBlocks(rubyBlock);
89+
block = createControlRepeatBlock.call(this, receiver, rubyBlock);
10790
}
10891
break;
10992
}
@@ -125,14 +108,10 @@ const ControlConverter = {
125108
},
126109

127110
onUntil: function (cond, statement) {
128-
const b = this._popWaitBlock(statement);
129-
if (!b) {
130-
return null;
131-
}
111+
statement = this._removeWaitBlocks(statement);
132112

133113
let opcode;
134-
if (b.id === statement.id) {
135-
statement = null;
114+
if (statement === null) {
136115
opcode = 'control_wait_until';
137116
} else {
138117
opcode = 'control_repeat_until';

src/lib/ruby-to-blocks-converter/index.js

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -684,26 +684,40 @@ class RubyToBlocksConverter {
684684
return b;
685685
}
686686

687-
_popWaitBlock (block) {
688-
if (!block) {
687+
_removeWaitBlocks (block) {
688+
if (!block || block === Opal.nil) {
689689
return null;
690690
}
691691

692-
const b = this._lastBlock(block);
693-
if (b.opcode === 'ruby_statement') {
694-
const textBlock = this._context.blocks[b.inputs.STATEMENT.block];
695-
if (textBlock.fields.TEXT.value === 'wait') {
696-
if (b.parent) {
697-
const parent = this._context.blocks[b.parent];
698-
if (parent.next === b.id) {
699-
parent.next = null;
700-
}
692+
let firstBlock = null;
693+
let b = block;
694+
let prev = b.parent;
695+
while (b) {
696+
let isWaitBlock = false;
697+
if (b.opcode === 'ruby_statement') {
698+
const textBlock = this._context.blocks[b.inputs.STATEMENT.block];
699+
if (textBlock.fields.TEXT.value === 'wait') {
700+
isWaitBlock = true;
701701
}
702+
}
703+
if (isWaitBlock) {
702704
delete this._context.blocks[b.id];
703-
return b;
705+
if (prev) {
706+
this._context.blocks[prev].next = null;
707+
}
708+
} else {
709+
if (firstBlock === null) {
710+
firstBlock = b;
711+
}
712+
b.parent = prev;
713+
if (prev) {
714+
this._context.blocks[prev].next = b.id;
715+
}
716+
prev = b.id;
704717
}
718+
b = this._context.blocks[b.next];
705719
}
706-
return null;
720+
return firstBlock;
707721
}
708722

709723
_getBlockType (block) {

test/integration/blocks.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ describe('Working with the blocks', () => {
238238
// wait until the new costume appears in costume item list panel
239239
await findByXpath("//div[contains(@class,'sprite-selector-item_is-selected_')]" +
240240
"//div[contains(text(), 'costume2')]");
241-
await clickText('costume2', scope.costumesTab);
241+
await clickText('costume1', scope.costumesTab);
242242
// Check that the menu has been updated
243243
await clickText('Code');
244244
await clickText('costume2', scope.blocksTab);

0 commit comments

Comments
 (0)