@@ -5,6 +5,8 @@ import Blockly from 'scratch-blocks';
55import RubyParser from '../ruby-parser' ;
66import Variable from 'scratch-vm/src/engine/variable' ;
77
8+ import ControlConverter from './control' ;
9+
810/**
911 * Class for Ruby's self for detecting self.
1012 */
@@ -26,6 +28,9 @@ class RubyToBlocksConverterError {
2628class RubyToBlocksConverter {
2729 constructor ( vm ) {
2830 this . vm = vm ;
31+ this . _converters = [
32+ ControlConverter
33+ ] ;
2934 this . reset ( ) ;
3035 }
3136
@@ -141,6 +146,19 @@ class RubyToBlocksConverter {
141146 this . vm . emitWorkspaceUpdate ( ) ;
142147 }
143148
149+ _callConvertersHandler ( handlerName ) {
150+ for ( let i = 0 ; i < this . _converters . length ; i ++ ) {
151+ const converter = this . _converters [ i ] ;
152+ if ( converter . hasOwnProperty ( handlerName ) ) {
153+ const block = converter [ handlerName ] . apply ( this , Array . prototype . slice . call ( arguments , 1 ) ) ;
154+ if ( block ) {
155+ return block ;
156+ }
157+ }
158+ }
159+ return null ;
160+ }
161+
144162 _saveContext ( ) {
145163 const includes = [
146164 'blocks' ,
@@ -464,6 +482,10 @@ class RubyToBlocksConverter {
464482 return block ;
465483 }
466484
485+ _isSelf ( block ) {
486+ return block === Self ;
487+ }
488+
467489 _isBlock ( block ) {
468490 try {
469491 return block . hasOwnProperty ( 'opcode' ) ;
@@ -507,7 +529,13 @@ class RubyToBlocksConverter {
507529 }
508530
509531 _isFalseOrBooleanBlock ( block ) {
510- if ( block === false || this . _getBlockType ( block ) === 'value_boolean' ) {
532+ if ( block === false ) {
533+ return true ;
534+ }
535+ if ( ! this . _isBlock ( block ) ) {
536+ return false ;
537+ }
538+ if ( this . _getBlockType ( block ) === 'value_boolean' ) {
511539 return true ;
512540 }
513541 if ( block . opcode === 'argument_reporter_string_number' ) {
@@ -553,11 +581,15 @@ class RubyToBlocksConverter {
553581 let prevBlock = null ;
554582 const blocks = [ ] ;
555583 let terminated = false ;
584+ let firstBlock ;
556585 node . children . forEach ( childNode => {
557586 const block = this . _process ( childNode ) ;
558587 if ( ! block ) {
559588 return ;
560589 }
590+ if ( ! firstBlock ) {
591+ firstBlock = block ;
592+ }
561593 switch ( this . _getBlockType ( block ) ) {
562594 case 'statement' :
563595 if ( prevBlock ) {
@@ -588,6 +620,12 @@ class RubyToBlocksConverter {
588620 break ;
589621 }
590622 } ) ;
623+ if ( blocks . length === 0 && firstBlock ) {
624+ if ( / ^ v a l u e / . test ( this . _getBlockType ( firstBlock ) ) ) {
625+ firstBlock . topLevel = false ;
626+ }
627+ blocks . push ( firstBlock ) ;
628+ }
591629 return blocks ;
592630 }
593631
@@ -600,7 +638,10 @@ class RubyToBlocksConverter {
600638 _onSend ( node , rubyBlockArgsNode , rubyBlockNode ) {
601639 const saved = this . _saveContext ( ) ;
602640
603- const receiver = this . _process ( node . children [ 0 ] ) ;
641+ let receiver = this . _process ( node . children [ 0 ] ) ;
642+ if ( _ . isArray ( receiver ) && receiver . length === 1 ) {
643+ receiver = receiver [ 0 ] ;
644+ }
604645 const name = node . children [ 1 ] . toString ( ) ;
605646 const args = node . children . slice ( 2 ) . map ( childNode => this . _process ( childNode ) ) ;
606647
@@ -750,15 +791,6 @@ class RubyToBlocksConverter {
750791 }
751792 }
752793 break ;
753- case 'loop' :
754- if ( args . length === 0 ) {
755- const waitBlock = this . _popWaitBlock ( rubyBlock ) ;
756- if ( waitBlock ) {
757- block = this . _createBlock ( 'control_forever' , 'statement' ) ;
758- this . _addSubstack ( block , rubyBlock ) ;
759- }
760- }
761- break ;
762794 case 'touching?' :
763795 if ( args . length === 1 && _ . isString ( args [ 0 ] ) ) {
764796 block = this . _createBlock ( 'sensing_touchingobject' , 'value_boolean' ) ;
@@ -1143,6 +1175,11 @@ class RubyToBlocksConverter {
11431175 break ;
11441176 }
11451177 }
1178+
1179+ if ( ! block ) {
1180+ block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock ) ;
1181+ }
1182+
11461183 if ( ! block ) {
11471184 this . _restoreContext ( saved ) ;
11481185
0 commit comments