diff --git a/HISTORY.md b/HISTORY.md index f697b393..bf7375c0 100755 --- a/HISTORY.md +++ b/HISTORY.md @@ -11,6 +11,9 @@ * Norwegian, thanks, Olav! * German +### 2020-09-04 +* byob, blocks, objects: refactored scanning for message senders + ### 2020-09-03 * byob: experimental: Inspect & export dependencies for global custom blocks (shift-right-click for context menu) * byob: new feature: "export block definition" including dependencies diff --git a/snap.html b/snap.html index 15ca19e2..fc285fd8 100755 --- a/snap.html +++ b/snap.html @@ -8,13 +8,13 @@ - + - + - + diff --git a/src/blocks.js b/src/blocks.js index 75b7a7fa..1305afac 100644 --- a/src/blocks.js +++ b/src/blocks.js @@ -158,7 +158,7 @@ CustomCommandBlockMorph, SymbolMorph, ToggleButtonMorph, DialMorph*/ // Global stuff //////////////////////////////////////////////////////// -modules.blocks = '2020-September-03'; +modules.blocks = '2020-September-04'; var SyntaxElementMorph; var BlockMorph; @@ -3173,6 +3173,37 @@ BlockMorph.prototype.showMessageUsers = function () { } }; +BlockMorph.prototype.isSending = function (message, receiverName, known = []) { + if (typeof message === 'number') { + message = message.toString(); + } + return this.allChildren().some(morph => { + var event, eventReceiver; + if (morph.isCustomBlock && + morph.isGlobal && + contains(known, morph.definition) + ) { + return true; + } + if ((morph.selector) && + contains( + ['doBroadcast', 'doBroadcastAndWait', 'doSend'], + morph.selector) + ) { + event = morph.inputs()[0].evaluate(); + if (morph.selector === 'doSend') { + eventReceiver = morph.inputs()[1].evaluate(); + } + return ((morph.selector !== 'doSend') || + (receiverName === eventReceiver)) && + ((event === message) || + (message instanceof Array && + message[0] === 'any message')); + } + return false; + }); +}; + BlockMorph.prototype.developersMenu = function () { var menu = BlockMorph.uber.developersMenu.call(this); menu.addLine(); diff --git a/src/byob.js b/src/byob.js index b0460938..2ba20d1f 100644 --- a/src/byob.js +++ b/src/byob.js @@ -107,7 +107,7 @@ WatcherMorph, Variable, BooleanSlotMorph, XML_Serializer, SnapTranslator*/ // Global stuff //////////////////////////////////////////////////////// -modules.byob = '2020-September-03'; +modules.byob = '2020-September-04'; // Declarations @@ -589,32 +589,9 @@ CustomBlockDefinition.prototype.collectDependencies = function ( }; CustomBlockDefinition.prototype.isSending = function (message, receiverName) { - if (typeof message === 'number') { - message = message.toString(); - } return this.scripts.concat( this.body ? [this.body.expression] : [] - ).some(script => - script.allChildren().some(morph => { - var event, eventReceiver; - if ((morph.selector) && - contains( - ['doBroadcast', 'doBroadcastAndWait', 'doSend'], - morph.selector) - ) { - event = morph.inputs()[0].evaluate(); - if (morph.selector === 'doSend') { - eventReceiver = morph.inputs()[1].evaluate(); - } - return ((morph.selector !== 'doSend') || - (receiverName === eventReceiver)) && - ((event === message) || - (message instanceof Array && - message[0] === 'any message')); - } - return false; - }) - ); + ).some(script => script.isSending(message, receiverName)); }; // CustomCommandBlockMorph ///////////////////////////////////////////// diff --git a/src/objects.js b/src/objects.js index aee2b763..dcd744d4 100644 --- a/src/objects.js +++ b/src/objects.js @@ -84,7 +84,7 @@ BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, BooleanSlotMorph, localize, TableMorph, TableFrameMorph, normalizeCanvas, VectorPaintEditorMorph, HandleMorph, AlignmentMorph, Process, XML_Element, WorldMap, copyCanvas*/ -modules.objects = '2020-September-03'; +modules.objects = '2020-September-04'; var SpriteMorph; var StageMorph; @@ -5774,35 +5774,8 @@ SpriteMorph.prototype.allMessageNames = function () { }; SpriteMorph.prototype.allSendersOf = function (message, receiverName, known) { - if (typeof message === 'number') { - message = message.toString(); - } return this.allScripts().filter(script => - script.allChildren().some(morph => { - var event, eventReceiver; - if (morph.isCustomBlock && - morph.isGlobal && - contains(known, morph.definition) - ) { - return true; - } - if ((morph.selector) && - contains( - ['doBroadcast', 'doBroadcastAndWait', 'doSend'], - morph.selector) - ) { - event = morph.inputs()[0].evaluate(); - if (morph.selector === 'doSend') { - eventReceiver = morph.inputs()[1].evaluate(); - } - return ((morph.selector !== 'doSend') || - (receiverName === eventReceiver)) && - ((event === message) || - (message instanceof Array && - message[0] === 'any message')); - } - return false; - }) + script.isSending(message, receiverName, known) ); };