Skip to content

Commit 2fcaf7c

Browse files
committed
Fix JSON block issues with variables and allow any value to be used in objects and arrays
1 parent 237f54c commit 2fcaf7c

File tree

2 files changed

+7
-10
lines changed

2 files changed

+7
-10
lines changed

src/blocks/scratch3_json.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,11 @@ class Scratch3JSONBlocks {
111111

112112
indexOfValue (args) {
113113
args.ARR = Cast.toArray(args.ARR);
114-
args.VALUE = Cast.toString(args.VALUE);
115114
return args.ARR.indexOf(args.VALUE) !== -1 ? args.ARR.indexOf(args.VALUE) : "";
116115
}
117116

118117
addItem (args) {
119118
args.ARR = Cast.toArray(args.ARR);
120-
args.ITEM = Cast.toString(args.ITEM);
121119
args.ARR.push(args.ITEM);
122120
return args.ARR;
123121
}
@@ -158,7 +156,6 @@ class Scratch3JSONBlocks {
158156

159157
hasItem (args) {
160158
args.ARR = Cast.toArray(args.ARR);
161-
args.ITEM = Cast.toString(args.ITEM);
162159
return args.ARR.includes(args.ITEM);
163160
}
164161
}

src/compiler/jsgen.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -528,9 +528,9 @@ class JSGenerator {
528528
case 'json.valueOfKey':
529529
return new TypedInput(`(${this.descendInput(node.object).asObject()}[${this.descendInput(node.key).asString()}] ?? "")`, TYPE_STRING);
530530
case 'json.setKey':
531-
return new TypedInput(`(object = ${this.descendInput(node.object).asObject()}, object[${this.descendInput(node.key).asString()}] = ${this.descendInput(node.value).asString()}, object)`, TYPE_OBJECT);
531+
return new TypedInput(`(object = {...${this.descendInput(node.object).asObject()}}, object[${this.descendInput(node.key).asString()}] = ${this.descendInput(node.value).asUnknown()}, object)`, TYPE_OBJECT);
532532
case 'json.deleteKey':
533-
return new TypedInput(`(object = ${this.descendInput(node.object).asObject()}, delete object[${this.descendInput(node.key).asString()}], object)`, TYPE_OBJECT);
533+
return new TypedInput(`(object = {...${this.descendInput(node.object).asObject()}}, delete object[${this.descendInput(node.key).asString()}], object)`, TYPE_OBJECT);
534534
case 'json.mergeObject':
535535
return new TypedInput(`{...${this.descendInput(node.object1).asObject()}, ...${this.descendInput(node.object2).asObject()}}`, TYPE_OBJECT);
536536
case 'json.hasKey':
@@ -542,19 +542,19 @@ class JSGenerator {
542542
case 'json.valueOfIndex':
543543
return new TypedInput(`(${this.descendInput(node.array).asArray()}[${this.descendInput(node.index).asNumber()}] ?? "")`, TYPE_STRING);
544544
case 'json.indexOfValue':
545-
return new TypedInput(`(${this.descendInput(node.array).asArray()}.indexOf(${this.descendInput(node.value).asString()}) !== -1 ? ${this.descendInput(node.array).asArray()}.indexOf(${this.descendInput(node.value).asString()}) : "")`, TYPE_STRING);
545+
return new TypedInput(`(${this.descendInput(node.array).asArray()}.indexOf(${this.descendInput(node.value).asUnknown()}) !== -1 ? ${this.descendInput(node.array).asArray()}.indexOf(${this.descendInput(node.value).asUnknown()}) : "")`, TYPE_NUMBER);
546546
case 'json.addItem':
547-
return new TypedInput(`(array = ${this.descendInput(node.array).asArray()}, array.push(${this.descendInput(node.item).asString()}), array)`, TYPE_ARRAY);
547+
return new TypedInput(`(array = [...${this.descendInput(node.array).asArray()}], array.push(${this.descendInput(node.item).asUnknown()}), array)`, TYPE_ARRAY);
548548
case 'json.replaceIndex':
549-
return new TypedInput(`(${this.descendInput(node.index).asNumber()} >= 0 && ${this.descendInput(node.index).asNumber()} < ${this.descendInput(node.array).asArray()}.length ? (array = ${this.descendInput(node.array).asArray()}, array[${this.descendInput(node.index).asNumber()}] = ${this.descendInput(node.item).asString()}, array) : new Array())`, TYPE_ARRAY);
549+
return new TypedInput(`(${this.descendInput(node.index).asNumber()} >= 0 && ${this.descendInput(node.index).asNumber()} < ${this.descendInput(node.array).asArray()}.length ? (array = [...${this.descendInput(node.array).asArray()}], array[${this.descendInput(node.index).asNumber()}] = ${this.descendInput(node.item).asUnknown()}, array) : new Array())`, TYPE_ARRAY);
550550
case 'json.deleteIndex':
551-
return new TypedInput(`(${this.descendInput(node.index).asNumber()} >= 0 && ${this.descendInput(node.index).asNumber()} < ${this.descendInput(node.array).asArray()}.length ? (array = ${this.descendInput(node.array).asArray()}, array.splice(${this.descendInput(node.index).asNumber()}, 1), array) : new Array())`, TYPE_ARRAY);
551+
return new TypedInput(`(${this.descendInput(node.index).asNumber()} >= 0 && ${this.descendInput(node.index).asNumber()} < ${this.descendInput(node.array).asArray()}.length ? (array = [...${this.descendInput(node.array).asArray()}], array.splice(${this.descendInput(node.index).asNumber()}, 1), array) : new Array())`, TYPE_ARRAY);
552552
case 'json.deleteAllOccurrences':
553553
return new TypedInput(`${this.descendInput(node.array).asArray()}.filter((item) => item !== ${this.descendInput(node.item).asString()})`, TYPE_ARRAY);
554554
case 'json.mergeArray':
555555
return new TypedInput(`[...${this.descendInput(node.array1).asArray()}, ...${this.descendInput(node.array2).asArray()}]`, TYPE_ARRAY);
556556
case 'json.hasItem':
557-
return new TypedInput(`${this.descendInput(node.array).asArray()}.includes(${this.descendInput(node.item).asString()})`, TYPE_BOOLEAN);
557+
return new TypedInput(`${this.descendInput(node.array).asArray()}.includes(${this.descendInput(node.item).asUnknown()})`, TYPE_BOOLEAN);
558558

559559
case 'looks.size':
560560
return new TypedInput('Math.round(target.size)', TYPE_NUMBER);

0 commit comments

Comments
 (0)