Skip to content

Commit 01f1346

Browse files
committed
changed occuring error if converted ruby_* block.
1 parent 9389071 commit 01f1346

File tree

3 files changed

+33
-17
lines changed

3 files changed

+33
-17
lines changed

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

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ class RubyToBlocksConverter {
109109
}
110110
blocks.forEach(block => {
111111
if (this._isBlock(block)) {
112+
if (this._isRubyBlock(block)) {
113+
throw new RubyToBlocksConverterError(
114+
block.node,
115+
`could not convert ${block.opcode}: ${this._getSource(block.node)}`
116+
);
117+
}
112118
block.topLevel = true;
113119
} else if (block instanceof Primitive) {
114120
throw new RubyToBlocksConverterError(
@@ -399,6 +405,10 @@ class RubyToBlocksConverter {
399405
return this._isBlock(block) && block.opcode === 'ruby_statement';
400406
}
401407

408+
_isRubyBlock (block) {
409+
return this._isBlock(block) && block.opcode.match(/^ruby_/);
410+
}
411+
402412
_getRubyStatement (block) {
403413
if (this._isRubyStatement(block)) {
404414
const textBlock = this._context.blocks[block.inputs.STATEMENT.block];
@@ -455,14 +465,16 @@ class RubyToBlocksConverter {
455465
return value;
456466
}
457467

458-
_createRubyExpressionBlock (expression) {
468+
_createRubyExpressionBlock (expression, node) {
459469
const block = this._createBlock('ruby_expression', 'value_boolean');
470+
block.node = node;
460471
this._addInput(block, 'EXPRESSION', this._createTextBlock(expression));
461472
return block;
462473
}
463474

464-
_createRubyStatementBlock (statement) {
475+
_createRubyStatementBlock (statement, node) {
465476
const block = this._createBlock('ruby_statement', 'statement');
477+
block.node = node;
466478
this._addInput(block, 'STATEMENT', this._createTextBlock(statement));
467479
return block;
468480
}
@@ -875,13 +887,13 @@ class RubyToBlocksConverter {
875887
rubyBlock = this._processStatement(rubyBlockNode);
876888
}
877889

878-
let block = this._callConvertersHandler('onSend', receiver, name, args, rubyBlockArgs, rubyBlock);
890+
let block = this._callConvertersHandler('onSend', receiver, name, args, rubyBlockArgs, rubyBlock, node);
879891
if (!block) {
880892
if ((this._isSelf(receiver) || receiver === Opal.nil) && !rubyBlock) {
881893
switch (name) {
882894
case 'wait':
883895
if (args.length === 0) {
884-
block = this._createRubyStatementBlock('wait');
896+
block = this._createRubyStatementBlock('wait', node);
885897
}
886898
break;
887899
}
@@ -893,11 +905,12 @@ class RubyToBlocksConverter {
893905

894906
if (rubyBlockNode) {
895907
block = this._createBlock('ruby_statement_with_block', 'statement');
908+
block.node = node;
896909
this._addTextInput(block, 'STATEMENT', this._getSource(node));
897910
this._addTextInput(block, 'ARGS', this._getSource(rubyBlockArgsNode));
898911
this._addSubstack(block, this._processStatement(rubyBlockNode));
899912
} else {
900-
block = this._createRubyStatementBlock(this._getSource(node));
913+
block = this._createRubyStatementBlock(this._getSource(node), node);
901914
}
902915
}
903916
return block;
@@ -958,6 +971,7 @@ class RubyToBlocksConverter {
958971

959972
const args = node.children.map(childNode => this._process(childNode));
960973
const block = this._createBlock('ruby_range', 'value_boolean');
974+
block.node = node;
961975
this._addNumberInput(block, 'FROM', 'math_number', args[0], 1);
962976
this._addNumberInput(block, 'TO', 'math_number', args[1], 10);
963977
return block;
@@ -968,6 +982,7 @@ class RubyToBlocksConverter {
968982

969983
const args = node.children.map(childNode => this._process(childNode));
970984
const block = this._createBlock('ruby_exclude_range', 'value_boolean');
985+
block.node = node;
971986
this._addNumberInput(block, 'FROM', 'math_number', args[0], 1);
972987
this._addNumberInput(block, 'TO', 'math_number', args[1], 10);
973988
return block;
@@ -1001,15 +1016,16 @@ class RubyToBlocksConverter {
10011016
const cond = this._processCondition(node.children[0]);
10021017
const statement = this._processStatement(node.children[1]);
10031018
let elseStatement;
1004-
if (node.children[2] !== Opal.nil || node.$loc().$else() !== Opal.nil) {
1019+
if (node.children[2] !== Opal.nil ||
1020+
(node.$loc().$else && node.$loc().$else() !== Opal.nil)) {
10051021
elseStatement = this._processStatement(node.children[2]);
10061022
}
10071023

10081024
let block = this._callConvertersHandler('onIf', cond, statement, elseStatement);
10091025
if (!block) {
10101026
this._restoreContext(saved);
10111027

1012-
block = this._createRubyStatementBlock(this._getSource(node));
1028+
block = this._createRubyStatementBlock(this._getSource(node), node);
10131029
}
10141030
return block;
10151031
}
@@ -1026,7 +1042,7 @@ class RubyToBlocksConverter {
10261042
if (!block) {
10271043
this._restoreContext(saved);
10281044

1029-
block = this._createRubyStatementBlock(this._getSource(node));
1045+
block = this._createRubyStatementBlock(this._getSource(node), node);
10301046
}
10311047
return block;
10321048
}
@@ -1044,7 +1060,7 @@ class RubyToBlocksConverter {
10441060
if (!block) {
10451061
this._restoreContext(saved);
10461062

1047-
block = this._createRubyStatementBlock(this._getSource(node));
1063+
block = this._createRubyStatementBlock(this._getSource(node), node);
10481064
}
10491065

10501066
return block;
@@ -1114,7 +1130,7 @@ class RubyToBlocksConverter {
11141130
if (!block) {
11151131
this._restoreContext(saved);
11161132

1117-
block = this._createRubyStatementBlock(this._getSource(node));
1133+
block = this._createRubyStatementBlock(this._getSource(node), node);
11181134
}
11191135

11201136
return block;
@@ -1141,7 +1157,7 @@ class RubyToBlocksConverter {
11411157
if (!block) {
11421158
this._restoreContext(saved);
11431159

1144-
block = this._createRubyStatementBlock(this._getSource(node));
1160+
block = this._createRubyStatementBlock(this._getSource(node), node);
11451161
}
11461162

11471163
return block;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const MicroBit = 'microbit';
88
*/
99
const MicroBitConverter = {
1010
// eslint-disable-next-line no-unused-vars
11-
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock) {
11+
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock, node) {
1212
let block;
1313
if ((this._isSelf(receiver) || receiver === Opal.nil) &&
1414
name === 'when' &&
@@ -61,7 +61,7 @@ const MicroBitConverter = {
6161
switch (name) {
6262
case 'microbit':
6363
if (args.length === 0) {
64-
block = this._createRubyExpressionBlock(MicroBit);
64+
block = this._createRubyExpressionBlock(MicroBit, node);
6565
}
6666
break;
6767
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const Stage = 'stage';
2929
*/
3030
const SensingConverter = {
3131
// eslint-disable-next-line no-unused-vars
32-
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock) {
32+
onSend: function (receiver, name, args, rubyBlockArgs, rubyBlock, node) {
3333
let block;
3434
if ((this._isSelf(receiver) || receiver === Opal.nil) && !rubyBlock) {
3535
switch (name) {
@@ -109,12 +109,12 @@ const SensingConverter = {
109109
break;
110110
case 'sprite':
111111
if (args.length === 1 && this._isString(args[0])) {
112-
block = this._createRubyExpressionBlock(spriteCall(args[0]));
112+
block = this._createRubyExpressionBlock(spriteCall(args[0]), node);
113113
}
114114
break;
115115
case 'stage':
116116
if (args.length === 0) {
117-
block = this._createRubyExpressionBlock(Stage);
117+
block = this._createRubyExpressionBlock(Stage, node);
118118
}
119119
break;
120120
}
@@ -168,7 +168,7 @@ const SensingConverter = {
168168
break;
169169
case '::Time':
170170
if (name === 'now' && args.length === 0) {
171-
block = this._createRubyExpressionBlock(TimeNow);
171+
block = this._createRubyExpressionBlock(TimeNow, node);
172172
}
173173
break;
174174
}

0 commit comments

Comments
 (0)