@@ -119,6 +119,15 @@ class RubyToBlocksConverter {
119119 throw new Error ( `invalid block: ${ block } ` ) ;
120120 }
121121 } ) ;
122+ Object . keys ( this . _context . blocks ) . forEach ( blockId => {
123+ const block = this . _context . blocks [ blockId ] ;
124+ if ( this . _isRubyBlock ( block ) ) {
125+ throw new RubyToBlocksConverterError (
126+ block . node ,
127+ `could not convert ${ block . opcode } : ${ this . _getSource ( block . node ) } `
128+ ) ;
129+ }
130+ } ) ;
122131 return true ;
123132 } catch ( e ) {
124133 let error ;
@@ -399,6 +408,10 @@ class RubyToBlocksConverter {
399408 return this . _isBlock ( block ) && block . opcode === 'ruby_statement' ;
400409 }
401410
411+ _isRubyBlock ( block ) {
412+ return this . _isBlock ( block ) && block . opcode . match ( / ^ r u b y _ / ) ;
413+ }
414+
402415 _getRubyStatement ( block ) {
403416 if ( this . _isRubyStatement ( block ) ) {
404417 const textBlock = this . _context . blocks [ block . inputs . STATEMENT . block ] ;
@@ -455,14 +468,16 @@ class RubyToBlocksConverter {
455468 return value ;
456469 }
457470
458- _createRubyExpressionBlock ( expression ) {
471+ _createRubyExpressionBlock ( expression , node ) {
459472 const block = this . _createBlock ( 'ruby_expression' , 'value_boolean' ) ;
473+ block . node = node ;
460474 this . _addInput ( block , 'EXPRESSION' , this . _createTextBlock ( expression ) ) ;
461475 return block ;
462476 }
463477
464- _createRubyStatementBlock ( statement ) {
478+ _createRubyStatementBlock ( statement , node ) {
465479 const block = this . _createBlock ( 'ruby_statement' , 'statement' ) ;
480+ block . node = node ;
466481 this . _addInput ( block , 'STATEMENT' , this . _createTextBlock ( statement ) ) ;
467482 return block ;
468483 }
@@ -875,13 +890,13 @@ class RubyToBlocksConverter {
875890 rubyBlock = this . _processStatement ( rubyBlockNode ) ;
876891 }
877892
878- let block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock ) ;
893+ let block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock , node ) ;
879894 if ( ! block ) {
880895 if ( ( this . _isSelf ( receiver ) || receiver === Opal . nil ) && ! rubyBlock ) {
881896 switch ( name ) {
882897 case 'wait' :
883898 if ( args . length === 0 ) {
884- block = this . _createRubyStatementBlock ( 'wait' ) ;
899+ block = this . _createRubyStatementBlock ( 'wait' , node ) ;
885900 }
886901 break ;
887902 }
@@ -893,11 +908,12 @@ class RubyToBlocksConverter {
893908
894909 if ( rubyBlockNode ) {
895910 block = this . _createBlock ( 'ruby_statement_with_block' , 'statement' ) ;
911+ block . node = node ;
896912 this . _addTextInput ( block , 'STATEMENT' , this . _getSource ( node ) ) ;
897913 this . _addTextInput ( block , 'ARGS' , this . _getSource ( rubyBlockArgsNode ) ) ;
898914 this . _addSubstack ( block , this . _processStatement ( rubyBlockNode ) ) ;
899915 } else {
900- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
916+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
901917 }
902918 }
903919 return block ;
@@ -958,6 +974,7 @@ class RubyToBlocksConverter {
958974
959975 const args = node . children . map ( childNode => this . _process ( childNode ) ) ;
960976 const block = this . _createBlock ( 'ruby_range' , 'value_boolean' ) ;
977+ block . node = node ;
961978 this . _addNumberInput ( block , 'FROM' , 'math_number' , args [ 0 ] , 1 ) ;
962979 this . _addNumberInput ( block , 'TO' , 'math_number' , args [ 1 ] , 10 ) ;
963980 return block ;
@@ -968,6 +985,7 @@ class RubyToBlocksConverter {
968985
969986 const args = node . children . map ( childNode => this . _process ( childNode ) ) ;
970987 const block = this . _createBlock ( 'ruby_exclude_range' , 'value_boolean' ) ;
988+ block . node = node ;
971989 this . _addNumberInput ( block , 'FROM' , 'math_number' , args [ 0 ] , 1 ) ;
972990 this . _addNumberInput ( block , 'TO' , 'math_number' , args [ 1 ] , 10 ) ;
973991 return block ;
@@ -1001,15 +1019,16 @@ class RubyToBlocksConverter {
10011019 const cond = this . _processCondition ( node . children [ 0 ] ) ;
10021020 const statement = this . _processStatement ( node . children [ 1 ] ) ;
10031021 let elseStatement ;
1004- if ( node . children [ 2 ] !== Opal . nil || node . $loc ( ) . $else ( ) !== Opal . nil ) {
1022+ if ( node . children [ 2 ] !== Opal . nil ||
1023+ ( node . $loc ( ) . $else && node . $loc ( ) . $else ( ) !== Opal . nil ) ) {
10051024 elseStatement = this . _processStatement ( node . children [ 2 ] ) ;
10061025 }
10071026
10081027 let block = this . _callConvertersHandler ( 'onIf' , cond , statement , elseStatement ) ;
10091028 if ( ! block ) {
10101029 this . _restoreContext ( saved ) ;
10111030
1012- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1031+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
10131032 }
10141033 return block ;
10151034 }
@@ -1026,7 +1045,7 @@ class RubyToBlocksConverter {
10261045 if ( ! block ) {
10271046 this . _restoreContext ( saved ) ;
10281047
1029- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1048+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
10301049 }
10311050 return block ;
10321051 }
@@ -1044,7 +1063,7 @@ class RubyToBlocksConverter {
10441063 if ( ! block ) {
10451064 this . _restoreContext ( saved ) ;
10461065
1047- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1066+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
10481067 }
10491068
10501069 return block ;
@@ -1114,7 +1133,7 @@ class RubyToBlocksConverter {
11141133 if ( ! block ) {
11151134 this . _restoreContext ( saved ) ;
11161135
1117- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1136+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
11181137 }
11191138
11201139 return block ;
@@ -1141,7 +1160,7 @@ class RubyToBlocksConverter {
11411160 if ( ! block ) {
11421161 this . _restoreContext ( saved ) ;
11431162
1144- block = this . _createRubyStatementBlock ( this . _getSource ( node ) ) ;
1163+ block = this . _createRubyStatementBlock ( this . _getSource ( node ) , node ) ;
11451164 }
11461165
11471166 return block ;
0 commit comments