Merge pull request #1586 from mzgoddard/variable-id-type

conflict workaround for variables and lists of the same name
This commit is contained in:
Andrew Sliwinski 2018-10-01 18:27:59 -04:00 committed by GitHub
commit 7a28d5e41d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 17 additions and 12 deletions

View file

@ -198,18 +198,18 @@ const parseScripts = function (scripts, blocks, addBroadcastMsg, getVariableId,
*/ */
const generateVariableIdGetter = (function () { const generateVariableIdGetter = (function () {
let globalVariableNameMap = {}; let globalVariableNameMap = {};
const namer = (targetId, name) => `${targetId}-${name}`; const namer = (targetId, name, type) => `${targetId}-${name}-${type}`;
return function (targetId, topLevel) { return function (targetId, topLevel) {
// Reset the global variable map if topLevel // Reset the global variable map if topLevel
if (topLevel) globalVariableNameMap = {}; if (topLevel) globalVariableNameMap = {};
return function (name) { return function (name, type) {
if (topLevel) { // Store the name/id pair in the globalVariableNameMap if (topLevel) { // Store the name/id pair in the globalVariableNameMap
globalVariableNameMap[name] = namer(targetId, name); globalVariableNameMap[`${name}-${type}`] = namer(targetId, name, type);
return globalVariableNameMap[name]; return globalVariableNameMap[`${name}-${type}`];
} }
// Not top-level, so first check the global name map // Not top-level, so first check the global name map
if (globalVariableNameMap[name]) return globalVariableNameMap[name]; if (globalVariableNameMap[`${name}-${type}`]) return globalVariableNameMap[`${name}-${type}`];
return namer(targetId, name); return namer(targetId, name, type);
}; };
}; };
}()); }());
@ -282,8 +282,10 @@ const parseMonitorObject = (object, runtime, targets, extensions) => {
// Monitor blocks have special IDs to match the toolbox obtained from the getId // Monitor blocks have special IDs to match the toolbox obtained from the getId
// function in the runtime.monitorBlocksInfo. Variable monitors, however, // function in the runtime.monitorBlocksInfo. Variable monitors, however,
// get their IDs from the variable id they reference. // get their IDs from the variable id they reference.
if (object.cmd === 'getVar:' || object.cmd === 'contentsOfList:') { if (object.cmd === 'getVar:') {
block.id = getVariableId(object.param); block.id = getVariableId(object.param, Variable.SCALAR_TYPE);
} else if (object.cmd === 'contentsOfList:') {
block.id = getVariableId(object.param, Variable.LIST_TYPE);
} else if (runtime.monitorBlockInfo.hasOwnProperty(block.opcode)) { } else if (runtime.monitorBlockInfo.hasOwnProperty(block.opcode)) {
block.id = runtime.monitorBlockInfo[block.opcode].getId(target.id, object.param); block.id = runtime.monitorBlockInfo[block.opcode].getId(target.id, object.param);
} }
@ -452,7 +454,7 @@ const parseScratchObject = function (object, runtime, extensions, topLevel, zip)
for (let j = 0; j < object.variables.length; j++) { for (let j = 0; j < object.variables.length; j++) {
const variable = object.variables[j]; const variable = object.variables[j];
const newVariable = new Variable( const newVariable = new Variable(
getVariableId(variable.name), getVariableId(variable.name, Variable.SCALAR_TYPE),
variable.name, variable.name,
Variable.SCALAR_TYPE, Variable.SCALAR_TYPE,
variable.isPersistent variable.isPersistent
@ -544,7 +546,7 @@ const parseScratchObject = function (object, runtime, extensions, topLevel, zip)
for (let k = 0; k < object.lists.length; k++) { for (let k = 0; k < object.lists.length; k++) {
const list = object.lists[k]; const list = object.lists[k];
const newVariable = new Variable( const newVariable = new Variable(
getVariableId(list.listName), getVariableId(list.listName, Variable.LIST_TYPE),
list.listName, list.listName,
Variable.LIST_TYPE, Variable.LIST_TYPE,
false false
@ -982,9 +984,12 @@ const parseBlock = function (sb2block, addBroadcastMsg, getVariableId, extension
value: providedArg value: providedArg
}; };
if (expectedArg.fieldName === 'VARIABLE' || expectedArg.fieldName === 'LIST') { if (expectedArg.fieldName === 'VARIABLE') {
// Add `id` property to variable fields // Add `id` property to variable fields
activeBlock.fields[expectedArg.fieldName].id = getVariableId(providedArg); activeBlock.fields[expectedArg.fieldName].id = getVariableId(providedArg, Variable.SCALAR_TYPE);
} else if (expectedArg.fieldName === 'LIST') {
// Add `id` property to variable fields
activeBlock.fields[expectedArg.fieldName].id = getVariableId(providedArg, Variable.LIST_TYPE);
} else if (expectedArg.fieldName === 'BROADCAST_OPTION') { } else if (expectedArg.fieldName === 'BROADCAST_OPTION') {
// Add the name in this field to the broadcast msg name map. // Add the name in this field to the broadcast msg name map.
// Also need to provide the fields[fieldName] object, // Also need to provide the fields[fieldName] object,

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.