@@ -104,7 +104,12 @@ class RubyToBlocksConverter {
104
104
MyBlocksConverter ,
105
105
MakeyMakeyConverter
106
106
] ;
107
+ this . _receiverToMethods = { } ;
107
108
this . reset ( ) ;
109
+
110
+ this . _converters . forEach ( x => {
111
+ if ( x . hasOwnProperty ( 'register' ) ) x . register ( this ) ;
112
+ } ) ;
108
113
}
109
114
110
115
get errors ( ) {
@@ -270,6 +275,79 @@ class RubyToBlocksConverter {
270
275
} ) ;
271
276
}
272
277
278
+ registerCallMethod ( receiverName , name , numArgs , createBlockFunc ) {
279
+ if ( receiverName === 'self' ) {
280
+ this . registerCallMethod ( 'sprite' , name , numArgs , createBlockFunc ) ;
281
+ this . registerCallMethod ( 'stage' , name , numArgs , createBlockFunc ) ;
282
+ return ;
283
+ }
284
+ let methodToNumArgs = this . _receiverToMethods [ receiverName ] ;
285
+ if ( ! methodToNumArgs ) methodToNumArgs = this . _receiverToMethods [ receiverName ] = { } ;
286
+
287
+ let numArgsToCreateBlockFuncs = methodToNumArgs [ name ] ;
288
+ if ( ! numArgsToCreateBlockFuncs ) numArgsToCreateBlockFuncs = methodToNumArgs [ name ] = { } ;
289
+
290
+ let createBlockFuncs = numArgsToCreateBlockFuncs [ numArgs ] ;
291
+ if ( ! createBlockFuncs ) createBlockFuncs = numArgsToCreateBlockFuncs [ numArgs ] = [ ] ;
292
+
293
+ createBlockFuncs . push ( createBlockFunc ) ;
294
+ }
295
+
296
+ _callMethod ( receiver , name , args , rubyBlockArgs , rubyBlock , node ) {
297
+ const receiverName = this . _getReceiverName ( receiver ) ;
298
+ if ( ! receiverName ) return null ;
299
+
300
+ const methodToNumArgs = this . _receiverToMethods [ receiverName ] ;
301
+ if ( ! methodToNumArgs ) return null ;
302
+
303
+ const numArgsToCreateBlockFuncs = methodToNumArgs [ name ] ;
304
+ if ( ! numArgsToCreateBlockFuncs ) return null ;
305
+
306
+ const createBlockFuncs = numArgsToCreateBlockFuncs [ args . length ] ;
307
+ if ( ! createBlockFuncs ) return null ;
308
+
309
+ const params = {
310
+ receiver : receiver ,
311
+ receiverName : receiverName ,
312
+ name : name ,
313
+ args : args ,
314
+ rubyBlockArgs : rubyBlockArgs ,
315
+ rubyBlock : rubyBlock ,
316
+ node : node
317
+ } ;
318
+ for ( let i = 0 ; i < createBlockFuncs . length ; i ++ ) {
319
+ const createBlockFunc = createBlockFuncs [ i ] ;
320
+ const block = createBlockFunc . apply ( this , [ params ] ) ;
321
+ if ( block ) return block ;
322
+ }
323
+
324
+ return null ;
325
+ }
326
+
327
+ _getReceiverName ( receiver ) {
328
+ if ( this . _isSelf ( receiver ) || receiver === Opal . nil ) {
329
+ if ( this . _context . target && this . _context . target . isStage ) {
330
+ return 'stage' ;
331
+ }
332
+ return 'sprite' ;
333
+ }
334
+
335
+ if ( this . _isBlock ( receiver ) && receiver . opcode === 'ruby_expression' ) {
336
+ const textBlock = this . _context . blocks [ receiver . inputs . EXPRESSION . block ] ;
337
+ return textBlock . fields . TEXT . value ;
338
+ }
339
+
340
+ return null ;
341
+ }
342
+
343
+ createBlock ( opcode , type , attributes = { } ) {
344
+ return this . _createBlock ( opcode , type , attributes ) ;
345
+ }
346
+
347
+ setParent ( block , parent ) {
348
+ return this . _setParent ( block , parent ) ;
349
+ }
350
+
273
351
_callConvertersHandler ( handlerName , ...args ) {
274
352
for ( let i = 0 ; i < this . _converters . length ; i ++ ) {
275
353
const converter = this . _converters [ i ] ;
@@ -386,6 +464,10 @@ class RubyToBlocksConverter {
386
464
return block instanceof Primitive && block . type === 'self' ;
387
465
}
388
466
467
+ isString ( value ) {
468
+ return this . _isString ( value ) ;
469
+ }
470
+
389
471
_isString ( value ) {
390
472
return _ . isString ( value ) || ( value && value . type === 'str' ) ;
391
473
}
@@ -434,6 +516,10 @@ class RubyToBlocksConverter {
434
516
return / ^ v a l u e / . test ( this . _getBlockType ( block ) ) ;
435
517
}
436
518
519
+ isNumberOrBlock ( numberOrBlock ) {
520
+ return this . _isNumberOrBlock ( numberOrBlock ) ;
521
+ }
522
+
437
523
_isNumberOrBlock ( numberOrBlock ) {
438
524
return this . _isNumber ( numberOrBlock ) || this . _isValueBlock ( numberOrBlock ) ;
439
525
}
@@ -565,6 +651,10 @@ class RubyToBlocksConverter {
565
651
return block ;
566
652
}
567
653
654
+ addField ( block , name , value , attributes = { } ) {
655
+ return this . _addField ( block , name , value , attributes ) ;
656
+ }
657
+
568
658
_addField ( block , name , value , attributes = { } ) {
569
659
if ( ! this . _isBlock ( block ) ) {
570
660
return ;
@@ -594,6 +684,10 @@ class RubyToBlocksConverter {
594
684
} ;
595
685
}
596
686
687
+ addNumberInput ( block , name , opcode , inputValue , shadowValue ) {
688
+ return this . _addNumberInput ( block , name , opcode , inputValue , shadowValue ) ;
689
+ }
690
+
597
691
_addNumberInput ( block , name , opcode , inputValue , shadowValue ) {
598
692
let shadowBlock ;
599
693
if ( ! this . _isNumber ( inputValue ) ) {
@@ -696,6 +790,10 @@ class RubyToBlocksConverter {
696
790
return this . _lookupOrCreateVariableOrList ( name , Variable . LIST_TYPE ) ;
697
791
}
698
792
793
+ lookupOrCreateBroadcastMsg ( name ) {
794
+ return this . _lookupOrCreateBroadcastMsg ( name ) ;
795
+ }
796
+
699
797
_lookupOrCreateBroadcastMsg ( name ) {
700
798
name = name . toString ( ) ;
701
799
const key = name . toLowerCase ( ) ;
@@ -996,7 +1094,10 @@ class RubyToBlocksConverter {
996
1094
rubyBlock = this . _processStatement ( rubyBlockNode ) ;
997
1095
}
998
1096
999
- let block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock , node ) ;
1097
+ let block = this . _callMethod ( receiver , name , args , rubyBlockArgs , rubyBlock , node ) ;
1098
+ if ( ! block ) {
1099
+ block = this . _callConvertersHandler ( 'onSend' , receiver , name , args , rubyBlockArgs , rubyBlock , node ) ;
1100
+ }
1000
1101
if ( ! block ) {
1001
1102
if ( ( this . _isSelf ( receiver ) || receiver === Opal . nil ) && ! rubyBlock ) {
1002
1103
switch ( name ) {
0 commit comments