mirror of
https://github.com/google/blockly.git
synced 2025-12-15 13:50:08 +01:00
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
This commit is contained in:
committed by
GitHub
parent
b0a7c004a9
commit
68261e5dd9
@@ -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
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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) ||
|
||||
'[]';
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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 + ' += ' +
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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';
|
||||
};
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user