From f3a76cc288d697f3b895bb72f92f9858f3e90985 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Tue, 25 Sep 2018 12:34:45 -0700 Subject: [PATCH] Remove unneeded String() and str() calls. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit String literals in JS and Python don’t need to be coerced to strings. --- generators/javascript/lists.js | 2 +- generators/javascript/text.js | 28 ++++++++++++++++++++++++---- generators/lua/lists.js | 2 +- generators/python/text.js | 31 ++++++++++++++++++++++++++----- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/generators/javascript/lists.js b/generators/javascript/lists.js index 8ab563503..45430162c 100644 --- a/generators/javascript/lists.js +++ b/generators/javascript/lists.js @@ -252,11 +252,11 @@ Blockly.JavaScript['lists_setIndex'] = function(block) { /** * Returns an expression calculating the index into a list. - * @private * @param {string} listName Name of the list, used to calculate length. * @param {string} where The method of indexing, selected by dropdown in Blockly * @param {string=} opt_at The optional offset when indexing from start/end. * @return {string} Index expression. + * @private */ Blockly.JavaScript.lists.getIndex_ = function(listName, where, opt_at) { if (where == 'FIRST') { diff --git a/generators/javascript/text.js b/generators/javascript/text.js index 357ca3eb9..32ced3fb1 100644 --- a/generators/javascript/text.js +++ b/generators/javascript/text.js @@ -35,6 +35,25 @@ Blockly.JavaScript['text'] = function(block) { return [code, Blockly.JavaScript.ORDER_ATOMIC]; }; +/** + * Enclose the provided value in 'String(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {string} Code evaluating to a string. + * @private + */ +Blockly.JavaScript.text.forceString_ = function(value) { + if (Blockly.JavaScript.text.forceString_.strRegExp.test(value)) { + return value; + } + return 'String(' + value + ')'; +}; + +/** + * Regular expression to detect a single-quoted string literal. + */ +Blockly.JavaScript.text.forceString_.strRegExp = /^\s*'([^']|\\')*'\s*$/; + Blockly.JavaScript['text_join'] = function(block) { // Create a string made up of any number of elements of any type. switch (block.itemCount_) { @@ -43,14 +62,15 @@ Blockly.JavaScript['text_join'] = function(block) { case 1: var element = Blockly.JavaScript.valueToCode(block, 'ADD0', Blockly.JavaScript.ORDER_NONE) || '\'\''; - var code = 'String(' + element + ')'; + var code = Blockly.JavaScript.text.forceString_(element); return [code, Blockly.JavaScript.ORDER_FUNCTION_CALL]; case 2: var element0 = Blockly.JavaScript.valueToCode(block, 'ADD0', Blockly.JavaScript.ORDER_NONE) || '\'\''; var element1 = Blockly.JavaScript.valueToCode(block, 'ADD1', Blockly.JavaScript.ORDER_NONE) || '\'\''; - var code = 'String(' + element0 + ') + String(' + element1 + ')'; + var code = Blockly.JavaScript.text.forceString_(element0) + ' + ' + + Blockly.JavaScript.text.forceString_(element1); return [code, Blockly.JavaScript.ORDER_ADDITION]; default: var elements = new Array(block.itemCount_); @@ -69,7 +89,7 @@ Blockly.JavaScript['text_append'] = function(block) { block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE); var value = Blockly.JavaScript.valueToCode(block, 'TEXT', Blockly.JavaScript.ORDER_NONE) || '\'\''; - return varName + ' = String(' + varName + ') + String(' + value + ');\n'; + return varName + ' += ' + Blockly.JavaScript.text.forceString_(value) + ';\n'; }; Blockly.JavaScript['text_length'] = function(block) { @@ -142,11 +162,11 @@ Blockly.JavaScript['text_charAt'] = function(block) { /** * Returns an expression calculating the index into a string. - * @private * @param {string} stringName Name of the string, used to calculate length. * @param {string} where The method of indexing, selected by dropdown in Blockly * @param {string=} opt_at The optional offset when indexing from start/end. * @return {string} Index expression. + * @private */ Blockly.JavaScript.text.getIndex_ = function(stringName, where, opt_at) { if (where == 'FIRST') { diff --git a/generators/lua/lists.js b/generators/lua/lists.js index bdb89baf6..a8b32e30f 100644 --- a/generators/lua/lists.js +++ b/generators/lua/lists.js @@ -114,11 +114,11 @@ Blockly.Lua['lists_indexOf'] = function(block) { /** * Returns an expression calculating the index into a list. - * @private * @param {string} listName Name of the list, used to calculate length. * @param {string} where The method of indexing, selected by dropdown in Blockly * @param {string=} opt_at The optional offset when indexing from start/end. * @return {string} Index expression. + * @private */ Blockly.Lua.lists.getIndex_ = function(listName, where, opt_at) { if (where == 'FIRST') { diff --git a/generators/python/text.js b/generators/python/text.js index 2ff767b14..35c31491f 100644 --- a/generators/python/text.js +++ b/generators/python/text.js @@ -35,6 +35,25 @@ Blockly.Python['text'] = function(block) { return [code, Blockly.Python.ORDER_ATOMIC]; }; +/** + * Enclose the provided value in 'str(...)' function. + * Leave string literals alone. + * @param {string} value Code evaluating to a value. + * @return {string} Code evaluating to a string. + * @private + */ +Blockly.Python.text.forceString_ = function(value) { + if (Blockly.Python.text.forceString_.strRegExp.test(value)) { + return value; + } + return 'str(' + value + ')'; +}; + +/** + * Regular expression to detect a single-quoted string literal. + */ +Blockly.Python.text.forceString_.strRegExp = /^\s*'([^']|\\')*'\s*$/; + Blockly.Python['text_join'] = function(block) { // Create a string made up of any number of elements of any type. //Should we allow joining by '-' or ',' or any other characters? @@ -45,15 +64,16 @@ Blockly.Python['text_join'] = function(block) { case 1: var element = Blockly.Python.valueToCode(block, 'ADD0', Blockly.Python.ORDER_NONE) || '\'\''; - var code = 'str(' + element + ')'; + var code = Blockly.Python.text.forceString_(element); return [code, Blockly.Python.ORDER_FUNCTION_CALL]; break; case 2: var element0 = Blockly.Python.valueToCode(block, 'ADD0', - Blockly.Python.ORDER_NONE) || '\'\''; + Blockly.Python.ORDER_NONE) || '\'\''; var element1 = Blockly.Python.valueToCode(block, 'ADD1', - Blockly.Python.ORDER_NONE) || '\'\''; - var code = 'str(' + element0 + ') + str(' + element1 + ')'; + Blockly.Python.ORDER_NONE) || '\'\''; + var code = Blockly.Python.text.forceString_(element0) + ' + ' + + Blockly.Python.text.forceString_(element1); return [code, Blockly.Python.ORDER_ADDITIVE]; break; default: @@ -76,7 +96,8 @@ Blockly.Python['text_append'] = function(block) { Blockly.Variables.NAME_TYPE); var value = Blockly.Python.valueToCode(block, 'TEXT', Blockly.Python.ORDER_NONE) || '\'\''; - return varName + ' = str(' + varName + ') + str(' + value + ')\n'; + return varName + ' = str(' + varName + ') + ' + + Blockly.Python.text.forceString_(value) + '\n'; }; Blockly.Python['text_length'] = function(block) {