From 68261e5dd932f109afe07768fe0303e2e836b62e Mon Sep 17 00:00:00 2001 From: Maribeth Bottorff Date: Thu, 31 Aug 2023 10:49:17 -0700 Subject: [PATCH] feat: add getVariableName and getProcedureName to CodeGenerator (#7445) * feat: add getVariableName and getProcedureName to CodeGenerator * feat: make nameDB_ public * feat: update block code generators to use new APIs * chore: fix build * chore: remove unused imports --- core/generator.ts | 38 ++++++++++++++++++++++++++- generators/dart/loops.js | 6 ++--- generators/dart/math.js | 4 +-- generators/dart/procedures.js | 9 +++---- generators/dart/text.js | 4 +-- generators/dart/variables.js | 7 ++--- generators/javascript/loops.js | 7 +++-- generators/javascript/math.js | 4 +-- generators/javascript/procedures.js | 9 +++---- generators/javascript/text.js | 4 +-- generators/javascript/variables.js | 7 ++--- generators/lua/loops.js | 6 ++--- generators/lua/math.js | 4 +-- generators/lua/procedures.js | 9 +++---- generators/lua/text.js | 4 +-- generators/lua/variables.js | 7 ++--- generators/php/loops.js | 5 ++-- generators/php/math.js | 4 +-- generators/php/procedures.js | 13 +++++---- generators/php/text.js | 4 +-- generators/php/variables.js | 7 ++--- generators/python/loops.js | 6 ++--- generators/python/math.js | 5 +--- generators/python/procedures.js | 13 +++++---- generators/python/python_generator.js | 4 +-- generators/python/text.js | 3 +-- generators/python/variables.js | 7 ++--- tests/mocha/generator_test.js | 31 ++++++++++++++++++++++ 28 files changed, 122 insertions(+), 109 deletions(-) diff --git a/core/generator.ts b/core/generator.ts index 10b05e28fdd..c50a2485367 100644 --- a/core/generator.ts +++ b/core/generator.ts @@ -108,7 +108,7 @@ export class CodeGenerator { protected functionNames_: {[key: string]: string} = Object.create(null); /** A database of variable and procedure names. */ - protected nameDB_?: Names = undefined; + nameDB_?: Names = undefined; /** @param name Language name of this generator. */ constructor(name: string) { @@ -494,6 +494,42 @@ export class CodeGenerator { return this.functionNames_[desiredName]; } + /** + * Gets a unique, legal name for a user-defined variable. + * Before calling this method, the `nameDB_` property of the class + * must have been initialized already. This is typically done in + * the `init` function of the code generator class. + * + * @param nameOrId The ID of the variable to get a name for, + * or the proposed name for a variable not associated with an id. + * @returns A unique, legal name for the variable. + */ + getVariableName(nameOrId: string): string { + return this.getName(nameOrId, NameType.VARIABLE); + } + + /** + * Gets a unique, legal name for a user-defined procedure. + * Before calling this method, the `nameDB_` property of the class + * must have been initialized already. This is typically done in + * the `init` function of the code generator class. + * + * @param name The proposed name for a procedure. + * @returns A unique, legal name for the procedure. + */ + getProcedureName(name: string): string { + return this.getName(name, NameType.PROCEDURE); + } + + private getName(nameOrId: string, type: NameType): string { + if (!this.nameDB_) { + throw new Error( + 'Name database is not defined. You must initialize `nameDB_` in your generator class and call `init` first.', + ); + } + return this.nameDB_.getName(nameOrId, type); + } + /** * Hook for code to run before code generation starts. * Subclasses may override this, e.g. to initialise the database of variable diff --git a/generators/dart/loops.js b/generators/dart/loops.js index cd18fab0198..1ead2d7e86b 100644 --- a/generators/dart/loops.js +++ b/generators/dart/loops.js @@ -62,8 +62,7 @@ export function controls_whileUntil(block, generator) { export function controls_for(block, generator) { // For loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'FROM', Order.ASSIGNMENT) || '0'; const argument1 = @@ -128,8 +127,7 @@ export function controls_for(block, generator) { export function controls_forEach(block, generator) { // For each loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'LIST', Order.ASSIGNMENT) || '[]'; let branch = generator.statementToCode(block, 'DO'); diff --git a/generators/dart/math.js b/generators/dart/math.js index 29bc7039a74..8541b95a87a 100644 --- a/generators/dart/math.js +++ b/generators/dart/math.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.Dart.math -import {NameType} from '../../core/names.js'; import {Order} from './dart_generator.js'; @@ -223,8 +222,7 @@ export function math_change(block, generator) { const argument0 = generator.valueToCode(block, 'DELTA', Order.ADDITIVE) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = (' + varName + ' is num ? ' + varName + ' : 0) + ' + argument0 + ';\n'; }; diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js index 5607586386f..e782abb6808 100644 --- a/generators/dart/procedures.js +++ b/generators/dart/procedures.js @@ -10,15 +10,13 @@ // Former goog.module ID: Blockly.Dart.procedures -import {NameType} from '../../core/names.js'; import {Order} from './dart_generator.js'; export function procedures_defreturn(block, generator) { // Define a procedure with a return value. const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); let xfix1 = ''; if (generator.STATEMENT_PREFIX) { xfix1 += generator.injectId(generator.STATEMENT_PREFIX, block); @@ -50,7 +48,7 @@ export function procedures_defreturn(block, generator) { const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { - args[i] = generator.nameDB_.getName(variables[i], NameType.VARIABLE); + args[i] = generator.getVariableName(variables[i]); } let code = returnType + ' ' + funcName + '(' + args.join(', ') + ') {\n' + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; @@ -67,8 +65,7 @@ export const procedures_defnoreturn = procedures_defreturn; export function procedures_callreturn(block, generator) { // Call a procedure with a return value. const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'),NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { diff --git a/generators/dart/text.js b/generators/dart/text.js index 510aea58761..69ffbf7df6a 100644 --- a/generators/dart/text.js +++ b/generators/dart/text.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.Dart.texts -import {NameType} from '../../core/names.js'; import {Order} from './dart_generator.js'; @@ -56,8 +55,7 @@ export function text_join(block, generator) { export function text_append(block, generator) { // Append to a variable in place. const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const value = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; return varName + ' = [' + varName + ', ' + value + '].join();\n'; }; diff --git a/generators/dart/variables.js b/generators/dart/variables.js index 5a9ca1ddc90..c088437603b 100644 --- a/generators/dart/variables.js +++ b/generators/dart/variables.js @@ -10,15 +10,13 @@ // Former goog.module ID: Blockly.Dart.variables -import {NameType} from '../../core/names.js'; import {Order} from './dart_generator.js'; export function variables_get(block, generator) { // Variable getter. const code = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return [code, Order.ATOMIC]; }; @@ -27,7 +25,6 @@ export function variables_set(block, generator) { const argument0 = generator.valueToCode(block, 'VALUE', Order.ASSIGNMENT) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = ' + argument0 + ';\n'; }; diff --git a/generators/javascript/loops.js b/generators/javascript/loops.js index 4241bfa9246..fbe532ce77b 100644 --- a/generators/javascript/loops.js +++ b/generators/javascript/loops.js @@ -65,8 +65,8 @@ export function controls_whileUntil(block, generator) { export function controls_for(block, generator) { // For loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName( + block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'FROM', Order.ASSIGNMENT) || '0'; const argument1 = @@ -128,8 +128,7 @@ export function controls_for(block, generator) { export function controls_forEach(block, generator) { // For each loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'LIST', Order.ASSIGNMENT) || '[]'; diff --git a/generators/javascript/math.js b/generators/javascript/math.js index 1a315925755..95fa32f5a67 100644 --- a/generators/javascript/math.js +++ b/generators/javascript/math.js @@ -11,7 +11,6 @@ // Former goog.module ID: Blockly.JavaScript.math -import {NameType} from '../../core/names.js'; import {Order} from './javascript_generator.js'; @@ -202,8 +201,7 @@ export function math_change(block, generator) { // Add to a variable in place. const argument0 = generator.valueToCode(block, 'DELTA', Order.ADDITION) || '0'; - const varName = generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + const varName = generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = (typeof ' + varName + ' === \'number\' ? ' + varName + ' : 0) + ' + argument0 + ';\n'; }; diff --git a/generators/javascript/procedures.js b/generators/javascript/procedures.js index 747ddb7e525..7f975289c09 100644 --- a/generators/javascript/procedures.js +++ b/generators/javascript/procedures.js @@ -10,14 +10,12 @@ // Former goog.module ID: Blockly.JavaScript.procedures -import {NameType} from '../../core/names.js'; import {Order} from './javascript_generator.js'; export function procedures_defreturn(block, generator) { // Define a procedure with a return value. - const funcName = generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + const funcName = generator.getProcedureName(block.getFieldValue('NAME')); let xfix1 = ''; if (generator.STATEMENT_PREFIX) { xfix1 += generator.injectId( @@ -52,7 +50,7 @@ export function procedures_defreturn(block, generator) { const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { args[i] = - generator.nameDB_.getName(variables[i], NameType.VARIABLE); + generator.getVariableName(variables[i]); } let code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; @@ -68,8 +66,7 @@ export const procedures_defnoreturn = procedures_defreturn; export function procedures_callreturn(block, generator) { // Call a procedure with a return value. - const funcName = generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + const funcName = generator.getProcedureName(block.getFieldValue('NAME')); const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { diff --git a/generators/javascript/text.js b/generators/javascript/text.js index 4571e6b2d89..32125051f37 100644 --- a/generators/javascript/text.js +++ b/generators/javascript/text.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.JavaScript.texts -import {NameType} from '../../core/names.js'; import {Order} from './javascript_generator.js'; @@ -101,8 +100,7 @@ export function text_join(block, generator) { export function text_append(block, generator) { // Append to a variable in place. - const varName = generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + const varName = generator.getVariableName(block.getFieldValue('VAR')); const value = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; const code = varName + ' += ' + diff --git a/generators/javascript/variables.js b/generators/javascript/variables.js index 4598d77d532..fd0f6c19866 100644 --- a/generators/javascript/variables.js +++ b/generators/javascript/variables.js @@ -10,14 +10,12 @@ // Former goog.module ID: Blockly.JavaScript.variables -import {NameType} from '../../core/names.js'; import {Order} from './javascript_generator.js'; export function variables_get(block, generator) { // Variable getter. - const code = generator.nameDB_.getName(block.getFieldValue('VAR'), - NameType.VARIABLE); + const code = generator.getVariableName(block.getFieldValue('VAR')); return [code, Order.ATOMIC]; }; @@ -25,7 +23,6 @@ export function variables_set(block, generator) { // Variable setter. const argument0 = generator.valueToCode( block, 'VALUE', Order.ASSIGNMENT) || '0'; - const varName = generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + const varName = generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = ' + argument0 + ';\n'; }; diff --git a/generators/lua/loops.js b/generators/lua/loops.js index 3ee6ba900c0..b7f9311c77c 100644 --- a/generators/lua/loops.js +++ b/generators/lua/loops.js @@ -87,8 +87,7 @@ export function controls_whileUntil(block, generator) { export function controls_for(block, generator) { // For loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const startVar = generator.valueToCode(block, 'FROM', Order.NONE) || '0'; const endVar = generator.valueToCode(block, 'TO', Order.NONE) || '0'; const increment = generator.valueToCode(block, 'BY', Order.NONE) || '1'; @@ -129,8 +128,7 @@ export function controls_for(block, generator) { export function controls_forEach(block, generator) { // For each loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'LIST', Order.NONE) || '{}'; let branch = generator.statementToCode(block, 'DO'); branch = generator.addLoopTrap(branch, block); diff --git a/generators/lua/math.js b/generators/lua/math.js index 3a93a9a26b5..af1ff738fc8 100644 --- a/generators/lua/math.js +++ b/generators/lua/math.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.Lua.math -import {NameType} from '../../core/names.js'; import {Order} from './lua_generator.js'; @@ -185,8 +184,7 @@ export function math_change(block, generator) { const argument0 = generator.valueToCode(block, 'DELTA', Order.ADDITIVE) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = ' + varName + ' + ' + argument0 + '\n'; }; diff --git a/generators/lua/procedures.js b/generators/lua/procedures.js index 2ab87d4242c..935ca113664 100644 --- a/generators/lua/procedures.js +++ b/generators/lua/procedures.js @@ -10,15 +10,13 @@ // Former goog.module ID: Blockly.Lua.procedures -import {NameType} from '../../core/names.js'; import {Order} from './lua_generator.js'; export function procedures_defreturn(block, generator) { // Define a procedure with a return value. const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); let xfix1 = ''; if (generator.STATEMENT_PREFIX) { xfix1 += generator.injectId(generator.STATEMENT_PREFIX, block); @@ -50,7 +48,7 @@ export function procedures_defreturn(block, generator) { const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { - args[i] = generator.nameDB_.getName(variables[i], NameType.VARIABLE); + args[i] = generator.getVariableName(variables[i]); } let code = 'function ' + funcName + '(' + args.join(', ') + ')\n' + xfix1 + loopTrap + branch + xfix2 + returnValue + 'end\n'; @@ -67,8 +65,7 @@ export const procedures_defnoreturn = procedures_defreturn; export function procedures_callreturn(block, generator) { // Call a procedure with a return value. const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { diff --git a/generators/lua/text.js b/generators/lua/text.js index b4c3d6d7961..606fcce32c4 100644 --- a/generators/lua/text.js +++ b/generators/lua/text.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.Lua.texts -import {NameType} from '../../core/names.js'; import {Order} from './lua_generator.js'; @@ -57,8 +56,7 @@ export function text_join(block, generator) { export function text_append(block, generator) { // Append to a variable in place. const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const value = generator.valueToCode(block, 'TEXT', Order.CONCATENATION) || "''"; return varName + ' = ' + varName + ' .. ' + value + '\n'; diff --git a/generators/lua/variables.js b/generators/lua/variables.js index 7605614257d..1913321c93a 100644 --- a/generators/lua/variables.js +++ b/generators/lua/variables.js @@ -10,15 +10,13 @@ // Former goog.module ID: Blockly.Lua.variables -import {NameType} from '../../core/names.js'; import {Order} from './lua_generator.js'; export function variables_get(block, generator) { // Variable getter. const code = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return [code, Order.ATOMIC]; }; @@ -26,7 +24,6 @@ export function variables_set(block, generator) { // Variable setter. const argument0 = generator.valueToCode(block, 'VALUE', Order.NONE) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = ' + argument0 + '\n'; }; diff --git a/generators/php/loops.js b/generators/php/loops.js index 0806566b166..981a4e219cf 100644 --- a/generators/php/loops.js +++ b/generators/php/loops.js @@ -61,7 +61,7 @@ export function controls_whileUntil(block, generator) { export function controls_for(block, generator) { // For loop. const variable0 = - generator.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'FROM', Order.ASSIGNMENT) || '0'; const argument1 = @@ -126,8 +126,7 @@ export function controls_for(block, generator) { export function controls_forEach(block, generator) { // For each loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'LIST', Order.ASSIGNMENT) || '[]'; let branch = generator.statementToCode(block, 'DO'); diff --git a/generators/php/math.js b/generators/php/math.js index df795f2c022..f1985949ea8 100644 --- a/generators/php/math.js +++ b/generators/php/math.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.PHP.math -import {NameType} from '../../core/names.js'; import {Order} from './php_generator.js'; @@ -198,8 +197,7 @@ export function math_change(block, generator) { const argument0 = generator.valueToCode(block, 'DELTA', Order.ADDITION) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' += ' + argument0 + ';\n'; }; diff --git a/generators/php/procedures.js b/generators/php/procedures.js index ff97f488ce5..f261ec919fe 100644 --- a/generators/php/procedures.js +++ b/generators/php/procedures.js @@ -22,10 +22,11 @@ export function procedures_defreturn(block, generator) { const globals = []; const workspace = block.workspace; const usedVariables = Variables.allUsedVarModels(workspace) || []; - for (let i = 0, variable; variable = usedVariables[i]; i++) { + for (const variable of usedVariables) { const varName = variable.name; + // getVars returns parameter names, not ids, for procedure blocks if (block.getVars().indexOf(varName) === -1) { - globals.push(generator.nameDB_.getName(varName, NameType.VARIABLE)); + globals.push(generator.getVariableName(varName)); } } // Add developer variables. @@ -40,8 +41,7 @@ export function procedures_defreturn(block, generator) { generator.INDENT + 'global ' + globals.join(', ') + ';\n' : ''; const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); let xfix1 = ''; if (generator.STATEMENT_PREFIX) { xfix1 += generator.injectId(generator.STATEMENT_PREFIX, block); @@ -71,7 +71,7 @@ export function procedures_defreturn(block, generator) { const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { - args[i] = generator.nameDB_.getName(variables[i], NameType.VARIABLE); + args[i] = generator.getVariableName(variables[i]); } let code = 'function ' + funcName + '(' + args.join(', ') + ') {\n' + globalStr + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; @@ -88,8 +88,7 @@ export const procedures_defnoreturn = procedures_defreturn; export function procedures_callreturn(block, generator) { // Call a procedure with a return value. const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { diff --git a/generators/php/text.js b/generators/php/text.js index 20cb15ee01f..b5941315be2 100644 --- a/generators/php/text.js +++ b/generators/php/text.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.PHP.texts -import {NameType} from '../../core/names.js'; import {Order} from './php_generator.js'; @@ -57,8 +56,7 @@ export function text_join(block, generator) { export function text_append(block, generator) { // Append to a variable in place. const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const value = generator.valueToCode(block, 'TEXT', Order.ASSIGNMENT) || "''"; return varName + ' .= ' + value + ';\n'; diff --git a/generators/php/variables.js b/generators/php/variables.js index 32e8aaa8f57..50429fa9b3b 100644 --- a/generators/php/variables.js +++ b/generators/php/variables.js @@ -10,15 +10,13 @@ // Former goog.module ID: Blockly.PHP.variables -import {NameType} from '../../core/names.js'; import {Order} from './php_generator.js'; export function variables_get(block, generator) { // Variable getter. const code = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return [code, Order.ATOMIC]; }; @@ -27,7 +25,6 @@ export function variables_set(block, generator) { const argument0 = generator.valueToCode(block, 'VALUE', Order.ASSIGNMENT) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = ' + argument0 + ';\n'; }; diff --git a/generators/python/loops.js b/generators/python/loops.js index 9a46f31c924..824d4f2bf1c 100644 --- a/generators/python/loops.js +++ b/generators/python/loops.js @@ -58,8 +58,7 @@ export function controls_whileUntil(block, generator) { export function controls_for(block, generator) { // For loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); let argument0 = generator.valueToCode(block, 'FROM', Order.NONE) || '0'; let argument1 = generator.valueToCode(block, 'TO', Order.NONE) || '0'; let increment = generator.valueToCode(block, 'BY', Order.NONE) || '1'; @@ -167,8 +166,7 @@ def ${generator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step): export function controls_forEach(block, generator) { // For each loop. const variable0 = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const argument0 = generator.valueToCode(block, 'LIST', Order.RELATIONAL) || '[]'; let branch = generator.statementToCode(block, 'DO'); diff --git a/generators/python/math.js b/generators/python/math.js index 93809559577..0ba35118778 100644 --- a/generators/python/math.js +++ b/generators/python/math.js @@ -10,7 +10,6 @@ // Former goog.module ID: Blockly.Python.math -import {NameType} from '../../core/names.js'; import {Order} from './python_generator.js'; @@ -216,9 +215,7 @@ export function math_change(block, generator) { 'from numbers import Number'; const argument0 = generator.valueToCode(block, 'DELTA', Order.ADDITIVE) || '0'; - const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + const varName = generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = (' + varName + ' if isinstance(' + varName + ', Number) else 0) + ' + argument0 + '\n'; }; diff --git a/generators/python/procedures.js b/generators/python/procedures.js index a26df518bc9..4539ca29622 100644 --- a/generators/python/procedures.js +++ b/generators/python/procedures.js @@ -22,10 +22,11 @@ export function procedures_defreturn(block, generator) { const globals = []; const workspace = block.workspace; const usedVariables = Variables.allUsedVarModels(workspace) || []; - for (let i = 0, variable; (variable = usedVariables[i]); i++) { + for (const variable of usedVariables) { const varName = variable.name; + // getVars returns parameter names, not ids, for procedure blocks if (block.getVars().indexOf(varName) === -1) { - globals.push(generator.nameDB_.getName(varName, NameType.VARIABLE)); + globals.push(generator.getVariableName(varName)); } } // Add developer variables. @@ -40,8 +41,7 @@ export function procedures_defreturn(block, generator) { generator.INDENT + 'global ' + globals.join(', ') + '\n' : ''; const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); let xfix1 = ''; if (generator.STATEMENT_PREFIX) { xfix1 += generator.injectId(generator.STATEMENT_PREFIX, block); @@ -74,7 +74,7 @@ export function procedures_defreturn(block, generator) { const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { - args[i] = generator.nameDB_.getName(variables[i], NameType.VARIABLE); + args[i] = generator.getVariableName(variables[i]); } let code = 'def ' + funcName + '(' + args.join(', ') + '):\n' + globalString + xfix1 + loopTrap + branch + xfix2 + returnValue; @@ -91,8 +91,7 @@ export const procedures_defnoreturn = procedures_defreturn; export function procedures_callreturn(block, generator) { // Call a procedure with a return value. const funcName = - generator.nameDB_.getName( - block.getFieldValue('NAME'), NameType.PROCEDURE); + generator.getProcedureName(block.getFieldValue('NAME')); const args = []; const variables = block.getVars(); for (let i = 0; i < variables.length; i++) { diff --git a/generators/python/python_generator.js b/generators/python/python_generator.js index 34ac317e1a5..275caef4662 100644 --- a/generators/python/python_generator.js +++ b/generators/python/python_generator.js @@ -15,7 +15,7 @@ import * as stringUtils from '../../core/utils/string.js'; import * as Variables from '../../core/variables.js'; // import type {Block} from '../../core/block.js'; import {CodeGenerator} from '../../core/generator.js'; -import {Names, NameType} from '../../core/names.js'; +import {Names} from '../../core/names.js'; // import type {Workspace} from '../../core/workspace.js'; import {inputTypes} from '../../core/inputs/input_types.js'; @@ -179,7 +179,7 @@ export class PythonGenerator extends CodeGenerator { const variables = Variables.allUsedVarModels(workspace); for (let i = 0; i < variables.length; i++) { defvars.push( - this.nameDB_.getName(variables[i].getId(), NameType.VARIABLE) + + this.getVariableName(variables[i].getId()) + ' = None'); } diff --git a/generators/python/text.js b/generators/python/text.js index 8c372186248..f4cd181f380 100644 --- a/generators/python/text.js +++ b/generators/python/text.js @@ -87,8 +87,7 @@ export function text_join(block, generator) { export function text_append(block, generator) { // Append to a variable in place. const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); const value = generator.valueToCode(block, 'TEXT', Order.NONE) || "''"; return varName + ' = str(' + varName + ') + ' + forceString(value)[0] + '\n'; }; diff --git a/generators/python/variables.js b/generators/python/variables.js index b0100a15123..0908cd2eda7 100644 --- a/generators/python/variables.js +++ b/generators/python/variables.js @@ -10,15 +10,13 @@ // Former goog.module ID: Blockly.Python.variables -import {NameType} from '../../core/names.js'; import {Order} from './python_generator.js'; export function variables_get(block, generator) { // Variable getter. const code = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return [code, Order.ATOMIC]; }; @@ -27,7 +25,6 @@ export function variables_set(block, generator) { const argument0 = generator.valueToCode(block, 'VALUE', Order.NONE) || '0'; const varName = - generator.nameDB_.getName( - block.getFieldValue('VAR'), NameType.VARIABLE); + generator.getVariableName(block.getFieldValue('VAR')); return varName + ' = ' + argument0 + '\n'; }; diff --git a/tests/mocha/generator_test.js b/tests/mocha/generator_test.js index eea386432a9..9ac67b27ca3 100644 --- a/tests/mocha/generator_test.js +++ b/tests/mocha/generator_test.js @@ -190,5 +190,36 @@ suite('Generator', function () { }); }); }); + + suite('Names', function () { + setup(function () { + class TestGenerator extends Blockly.CodeGenerator { + init() { + super.init(); + this.nameDB_ = sinon.createStubInstance(Blockly.Names, { + getName: 'foo', + }); + } + } + this.generator = new TestGenerator(); + }); + test('No nameDB_ initialized', function () { + chai.assert.throws(() => { + this.generator.getVariableName('foo'); + }); + }); + + test('Get variable name', function () { + this.generator.init(); + + chai.assert.equal(this.generator.getVariableName('foo'), 'foo'); + }); + + test('Get procedure name', function () { + this.generator.init(); + + chai.assert.equal(this.generator.getProcedureName('foo'), 'foo'); + }); + }); }); });