@@ -109,6 +109,12 @@ class RubyToBlocksConverter {
109
109
}
110
110
blocks . forEach ( block => {
111
111
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
+ }
112
118
block . topLevel = true ;
113
119
} else if ( block instanceof Primitive ) {
114
120
throw new RubyToBlocksConverterError (
@@ -399,6 +405,10 @@ class RubyToBlocksConverter {
399
405
return this . _isBlock ( block ) && block . opcode === 'ruby_statement' ;
400
406
}
401
407
408
+ _isRubyBlock ( block ) {
409
+ return this . _isBlock ( block ) && block . opcode . match ( / ^ r u b y _ / ) ;
410
+ }
411
+
402
412
_getRubyStatement ( block ) {
403
413
if ( this . _isRubyStatement ( block ) ) {
404
414
const textBlock = this . _context . blocks [ block . inputs . STATEMENT . block ] ;
@@ -455,14 +465,16 @@ class RubyToBlocksConverter {
455
465
return value ;
456
466
}
457
467
458
- _createRubyExpressionBlock ( expression ) {
468
+ _createRubyExpressionBlock ( expression , node ) {
459
469
const block = this . _createBlock ( 'ruby_expression' , 'value_boolean' ) ;
470
+ block . node = node ;
460
471
this . _addInput ( block , 'EXPRESSION' , this . _createTextBlock ( expression ) ) ;
461
472
return block ;
462
473
}
463
474
464
- _createRubyStatementBlock ( statement ) {
475
+ _createRubyStatementBlock ( statement , node ) {
465
476
const block = this . _createBlock ( 'ruby_statement' , 'statement' ) ;
477
+ block . node = node ;
466
478
this . _addInput ( block , 'STATEMENT' , this . _createTextBlock ( statement ) ) ;
467
479
return block ;
468
480
}
@@ -875,13 +887,13 @@ class RubyToBlocksConverter {
875
887
rubyBlock = this . _processStatement ( rubyBlockNode ) ;
876
888
}
877
889
878
- let block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock ) ;
890
+ let block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock , node ) ;
879
891
if ( ! block ) {
880
892
if ( ( this . _isSelf ( receiver ) || receiver === Opal . nil ) && ! rubyBlock ) {
881
893
switch ( name ) {
882
894
case 'wait' :
883
895
if ( args . length === 0 ) {
884
- block = this . _createRubyStatementBlock ( 'wait' ) ;
896
+ block = this . _createRubyStatementBlock ( 'wait' , node ) ;
885
897
}
886
898
break ;
887
899
}
@@ -893,11 +905,12 @@ class RubyToBlocksConverter {
893
905
894
906
if ( rubyBlockNode ) {
895
907
block = this . _createBlock ( 'ruby_statement_with_block' , 'statement' ) ;
908
+ block . node = node ;
896
909
this . _addTextInput ( block , 'STATEMENT' , this . _getSource ( node ) ) ;
897
910
this . _addTextInput ( block , 'ARGS' , this . _getSource ( rubyBlockArgsNode ) ) ;
898
911
this . _addSubstack ( block , this . _processStatement ( rubyBlockNode ) ) ;
899
912
} else {
900
- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
913
+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
901
914
}
902
915
}
903
916
return block ;
@@ -958,6 +971,7 @@ class RubyToBlocksConverter {
958
971
959
972
const args = node . children . map ( childNode => this . _process ( childNode ) ) ;
960
973
const block = this . _createBlock ( 'ruby_range' , 'value_boolean' ) ;
974
+ block . node = node ;
961
975
this . _addNumberInput ( block , 'FROM' , 'math_number' , args [ 0 ] , 1 ) ;
962
976
this . _addNumberInput ( block , 'TO' , 'math_number' , args [ 1 ] , 10 ) ;
963
977
return block ;
@@ -968,6 +982,7 @@ class RubyToBlocksConverter {
968
982
969
983
const args = node . children . map ( childNode => this . _process ( childNode ) ) ;
970
984
const block = this . _createBlock ( 'ruby_exclude_range' , 'value_boolean' ) ;
985
+ block . node = node ;
971
986
this . _addNumberInput ( block , 'FROM' , 'math_number' , args [ 0 ] , 1 ) ;
972
987
this . _addNumberInput ( block , 'TO' , 'math_number' , args [ 1 ] , 10 ) ;
973
988
return block ;
@@ -1001,15 +1016,16 @@ class RubyToBlocksConverter {
1001
1016
const cond = this . _processCondition ( node . children [ 0 ] ) ;
1002
1017
const statement = this . _processStatement ( node . children [ 1 ] ) ;
1003
1018
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 ) ) {
1005
1021
elseStatement = this . _processStatement ( node . children [ 2 ] ) ;
1006
1022
}
1007
1023
1008
1024
let block = this . _callConvertersHandler ( 'onIf' , cond , statement , elseStatement ) ;
1009
1025
if ( ! block ) {
1010
1026
this . _restoreContext ( saved ) ;
1011
1027
1012
- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1028
+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
1013
1029
}
1014
1030
return block ;
1015
1031
}
@@ -1026,7 +1042,7 @@ class RubyToBlocksConverter {
1026
1042
if ( ! block ) {
1027
1043
this . _restoreContext ( saved ) ;
1028
1044
1029
- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1045
+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
1030
1046
}
1031
1047
return block ;
1032
1048
}
@@ -1044,7 +1060,7 @@ class RubyToBlocksConverter {
1044
1060
if ( ! block ) {
1045
1061
this . _restoreContext ( saved ) ;
1046
1062
1047
- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1063
+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
1048
1064
}
1049
1065
1050
1066
return block ;
@@ -1114,7 +1130,7 @@ class RubyToBlocksConverter {
1114
1130
if ( ! block ) {
1115
1131
this . _restoreContext ( saved ) ;
1116
1132
1117
- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1133
+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
1118
1134
}
1119
1135
1120
1136
return block ;
@@ -1141,7 +1157,7 @@ class RubyToBlocksConverter {
1141
1157
if ( ! block ) {
1142
1158
this . _restoreContext ( saved ) ;
1143
1159
1144
- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1160
+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
1145
1161
}
1146
1162
1147
1163
return block ;
0 commit comments