diff --git a/blocks/tinygo.js b/blocks/tinygo.js index 81a1b1697f6..996ce0d56a5 100644 --- a/blocks/tinygo.js +++ b/blocks/tinygo.js @@ -8,33 +8,13 @@ */ 'use strict'; -goog.provide('Blockly.TinyGo'); +goog.module('Blockly.TinyGo'); +const {createBlockDefinitionsFromJsonArray, defineBlocks} = goog.require('Blockly.common'); goog.require('Blockly.Types'); -Blockly.TinyGo.init = function(workspace) { - Blockly.TinyGo.variables_ = []; - Blockly.TinyGo.pins_ = []; - Blockly.TinyGo.imports_ = []; -}; - -Blockly.TinyGo.addImport = function(id, path) { - Blockly.TinyGo.imports_[id] = path; -}; - -Blockly.TinyGo.addVariable = function(id, variable) { - Blockly.TinyGo.variables_[id] = variable; -}; - -Blockly.TinyGo.addDeclaration = function(id, data) { - Blockly.TinyGo.pins_[id] = data; -}; - -Blockly.TinyGo.configurePin = function(id, pinNumber, mode) { - Blockly.TinyGo.variables_[id] = 'const ' + id + ' = machine.Pin(' + pinNumber + ')'; - Blockly.TinyGo.pins_[id] = id + '.Configure(machine.PinConfig{Mode: machine.Pin' + mode + '})'; - Blockly.TinyGo.imports_['machine'] = 'machine'; -}; +const CATEGORY_NAME = 'TINYGO'; +exports.CATEGORY_NAME = CATEGORY_NAME; Blockly.Blocks['tinygo_led'] = { init: function() { @@ -65,15 +45,15 @@ Blockly.Blocks['tinygo_led'] = { }, }; -Blockly.TinyGo['tinygo_led'] = function(block) { +Blockly.Go['tinygo_led'] = function(block) { const pins = block.connectorPinUsage(); - const stateOutput = Blockly.TinyGo.valueToCode( - block, 'STATE', Blockly.TinyGo.ORDER_ATOMIC) || false; + const stateOutput = Blockly.Go.valueToCode( + block, 'STATE', Blockly.Go.ORDER_ATOMIC) || false; - // Blockly.TinyGo.reservePin( - // block, pins[0], Blockly.TinyGo.PinTypes.GROVE_LED, 'this Grove module'); + // Blockly.Go.reservePin( + // block, pins[0], Blockly.Go.PinTypes.GROVE_LED, 'this Grove module'); - Blockly.TinyGo.configurePin('ledPin' + pins[0], pins[0], 'Output'); + Blockly.Go.configurePin('ledPin' + pins[0], pins[0], 'Output'); if (stateOutput == 'true') { return 'ledPin' + pins[0] + '.High()\n'; } @@ -88,7 +68,7 @@ Blockly.Types.LEDSTATE = new Blockly.Type({ }); -Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT +const blocks = createBlockDefinitionsFromJsonArray([ // Block for boolean data type: true and false. { "type": "tinygo_led_state", @@ -255,15 +235,15 @@ Blockly.defineBlocksWithJsonArray([ // BEGIN JSON EXTRACT }, ]); -Blockly.TinyGo['tinygo_led_state'] = function(block) { +Blockly.Go['tinygo_led_state'] = function(block) { const code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.TinyGo.ORDER_ATOMIC]; + return [code, Blockly.Go.ORDER_ATOMIC]; }; -Blockly.TinyGo['tinygo_goroutine'] = function(block) { +Blockly.Go['tinygo_goroutine'] = function(block) { let code = ''; - const branchCode = Blockly.TinyGo.statementToCode(block, 'GR0'); + const branchCode = Blockly.Go.statementToCode(block, 'GR0'); const lines = branchCode.split('\n'); if (lines.length > 2) { @@ -275,18 +255,21 @@ Blockly.TinyGo['tinygo_goroutine'] = function(block) { return code; }; -Blockly.TinyGo['tinygo_time_sleep'] = function(block) { - Blockly.TinyGo.imports_['time'] = 'time'; +Blockly.Go['tinygo_time_sleep'] = function(block) { + Blockly.Go.imports_['time'] = 'time'; const amount = block.getFieldValue('AMOUNT'); const unit = block.getFieldValue('UNIT'); const code = 'time.Sleep(' + amount + ' * ' + unit + ')\n'; return code; }; -Blockly.TinyGo['tinygo_led_complete'] = function(block) { +Blockly.Go['tinygo_led_complete'] = function(block) { const state = block.getFieldValue('STATE'); const pin = block.getFieldValue('PIN'); - Blockly.TinyGo.configurePin('ledPin' + pin, 'machine.D' + pin, 'Output'); + Blockly.Go.configurePin('ledPin' + pin, 'machine.D' + pin, 'Output'); return 'ledPin' + pin + '.' + state + '()\n'; }; + +// Register provided blocks. +defineBlocks(blocks); diff --git a/generators/go.js b/generators/go.js index 19b5f8aa1a3..34891a9e0de 100644 --- a/generators/go.js +++ b/generators/go.js @@ -16,7 +16,6 @@ goog.require('Blockly.Types'); goog.require('Blockly.Generator'); goog.require('Blockly.utils.string'); goog.require('GoFmtServer'); -goog.require('Blockly.TinyGo'); goog.require('Blockly.Names'); @@ -115,6 +114,8 @@ Blockly.Go.ORDER_OVERRIDES = [ */ Blockly.Go.init = function (workspace) { Blockly.Go.variables_ = Object.create(null); + Blockly.Go.pins_ = Object.create(null); + Blockly.Go.imports_ = Object.create(null); // Create a dictionary of definitions to be printed before the code. @@ -162,9 +163,6 @@ Blockly.Go.init = function (workspace) { Blockly.Go.addVariable(varName, 'var ' + vName + ' ' + Blockly.Go.getGoType_(varsWithTypes[varName])); } - - Blockly.TinyGo.init(workspace); - }; /** @@ -178,17 +176,13 @@ Blockly.Go.finish = function (code) { defvars.push(Blockly.Go.variables_[i]); } - for (var i in Blockly.TinyGo.variables_) { - defvars.push(Blockly.TinyGo.variables_[i]); - } - // Declare all of the variables. let variables = defvars.join('\n'); defvars = []; - for (var i in Blockly.TinyGo.pins_) { - defvars.push(Blockly.TinyGo.pins_[i]); + for (var i in Blockly.Go.pins_) { + defvars.push(Blockly.Go.pins_[i]); } code = variables + '\n\nfunc main() {\n' + defvars.join('\n') + '\n' + code + '}'; @@ -200,8 +194,8 @@ Blockly.Go.finish = function (code) { } defvars = []; - for (var i in Blockly.TinyGo.imports_) { - defvars.push('"' + Blockly.TinyGo.imports_[i] + '"'); + for (var i in Blockly.Go.imports_) { + defvars.push('"' + Blockly.Go.imports_[i] + '"'); } let importsStr = ''; if (defvars.length > 0) { @@ -359,7 +353,6 @@ Blockly.Go.getAdjusted = function (block, atId, opt_delta, opt_negate, }; Blockly.Go.getGoType_ = function (typeBlockly) { - console.log("TYPEBLOCKLY", typeBlockly, Blockly.Types.COLOUR); if (typeBlockly == undefined) { return 'Invalid Blockly Type'; } @@ -403,7 +396,6 @@ Blockly.Go.getGoType_ = function (typeBlockly) { * @return {!boolean} Indicates if the declaration overwrote a previous one. */ Blockly.Go.addVariable = function (varName, code, overwrite) { - console.log("ADD VARIABLE", varName, code, overwrite); var overwritten = false; if (overwrite || (Blockly.Go.variables_[varName] === undefined)) { Blockly.Go.variables_[varName] = code; @@ -411,3 +403,18 @@ Blockly.Go.addVariable = function (varName, code, overwrite) { } return overwritten; }; + + +Blockly.Go.addImport = function(id, path) { + Blockly.Go.imports_[id] = path; +}; + +Blockly.Go.addDeclaration = function(id, data) { + Blockly.Go.pins_[id] = data; +}; + +Blockly.Go.configurePin = function(id, pinNumber, mode) { + Blockly.Go.variables_[id] = 'const ' + id + ' = machine.Pin(' + pinNumber + ')'; + Blockly.Go.pins_[id] = id + '.Configure(machine.PinConfig{Mode: machine.Pin' + mode + '})'; + Blockly.Go.imports_['machine'] = 'machine'; +}; diff --git a/generators/go/all.js b/generators/go/all.js index 5d1ae9d3d89..7d655d36e04 100644 --- a/generators/go/all.js +++ b/generators/go/all.js @@ -23,3 +23,5 @@ goog.require('Blockly.Go.texts'); goog.require('Blockly.Go.variables'); goog.require('Blockly.Go.variablesDynamic'); +goog.require('Blockly.TinyGo'); + diff --git a/generators/go/colour.js b/generators/go/colour.js index ba730b9741b..036cff8ca3a 100644 --- a/generators/go/colour.js +++ b/generators/go/colour.js @@ -10,50 +10,50 @@ */ 'use strict'; -goog.provide('Blockly.Go.colour'); +goog.module('Blockly.Go.colour'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['colour_picker'] = function(block) { +Go['colour_picker'] = function(block) { // Colour picker. - var code = Blockly.Go.quote_(block.getFieldValue('COLOUR')); - return [code, Blockly.Go.ORDER_ATOMIC]; + var code = Go.quote_(block.getFieldValue('COLOUR')); + return [code, Go.ORDER_ATOMIC]; }; -Blockly.Go['colour_array'] = function(block) { +Go['colour_array'] = function(block) { var code = new Array(block.itemCount_); for (var i = 0; i < block.itemCount_; i++) { - code[i] = Blockly.Go.valueToCode(block, 'ADD' + i, - Blockly.Go.ORDER_COMMA) || 'null'; + code[i] = Go.valueToCode(block, 'ADD' + i, + Go.ORDER_COMMA) || 'null'; } code = 'array(' + code.join(', ') + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['colour_random'] = function(block) { +Go['colour_random'] = function(block) { // Generate a random colour. - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'colour_random', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + '() {', + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '() {', ' return \'#\' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), ' + '6, \'0\', STR_PAD_LEFT);', '}']); var code = functionName + '()'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['colour_rgb'] = function(block) { +Go['colour_rgb'] = function(block) { // Compose a colour from RGB components expressed as percentages. - var red = Blockly.Go.valueToCode(block, 'RED', - Blockly.Go.ORDER_COMMA) || 0; - var green = Blockly.Go.valueToCode(block, 'GREEN', - Blockly.Go.ORDER_COMMA) || 0; - var blue = Blockly.Go.valueToCode(block, 'BLUE', - Blockly.Go.ORDER_COMMA) || 0; - var functionName = Blockly.Go.provideFunction_( + var red = Go.valueToCode(block, 'RED', + Go.ORDER_COMMA) || 0; + var green = Go.valueToCode(block, 'GREEN', + Go.ORDER_COMMA) || 0; + var blue = Go.valueToCode(block, 'BLUE', + Go.ORDER_COMMA) || 0; + var functionName = Go.provideFunction_( 'colour_rgb', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($r, $g, $b) {', ' $r = round(max(min($r, 100), 0) * 2.55);', ' $g = round(max(min($g, 100), 0) * 2.55);', @@ -65,20 +65,20 @@ Blockly.Go['colour_rgb'] = function(block) { ' return $hex;', '}']); var code = functionName + '(' + red + ', ' + green + ', ' + blue + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['colour_blend'] = function(block) { +Go['colour_blend'] = function(block) { // Blend two colours together. - var c1 = Blockly.Go.valueToCode(block, 'COLOUR1', - Blockly.Go.ORDER_COMMA) || '\'#000000\''; - var c2 = Blockly.Go.valueToCode(block, 'COLOUR2', - Blockly.Go.ORDER_COMMA) || '\'#000000\''; - var ratio = Blockly.Go.valueToCode(block, 'RATIO', - Blockly.Go.ORDER_COMMA) || 0.5; - var functionName = Blockly.Go.provideFunction_( + var c1 = Go.valueToCode(block, 'COLOUR1', + Go.ORDER_COMMA) || '\'#000000\''; + var c2 = Go.valueToCode(block, 'COLOUR2', + Go.ORDER_COMMA) || '\'#000000\''; + var ratio = Go.valueToCode(block, 'RATIO', + Go.ORDER_COMMA) || 0.5; + var functionName = Go.provideFunction_( 'colour_blend', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($c1, $c2, $ratio) {', ' $ratio = max(min($ratio, 1), 0);', ' $r1 = hexdec(substr($c1, 1, 2));', @@ -97,5 +97,5 @@ Blockly.Go['colour_blend'] = function(block) { ' return $hex;', '}']); var code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; diff --git a/generators/go/lists.js b/generators/go/lists.js index c9642360c5f..ae123bc39eb 100644 --- a/generators/go/lists.js +++ b/generators/go/lists.js @@ -21,41 +21,43 @@ */ 'use strict'; -goog.provide('Blockly.Go.lists'); +goog.module('Blockly.Go.lists'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['lists_create_empty'] = function(block) { + +Go['lists_create_empty'] = function(block) { // Create an empty list. - return ['array()', Blockly.Go.ORDER_FUNCTION_CALL]; + return ['array()', Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_create_with'] = function(block) { +Go['lists_create_with'] = function(block) { // Create a list with any number of elements of any type. var code = new Array(block.itemCount_); for (var i = 0; i < block.itemCount_; i++) { - code[i] = Blockly.Go.valueToCode(block, 'ADD' + i, - Blockly.Go.ORDER_COMMA) || 'null'; + code[i] = Go.valueToCode(block, 'ADD' + i, + Go.ORDER_COMMA) || 'null'; } code = 'array(' + code.join(', ') + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_create_with_typed'] = function(block) { +Go['lists_create_with_typed'] = function(block) { // Create a list with any number of elements of any type. var code = new Array(block.itemCount_); for (var i = 0; i < block.itemCount_; i++) { - code[i] = Blockly.Go.valueToCode(block, 'ADD' + i, - Blockly.Go.ORDER_COMMA) || 'null'; + code[i] = Go.valueToCode(block, 'ADD' + i, + Go.ORDER_COMMA) || 'null'; } code = 'array(' + code.join(', ') + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_repeat'] = function(block) { +Go['lists_repeat'] = function(block) { // Create a list with one element repeated. - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_repeat', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($value, $count) {', ' $array = array();', ' for ($index = 0; $index < $count; $index++) {', @@ -63,43 +65,43 @@ Blockly.Go['lists_repeat'] = function(block) { ' }', ' return $array;', '}']); - var element = Blockly.Go.valueToCode(block, 'ITEM', - Blockly.Go.ORDER_COMMA) || 'null'; - var repeatCount = Blockly.Go.valueToCode(block, 'NUM', - Blockly.Go.ORDER_COMMA) || '0'; + var element = Go.valueToCode(block, 'ITEM', + Go.ORDER_COMMA) || 'null'; + var repeatCount = Go.valueToCode(block, 'NUM', + Go.ORDER_COMMA) || '0'; var code = functionName + '(' + element + ', ' + repeatCount + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_length'] = function(block) { +Go['lists_length'] = function(block) { // String or array length. - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'length', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($value) {', ' if (is_string($value)) {', ' return strlen($value);', ' } else {', ' return count($value);', ' }', '}']); - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || '\'\''; - return [functionName + '(' + list + ')', Blockly.Go.ORDER_FUNCTION_CALL]; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || '\'\''; + return [functionName + '(' + list + ')', Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_isEmpty'] = function(block) { +Go['lists_isEmpty'] = function(block) { // Is the string null or array empty? - var argument0 = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_FUNCTION_CALL) || 'array()'; - return ['empty(' + argument0 + ')', Blockly.Go.ORDER_FUNCTION_CALL]; + var argument0 = Go.valueToCode(block, 'VALUE', + Go.ORDER_FUNCTION_CALL) || 'array()'; + return ['empty(' + argument0 + ')', Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_indexOf'] = function(block) { +Go['lists_indexOf'] = function(block) { // Find an item in the list. - var argument0 = Blockly.Go.valueToCode(block, 'FIND', - Blockly.Go.ORDER_NONE) || '\'\''; - var argument1 = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_MEMBER) || '[]'; + var argument0 = Go.valueToCode(block, 'FIND', + Go.ORDER_NONE) || '\'\''; + var argument1 = Go.valueToCode(block, 'VALUE', + Go.ORDER_MEMBER) || '[]'; if (block.workspace.options.oneBasedIndex) { var errorIndex = ' 0'; var indexAdjustment = ' + 1'; @@ -109,9 +111,9 @@ Blockly.Go['lists_indexOf'] = function(block) { } if (block.getFieldValue('END') == 'FIRST') { // indexOf - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'indexOf', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($haystack, $needle) {', ' for ($index = 0; $index < count($haystack); $index++) {', ' if ($haystack[$index] == $needle) return $index' + @@ -121,9 +123,9 @@ Blockly.Go['lists_indexOf'] = function(block) { '}']); } else { // lastIndexOf - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lastIndexOf', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($haystack, $needle) {', ' $last = ' + errorIndex + ';', ' for ($index = 0; $index < count($haystack); $index++) {', @@ -135,114 +137,114 @@ Blockly.Go['lists_indexOf'] = function(block) { } var code = functionName + '(' + argument1 + ', ' + argument0 + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_getIndex'] = function(block) { +Go['lists_getIndex'] = function(block) { // Get element at index. var mode = block.getFieldValue('MODE') || 'GET'; var where = block.getFieldValue('WHERE') || 'FROM_START'; switch (where) { case 'FIRST': if (mode == 'GET') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_MEMBER) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_MEMBER) || 'array()'; var code = list + '[0]'; - return [code, Blockly.Go.ORDER_MEMBER]; + return [code, Go.ORDER_MEMBER]; } else if (mode == 'GET_REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; var code = 'array_shift(' + list + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; return 'array_shift(' + list + ')\n'; } break; case 'LAST': if (mode == 'GET') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; var code = 'end(' + list + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'GET_REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; var code = 'array_pop(' + list + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; return 'array_pop(' + list + ')\n'; } break; case 'FROM_START': - var at = Blockly.Go.getAdjusted(block, 'AT'); + var at = Go.getAdjusted(block, 'AT'); if (mode == 'GET') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_MEMBER) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_MEMBER) || 'array()'; var code = list + '[' + at + ']'; - return [code, Blockly.Go.ORDER_MEMBER]; + return [code, Go.ORDER_MEMBER]; } else if (mode == 'GET_REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_COMMA) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_COMMA) || 'array()'; var code = 'array_splice(' + list + ', ' + at + ', 1)[0]'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_COMMA) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_COMMA) || 'array()'; return 'array_splice(' + list + ', ' + at + ', 1)\n'; } break; case 'FROM_END': if (mode == 'GET') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_COMMA) || 'array()'; - var at = Blockly.Go.getAdjusted(block, 'AT', 1, true); + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_COMMA) || 'array()'; + var at = Go.getAdjusted(block, 'AT', 1, true); var code = 'array_slice(' + list + ', ' + at + ', 1)[0]'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'GET_REMOVE' || mode == 'REMOVE') { - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; - var at = Blockly.Go.getAdjusted(block, 'AT', 1, false, - Blockly.Go.ORDER_SUBTRACTION); + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; + var at = Go.getAdjusted(block, 'AT', 1, false, + Go.ORDER_SUBTRACTION); code = 'array_splice(' + list + ', count(' + list + ') - ' + at + ', 1)[0]'; if (mode == 'GET_REMOVE') { - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'REMOVE') { return code + '\n'; } } break; case 'RANDOM': - var list = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'array()'; + var list = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'array()'; if (mode == 'GET') { - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_get_random_item', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($list) {', ' return $list[rand(0,count($list)-1)];', '}']); code = functionName + '(' + list + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'GET_REMOVE') { - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_get_remove_random_item', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '(&$list) {', ' $x = rand(0,count($list)-1);', ' unset($list[$x]);', ' return array_values($list);', '}']); code = functionName + '(' + list + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (mode == 'REMOVE') { - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_remove_random_item', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '(&$list) {', ' unset($list[rand(0,count($list)-1)]);', '}']); @@ -253,20 +255,20 @@ Blockly.Go['lists_getIndex'] = function(block) { throw Error('Unhandled combination (lists_getIndex).'); }; -Blockly.Go['lists_setIndex'] = function(block) { +Go['lists_setIndex'] = function(block) { // Set element at index. // Note: Until February 2013 this block did not have MODE or WHERE inputs. var mode = block.getFieldValue('MODE') || 'GET'; var where = block.getFieldValue('WHERE') || 'FROM_START'; - var value = Blockly.Go.valueToCode(block, 'TO', - Blockly.Go.ORDER_ASSIGNMENT) || 'null'; + var value = Go.valueToCode(block, 'TO', + Go.ORDER_ASSIGNMENT) || 'null'; // Cache non-trivial values to variables to prevent repeated look-ups. // Closure, which accesses and modifies 'list'. function cacheList() { if (list.match(/^\$\w+$/)) { return ''; } - var listVar = Blockly.Go.variableDB_.getDistinctName( + var listVar = Go.variableDB_.getDistinctName( 'tmp_list', Blockly.VARIABLE_CATEGORY_NAME); var code = listVar + ' = &' + list + '\n'; list = listVar; @@ -275,22 +277,22 @@ Blockly.Go['lists_setIndex'] = function(block) { switch (where) { case 'FIRST': if (mode == 'SET') { - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_MEMBER) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_MEMBER) || 'array()'; return list + '[0] = ' + value + '\n'; } else if (mode == 'INSERT') { - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || 'array()'; return 'array_unshift(' + list + ', ' + value + ')\n'; } break; case 'LAST': - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || 'array()'; if (mode == 'SET') { - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_set_last_item', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '(&$list, $value) {', ' $list[count($list) - 1] = $value;', '}']); @@ -300,33 +302,33 @@ Blockly.Go['lists_setIndex'] = function(block) { } break; case 'FROM_START': - var at = Blockly.Go.getAdjusted(block, 'AT'); + var at = Go.getAdjusted(block, 'AT'); if (mode == 'SET') { - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_MEMBER) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_MEMBER) || 'array()'; return list + '[' + at + '] = ' + value + '\n'; } else if (mode == 'INSERT') { - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || 'array()'; return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ')\n'; } break; case 'FROM_END': - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || 'array()'; - var at = Blockly.Go.getAdjusted(block, 'AT', 1); + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || 'array()'; + var at = Go.getAdjusted(block, 'AT', 1); if (mode == 'SET') { - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_set_from_end', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '(&$list, $at, $value) {', ' $list[count($list) - $at] = $value;', '}']); return functionName + '(' + list + ', ' + at + ', ' + value + ')\n'; } else if (mode == 'INSERT') { - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_insert_from_end', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '(&$list, $at, $value) {', ' return array_splice($list, count($list) - $at, 0, $value);', '}']); @@ -334,10 +336,10 @@ Blockly.Go['lists_setIndex'] = function(block) { } break; case 'RANDOM': - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_REFERENCE) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_REFERENCE) || 'array()'; var code = cacheList(); - var xVar = Blockly.Go.variableDB_.getDistinctName( + var xVar = Go.variableDB_.getDistinctName( 'tmp_x', Blockly.VARIABLE_CATEGORY_NAME); code += xVar + ' = rand(0, count(' + list + ')-1)\n'; if (mode == 'SET') { @@ -353,10 +355,10 @@ Blockly.Go['lists_setIndex'] = function(block) { throw Error('Unhandled combination (lists_setIndex).'); }; -Blockly.Go['lists_getSublist'] = function(block) { +Go['lists_getSublist'] = function(block) { // Get sublist. - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || 'array()'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || 'array()'; var where1 = block.getFieldValue('WHERE1'); var where2 = block.getFieldValue('WHERE2'); if (where1 == 'FIRST' && where2 == 'LAST') { @@ -367,11 +369,11 @@ Blockly.Go['lists_getSublist'] = function(block) { // generate a helper function. switch (where1) { case 'FROM_START': - var at1 = Blockly.Go.getAdjusted(block, 'AT1'); + var at1 = Go.getAdjusted(block, 'AT1'); break; case 'FROM_END': - var at1 = Blockly.Go.getAdjusted(block, 'AT1', 1, false, - Blockly.Go.ORDER_SUBTRACTION); + var at1 = Go.getAdjusted(block, 'AT1', 1, false, + Go.ORDER_SUBTRACTION); at1 = 'count(' + list + ') - ' + at1; break; case 'FIRST': @@ -382,8 +384,8 @@ Blockly.Go['lists_getSublist'] = function(block) { } switch (where2) { case 'FROM_START': - var at2 = Blockly.Go.getAdjusted(block, 'AT2', 0, false, - Blockly.Go.ORDER_SUBTRACTION); + var at2 = Go.getAdjusted(block, 'AT2', 0, false, + Go.ORDER_SUBTRACTION); var length = at2 + ' - '; if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { length += at1; @@ -393,8 +395,8 @@ Blockly.Go['lists_getSublist'] = function(block) { length += ' + 1'; break; case 'FROM_END': - var at2 = Blockly.Go.getAdjusted(block, 'AT2', 0, false, - Blockly.Go.ORDER_SUBTRACTION); + var at2 = Go.getAdjusted(block, 'AT2', 0, false, + Go.ORDER_SUBTRACTION); var length = 'count(' + list + ') - ' + at2 + ' - '; if (Blockly.isNumber(String(at1)) || String(at1).match(/^\(.+\)$/)) { length += at1; @@ -415,11 +417,11 @@ Blockly.Go['lists_getSublist'] = function(block) { } code = 'array_slice(' + list + ', ' + at1 + ', ' + length + ')'; } else { - var at1 = Blockly.Go.getAdjusted(block, 'AT1'); - var at2 = Blockly.Go.getAdjusted(block, 'AT2'); - var functionName = Blockly.Go.provideFunction_( + var at1 = Go.getAdjusted(block, 'AT1'); + var at2 = Go.getAdjusted(block, 'AT2'); + var functionName = Go.provideFunction_( 'lists_get_sublist', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($list, $where1, $at1, $where2, $at2) {', ' if ($where1 == \'FROM_END\') {', ' $at1 = count($list) - 1 - $at1;', @@ -443,18 +445,18 @@ Blockly.Go['lists_getSublist'] = function(block) { var code = functionName + '(' + list + ', \'' + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; } - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_sort'] = function(block) { +Go['lists_sort'] = function(block) { // Block for sorting a list. - var listCode = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || 'array()'; + var listCode = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || 'array()'; var direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1; var type = block.getFieldValue('TYPE'); - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'lists_sort', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($list, $type, $direction) {', ' $sortCmpFuncs = array(', ' "NUMERIC" => "strnatcasecmp",', @@ -471,15 +473,15 @@ Blockly.Go['lists_sort'] = function(block) { '}']); var sortCode = functionName + '(' + listCode + ', "' + type + '", ' + direction + ')'; - return [sortCode, Blockly.Go.ORDER_FUNCTION_CALL]; + return [sortCode, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_split'] = function(block) { +Go['lists_split'] = function(block) { // Block for splitting text into a list, or joining a list into text. - var value_input = Blockly.Go.valueToCode(block, 'INPUT', - Blockly.Go.ORDER_COMMA); - var value_delim = Blockly.Go.valueToCode(block, 'DELIM', - Blockly.Go.ORDER_COMMA) || '\'\''; + var value_input = Go.valueToCode(block, 'INPUT', + Go.ORDER_COMMA); + var value_delim = Go.valueToCode(block, 'DELIM', + Go.ORDER_COMMA) || '\'\''; var mode = block.getFieldValue('MODE'); if (mode == 'SPLIT') { if (!value_input) { @@ -495,13 +497,13 @@ Blockly.Go['lists_split'] = function(block) { throw Error('Unknown mode: ' + mode); } var code = functionName + '(' + value_delim + ', ' + value_input + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['lists_reverse'] = function(block) { +Go['lists_reverse'] = function(block) { // Block for reversing a list. - var list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_COMMA) || '[]'; + var list = Go.valueToCode(block, 'LIST', + Go.ORDER_COMMA) || '[]'; var code = 'array_reverse(' + list + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; diff --git a/generators/go/logic.js b/generators/go/logic.js index 664605b8e65..11b2810888b 100644 --- a/generators/go/logic.js +++ b/generators/go/logic.js @@ -10,48 +10,48 @@ */ 'use strict'; -goog.provide('Blockly.Go.logic'); +goog.module('Blockly.Go.logic'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['controls_if'] = function(block) { +Go['controls_if'] = function(block) { // If/elseif/else condition. var n = 0; var code = '', branchCode, conditionCode; - if (Blockly.Go.STATEMENT_PREFIX) { + if (Go.STATEMENT_PREFIX) { // Automatic prefix insertion is switched off for this block. Add manually. - code += Blockly.Go.injectId(Blockly.Go.STATEMENT_PREFIX, block); + code += Go.injectId(Go.STATEMENT_PREFIX, block); } do { - conditionCode = Blockly.Go.valueToCode(block, 'IF' + n, - Blockly.Go.ORDER_NONE) || 'false'; - branchCode = Blockly.Go.statementToCode(block, 'DO' + n); - if (Blockly.Go.STATEMENT_SUFFIX) { - branchCode = Blockly.Go.prefixLines( - Blockly.Go.injectId(Blockly.Go.STATEMENT_SUFFIX, block), - Blockly.Go.INDENT) + branchCode; + conditionCode = Go.valueToCode(block, 'IF' + n, + Go.ORDER_NONE) || 'false'; + branchCode = Go.statementToCode(block, 'DO' + n); + if (Go.STATEMENT_SUFFIX) { + branchCode = Go.prefixLines( + Go.injectId(Go.STATEMENT_SUFFIX, block), + Go.INDENT) + branchCode; } code += (n > 0 ? ' else ' : '') + 'if ' + conditionCode + ' {\n' + branchCode + '}'; ++n; } while (block.getInput('IF' + n)); - if (block.getInput('ELSE') || Blockly.Go.STATEMENT_SUFFIX) { - branchCode = Blockly.Go.statementToCode(block, 'ELSE'); - if (Blockly.Go.STATEMENT_SUFFIX) { - branchCode = Blockly.Go.prefixLines( - Blockly.Go.injectId(Blockly.Go.STATEMENT_SUFFIX, block), - Blockly.Go.INDENT) + branchCode; + if (block.getInput('ELSE') || Go.STATEMENT_SUFFIX) { + branchCode = Go.statementToCode(block, 'ELSE'); + if (Go.STATEMENT_SUFFIX) { + branchCode = Go.prefixLines( + Go.injectId(Go.STATEMENT_SUFFIX, block), + Go.INDENT) + branchCode; } code += ' else {\n' + branchCode + '}'; } return code + '\n'; }; -Blockly.Go['controls_ifelse'] = Blockly.Go['controls_if']; +Go['controls_ifelse'] = Go['controls_if']; -Blockly.Go['logic_compare'] = function(block) { +Go['logic_compare'] = function(block) { // Comparison operator. var OPERATORS = { 'EQ': '==', @@ -63,20 +63,20 @@ Blockly.Go['logic_compare'] = function(block) { }; var operator = OPERATORS[block.getFieldValue('OP')]; var order = (operator == '==' || operator == '!=') ? - Blockly.Go.ORDER_EQUALITY : Blockly.Go.ORDER_RELATIONAL; - var argument0 = Blockly.Go.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'B', order) || '0'; + Go.ORDER_EQUALITY : Go.ORDER_RELATIONAL; + var argument0 = Go.valueToCode(block, 'A', order) || '0'; + var argument1 = Go.valueToCode(block, 'B', order) || '0'; var code = argument0 + ' ' + operator + ' ' + argument1; return [code, order]; }; -Blockly.Go['logic_operation'] = function(block) { +Go['logic_operation'] = function(block) { // Operations 'and', 'or'. var operator = (block.getFieldValue('OP') == 'AND') ? '&&' : '||'; - var order = (operator == '&&') ? Blockly.Go.ORDER_LOGICAL_AND : - Blockly.Go.ORDER_LOGICAL_OR; - var argument0 = Blockly.Go.valueToCode(block, 'A', order); - var argument1 = Blockly.Go.valueToCode(block, 'B', order); + var order = (operator == '&&') ? Go.ORDER_LOGICAL_AND : + Go.ORDER_LOGICAL_OR; + var argument0 = Go.valueToCode(block, 'A', order); + var argument1 = Go.valueToCode(block, 'B', order); if (!argument0 && !argument1) { // If there are no arguments, then the return value is false. argument0 = 'false'; @@ -95,34 +95,34 @@ Blockly.Go['logic_operation'] = function(block) { return [code, order]; }; -Blockly.Go['logic_negate'] = function(block) { +Go['logic_negate'] = function(block) { // Negation. - var order = Blockly.Go.ORDER_LOGICAL_NOT; - var argument0 = Blockly.Go.valueToCode(block, 'BOOL', order) || + var order = Go.ORDER_LOGICAL_NOT; + var argument0 = Go.valueToCode(block, 'BOOL', order) || 'true'; var code = '!' + argument0; return [code, order]; }; -Blockly.Go['logic_boolean'] = function(block) { +Go['logic_boolean'] = function(block) { // Boolean values true and false. var code = (block.getFieldValue('BOOL') == 'TRUE') ? 'true' : 'false'; - return [code, Blockly.Go.ORDER_ATOMIC]; + return [code, Go.ORDER_ATOMIC]; }; -Blockly.Go['logic_null'] = function(block) { +Go['logic_null'] = function(block) { // Null data type. - return ['nil', Blockly.Go.ORDER_ATOMIC]; + return ['nil', Go.ORDER_ATOMIC]; }; -Blockly.Go['logic_ternary'] = function(block) { +Go['logic_ternary'] = function(block) { // Ternary operator. - var value_if = Blockly.Go.valueToCode(block, 'IF', - Blockly.Go.ORDER_CONDITIONAL) || 'false'; - var value_then = Blockly.Go.valueToCode(block, 'THEN', - Blockly.Go.ORDER_CONDITIONAL) || 'nil'; - var value_else = Blockly.Go.valueToCode(block, 'ELSE', - Blockly.Go.ORDER_CONDITIONAL) || 'nil'; + var value_if = Go.valueToCode(block, 'IF', + Go.ORDER_CONDITIONAL) || 'false'; + var value_then = Go.valueToCode(block, 'THEN', + Go.ORDER_CONDITIONAL) || 'nil'; + var value_else = Go.valueToCode(block, 'ELSE', + Go.ORDER_CONDITIONAL) || 'nil'; var code = value_if + ' ? ' + value_then + ' : ' + value_else; - return [code, Blockly.Go.ORDER_CONDITIONAL]; + return [code, Go.ORDER_CONDITIONAL]; }; diff --git a/generators/go/loops.js b/generators/go/loops.js index 60c4ca810fb..ccc2057820e 100644 --- a/generators/go/loops.js +++ b/generators/go/loops.js @@ -10,29 +10,29 @@ */ 'use strict'; -goog.provide('Blockly.Go.loops'); +goog.module('Blockly.Go.loops'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['controls_repeat_ext'] = function(block) { +Go['controls_repeat_ext'] = function(block) { // Repeat n times. if (block.getField('TIMES')) { // Internal number. var repeats = String(Number(block.getFieldValue('TIMES'))); } else { // External number. - var repeats = Blockly.Go.valueToCode(block, 'TIMES', - Blockly.Go.ORDER_ASSIGNMENT) || '0'; + var repeats = Go.valueToCode(block, 'TIMES', + Go.ORDER_ASSIGNMENT) || '0'; } - var branch = Blockly.Go.statementToCode(block, 'DO'); - branch = Blockly.Go.addLoopTrap(branch, block); + var branch = Go.statementToCode(block, 'DO'); + branch = Go.addLoopTrap(branch, block); var code = ''; - var loopVar = Blockly.Go.variableDB_.getDistinctName( + var loopVar = Go.variableDB_.getDistinctName( 'count', Blockly.VARIABLE_CATEGORY_NAME); var endVar = repeats; if (!repeats.match(/^\w+$/) && !Blockly.isNumber(repeats)) { - endVar = Blockly.Go.variableDB_.getDistinctName( + endVar = Go.variableDB_.getDistinctName( 'repeat_end', Blockly.VARIABLE_CATEGORY_NAME); code += endVar + ' = ' + repeats + '\n'; } @@ -43,34 +43,34 @@ Blockly.Go['controls_repeat_ext'] = function(block) { return code; }; -Blockly.Go['controls_repeat'] = Blockly.Go['controls_repeat_ext']; +Go['controls_repeat'] = Go['controls_repeat_ext']; -Blockly.Go['controls_whileUntil'] = function(block) { +Go['controls_whileUntil'] = function(block) { // Do while/until loop. var until = block.getFieldValue('MODE') == 'UNTIL'; - var argument0 = Blockly.Go.valueToCode(block, 'BOOL', - until ? Blockly.Go.ORDER_LOGICAL_NOT : - Blockly.Go.ORDER_NONE) || 'false'; - var branch = Blockly.Go.statementToCode(block, 'DO'); - branch = Blockly.Go.addLoopTrap(branch, block); + var argument0 = Go.valueToCode(block, 'BOOL', + until ? Go.ORDER_LOGICAL_NOT : + Go.ORDER_NONE) || 'false'; + var branch = Go.statementToCode(block, 'DO'); + branch = Go.addLoopTrap(branch, block); if (until) { argument0 = '!' + argument0; } return 'for ' + argument0 + ' {\n' + branch + '}\n'; }; -Blockly.Go['controls_for'] = function(block) { +Go['controls_for'] = function(block) { // For loop. - var variable0 = Blockly.Go.variableDB_.getName( + var variable0 = Go.variableDB_.getName( block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); - var argument0 = Blockly.Go.valueToCode(block, 'FROM', - Blockly.Go.ORDER_ASSIGNMENT) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'TO', - Blockly.Go.ORDER_ASSIGNMENT) || '0'; - var increment = Blockly.Go.valueToCode(block, 'BY', - Blockly.Go.ORDER_ASSIGNMENT) || '1'; - var branch = Blockly.Go.statementToCode(block, 'DO'); - branch = Blockly.Go.addLoopTrap(branch, block); + var argument0 = Go.valueToCode(block, 'FROM', + Go.ORDER_ASSIGNMENT) || '0'; + var argument1 = Go.valueToCode(block, 'TO', + Go.ORDER_ASSIGNMENT) || '0'; + var increment = Go.valueToCode(block, 'BY', + Go.ORDER_ASSIGNMENT) || '1'; + var branch = Go.statementToCode(block, 'DO'); + branch = Go.addLoopTrap(branch, block); var code; if (Blockly.isNumber(argument0) && Blockly.isNumber(argument1) && Blockly.isNumber(increment)) { @@ -91,19 +91,19 @@ Blockly.Go['controls_for'] = function(block) { // Cache non-trivial values to variables to prevent repeated look-ups. var startVar = argument0; if (!argument0.match(/^\w+$/) && !Blockly.isNumber(argument0)) { - startVar = Blockly.Go.variableDB_.getDistinctName( + startVar = Go.variableDB_.getDistinctName( variable0 + '_start', Blockly.VARIABLE_CATEGORY_NAME); code += startVar + ' = ' + argument0 + '\n'; } var endVar = argument1; if (!argument1.match(/^\w+$/) && !Blockly.isNumber(argument1)) { - endVar = Blockly.Go.variableDB_.getDistinctName( + endVar = Go.variableDB_.getDistinctName( variable0 + '_end', Blockly.VARIABLE_CATEGORY_NAME); code += endVar + ' = ' + argument1 + '\n'; } // Determine loop direction at start, in case one of the bounds // changes during loop execution. - var incVar = Blockly.Go.variableDB_.getDistinctName( + var incVar = Go.variableDB_.getDistinctName( variable0 + '_inc', Blockly.VARIABLE_CATEGORY_NAME); code += incVar + ' = '; if (Blockly.isNumber(increment)) { @@ -112,7 +112,7 @@ Blockly.Go['controls_for'] = function(block) { code += 'math.Abs(' + increment + ')\n'; } code += 'if (' + startVar + ' > ' + endVar + ') {\n'; - code += Blockly.Go.INDENT + incVar + ' = -' + incVar + '\n'; + code += Go.INDENT + incVar + ' = -' + incVar + '\n'; code += '}\n'; code += 'for ' + variable0 + ' := ' + startVar + '; ' + incVar + ' >= 0 ? ' + @@ -124,40 +124,40 @@ Blockly.Go['controls_for'] = function(block) { return code; }; -Blockly.Go['controls_forEach'] = function(block) { +Go['controls_forEach'] = function(block) { // For each loop. - var variable0 = Blockly.Go.variableDB_.getName( + var variable0 = Go.variableDB_.getName( block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); - var argument0 = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_ASSIGNMENT) || '[]'; - var branch = Blockly.Go.statementToCode(block, 'DO'); - branch = Blockly.Go.addLoopTrap(branch, block); + var argument0 = Go.valueToCode(block, 'LIST', + Go.ORDER_ASSIGNMENT) || '[]'; + var branch = Go.statementToCode(block, 'DO'); + branch = Go.addLoopTrap(branch, block); var code = ''; code += 'for _,' + variable0 + ' := range ' + argument0 + ' {\n' + branch + '}\n'; return code; }; -Blockly.Go['controls_flow_statements'] = function(block) { +Go['controls_flow_statements'] = function(block) { // Flow statements: continue, break. var xfix = ''; - if (Blockly.Go.STATEMENT_PREFIX) { + if (Go.STATEMENT_PREFIX) { // Automatic prefix insertion is switched off for this block. Add manually. - xfix += Blockly.Go.injectId(Blockly.Go.STATEMENT_PREFIX, block); + xfix += Go.injectId(Go.STATEMENT_PREFIX, block); } - if (Blockly.Go.STATEMENT_SUFFIX) { + if (Go.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the break/continue is triggered. - xfix += Blockly.Go.injectId(Blockly.Go.STATEMENT_SUFFIX, block); + xfix += Go.injectId(Go.STATEMENT_SUFFIX, block); } - if (Blockly.Go.STATEMENT_PREFIX) { + if (Go.STATEMENT_PREFIX) { var loop = Blockly.Constants.Loops .CONTROL_FLOW_IN_LOOP_CHECK_MIXIN.getSurroundLoop(block); if (loop && !loop.suppressPrefixSuffix) { // Inject loop's statement prefix here since the regular one at the end // of the loop will not get executed if 'continue' is triggered. // In the case of 'break', a prefix is needed due to the loop's suffix. - xfix += Blockly.Go.injectId(Blockly.Go.STATEMENT_PREFIX, loop); + xfix += Go.injectId(Go.STATEMENT_PREFIX, loop); } } switch (block.getFieldValue('FLOW')) { diff --git a/generators/go/math.js b/generators/go/math.js index 58784c359fc..71cb1bf531d 100644 --- a/generators/go/math.js +++ b/generators/go/math.js @@ -10,16 +10,16 @@ */ 'use strict'; -goog.provide('Blockly.Go.math'); +goog.module('Blockly.Go.math'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['math_number'] = function(block) { +Go['math_number'] = function(block) { // Numeric value. var code = Number(block.getFieldValue('NUM')); - var order = code >= 0 ? Blockly.Go.ORDER_ATOMIC : - Blockly.Go.ORDER_UNARY_NEGATION; + var order = code >= 0 ? Go.ORDER_ATOMIC : + Go.ORDER_UNARY_NEGATION; if (code == Infinity) { code = 'INF'; } else if (code == -Infinity) { @@ -28,46 +28,46 @@ Blockly.Go['math_number'] = function(block) { return [code, order]; }; -Blockly.Go['math_arithmetic'] = function(block) { +Go['math_arithmetic'] = function(block) { // Basic arithmetic operators, and power. var OPERATORS = { - 'ADD': [' + ', Blockly.Go.ORDER_ADDITION], - 'MINUS': [' - ', Blockly.Go.ORDER_SUBTRACTION], - 'MULTIPLY': [' * ', Blockly.Go.ORDER_MULTIPLICATION], - 'DIVIDE': [' / ', Blockly.Go.ORDER_DIVISION], - 'POWER': [' ^ ', Blockly.Go.ORDER_POWER] + 'ADD': [' + ', Go.ORDER_ADDITION], + 'MINUS': [' - ', Go.ORDER_SUBTRACTION], + 'MULTIPLY': [' * ', Go.ORDER_MULTIPLICATION], + 'DIVIDE': [' / ', Go.ORDER_DIVISION], + 'POWER': [' ^ ', Go.ORDER_POWER] }; var tuple = OPERATORS[block.getFieldValue('OP')]; var operator = tuple[0]; var order = tuple[1]; - var argument0 = Blockly.Go.valueToCode(block, 'A', order) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'B', order) || '0'; + var argument0 = Go.valueToCode(block, 'A', order) || '0'; + var argument1 = Go.valueToCode(block, 'B', order) || '0'; var code = argument0 + operator + argument1; return [code, order]; }; -Blockly.Go['math_single'] = function(block) { +Go['math_single'] = function(block) { // Math operators with single operand. var operator = block.getFieldValue('OP'); var code; var arg; if (operator == 'NEG') { // Negation is a special case given its different operator precedence. - arg = Blockly.Go.valueToCode(block, 'NUM', - Blockly.Go.ORDER_UNARY_NEGATION) || '0'; + arg = Go.valueToCode(block, 'NUM', + Go.ORDER_UNARY_NEGATION) || '0'; if (arg[0] == '-') { // --3 is not legal in JS. arg = ' ' + arg; } code = '-' + arg; - return [code, Blockly.Go.ORDER_UNARY_NEGATION]; + return [code, Go.ORDER_UNARY_NEGATION]; } if (operator == 'SIN' || operator == 'COS' || operator == 'TAN') { - arg = Blockly.Go.valueToCode(block, 'NUM', - Blockly.Go.ORDER_DIVISION) || '0'; + arg = Go.valueToCode(block, 'NUM', + Go.ORDER_DIVISION) || '0'; } else { - arg = Blockly.Go.valueToCode(block, 'NUM', - Blockly.Go.ORDER_NONE) || '0'; + arg = Go.valueToCode(block, 'NUM', + Go.ORDER_NONE) || '0'; } // First, handle cases which generate values that don't need parentheses // wrapping the code. @@ -107,7 +107,7 @@ Blockly.Go['math_single'] = function(block) { break; } if (code) { - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } // Second, handle cases which generate values that may need parentheses // wrapping the code. @@ -127,34 +127,34 @@ Blockly.Go['math_single'] = function(block) { default: throw Error('Unknown math operator: ' + operator); } - return [code, Blockly.Go.ORDER_DIVISION]; + return [code, Go.ORDER_DIVISION]; }; -Blockly.Go['math_constant'] = function(block) { +Go['math_constant'] = function(block) { // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY. var CONSTANTS = { - 'PI': ['math.Pi', Blockly.Go.ORDER_ATOMIC], - 'E': ['math.E', Blockly.Go.ORDER_ATOMIC], - 'GOLDEN_RATIO': ['(1 + math.Sqrt(5)) / 2', Blockly.Go.ORDER_DIVISION], - 'SQRT2': ['M_SQRT2', Blockly.Go.ORDER_ATOMIC], - 'SQRT1_2': ['M_SQRT1_2', Blockly.Go.ORDER_ATOMIC], - 'INFINITY': ['INF', Blockly.Go.ORDER_ATOMIC] + 'PI': ['math.Pi', Go.ORDER_ATOMIC], + 'E': ['math.E', Go.ORDER_ATOMIC], + 'GOLDEN_RATIO': ['(1 + math.Sqrt(5)) / 2', Go.ORDER_DIVISION], + 'SQRT2': ['M_SQRT2', Go.ORDER_ATOMIC], + 'SQRT1_2': ['M_SQRT1_2', Go.ORDER_ATOMIC], + 'INFINITY': ['INF', Go.ORDER_ATOMIC] }; return CONSTANTS[block.getFieldValue('CONSTANT')]; }; -Blockly.Go['math_number_property'] = function(block) { +Go['math_number_property'] = function(block) { // Check if a number is even, odd, prime, whole, positive, or negative // or if it is divisible by certain number. Returns true or false. - var number_to_check = Blockly.Go.valueToCode(block, 'NUMBER_TO_CHECK', - Blockly.Go.ORDER_MODULUS) || '0'; + var number_to_check = Go.valueToCode(block, 'NUMBER_TO_CHECK', + Go.ORDER_MODULUS) || '0'; var dropdown_property = block.getFieldValue('PROPERTY'); var code; if (dropdown_property == 'PRIME') { // Prime is a special case as it is not a one-liner test. - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'math_isPrime', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + '($n) {', + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($n) {', ' // https://en.wikipedia.org/wiki/Primality_test#Naive_methods', ' if ($n == 2 || $n == 3) {', ' return true', @@ -174,7 +174,7 @@ Blockly.Go['math_number_property'] = function(block) { ' return true', '}']); code = functionName + '(' + number_to_check + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } switch (dropdown_property) { case 'EVEN': @@ -193,80 +193,80 @@ Blockly.Go['math_number_property'] = function(block) { code = number_to_check + ' < 0'; break; case 'DIVISIBLE_BY': - var divisor = Blockly.Go.valueToCode(block, 'DIVISOR', - Blockly.Go.ORDER_MODULUS) || '0'; + var divisor = Go.valueToCode(block, 'DIVISOR', + Go.ORDER_MODULUS) || '0'; code = number_to_check + ' % ' + divisor + ' == 0'; break; } - return [code, Blockly.Go.ORDER_EQUALITY]; + return [code, Go.ORDER_EQUALITY]; }; -Blockly.Go['math_change'] = function(block) { +Go['math_change'] = function(block) { // Add to a variable in place. - var argument0 = Blockly.Go.valueToCode(block, 'DELTA', - Blockly.Go.ORDER_ADDITION) || '0'; - var varName = Blockly.Go.variableDB_.getName( + var argument0 = Go.valueToCode(block, 'DELTA', + Go.ORDER_ADDITION) || '0'; + var varName = Go.variableDB_.getName( block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); return varName + ' += ' + argument0 + '\n'; }; // Rounding functions have a single operand. -Blockly.Go['math_round'] = Blockly.Go['math_single']; +Go['math_round'] = Go['math_single']; // Trigonometry functions have a single operand. -Blockly.Go['math_trig'] = Blockly.Go['math_single']; +Go['math_trig'] = Go['math_single']; -Blockly.Go['math_on_list'] = function(block) { +Go['math_on_list'] = function(block) { // Math functions for lists. var func = block.getFieldValue('OP'); var list, code; switch (func) { case 'SUM': - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_FUNCTION_CALL) || 'array()'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_FUNCTION_CALL) || 'array()'; code = 'array_sum(' + list + ')'; break; case 'MIN': - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_FUNCTION_CALL) || 'array()'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_FUNCTION_CALL) || 'array()'; code = 'min(' + list + ')'; break; case 'MAX': - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_FUNCTION_CALL) || 'array()'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_FUNCTION_CALL) || 'array()'; code = 'max(' + list + ')'; break; case 'AVERAGE': - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'math_mean', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($myList) {', ' return array_sum($myList) / count($myList)', '}']); - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_NONE) || 'array()'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_NONE) || 'array()'; code = functionName + '(' + list + ')'; break; case 'MEDIAN': - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'math_median', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($arr) {', ' sort($arr,SORT_NUMERIC)', ' return (count($arr) % 2) ? $arr[floor(count($arr)/2)] : ', ' ($arr[floor(count($arr)/2)] + $arr[floor(count($arr)/2)' + ' - 1]) / 2', '}']); - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_NONE) || '[]'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_NONE) || '[]'; code = functionName + '(' + list + ')'; break; case 'MODE': // As a list of numbers can contain more than one mode, // the returned result is provided as an array. // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]. - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'math_modes', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($values) {', ' if (empty($values)) return array()', ' $counts = array_count_values($values)', @@ -274,14 +274,14 @@ Blockly.Go['math_on_list'] = function(block) { ' $modes = array_keys($counts, current($counts), true)', ' return $modes', '}']); - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_NONE) || '[]'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_NONE) || '[]'; code = functionName + '(' + list + ')'; break; case 'STD_DEV': - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'math_standard_deviation', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($numbers) {', ' $n = count($numbers)', ' if (!$n) return null', @@ -290,60 +290,60 @@ Blockly.Go['math_on_list'] = function(block) { 'pow($num - $mean, 2)', ' return sqrt(array_sum($devs) / (count($devs) - 1))', '}']); - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_NONE) || '[]'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_NONE) || '[]'; code = functionName + '(' + list + ')'; break; case 'RANDOM': - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'math_random_list', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($list) {', ' $x = rand(0, count($list)-1)', ' return $list[$x]', '}']); - list = Blockly.Go.valueToCode(block, 'LIST', - Blockly.Go.ORDER_NONE) || '[]'; + list = Go.valueToCode(block, 'LIST', + Go.ORDER_NONE) || '[]'; code = functionName + '(' + list + ')'; break; default: throw Error('Unknown operator: ' + func); } - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['math_modulo'] = function(block) { +Go['math_modulo'] = function(block) { // Remainder computation. - var argument0 = Blockly.Go.valueToCode(block, 'DIVIDEND', - Blockly.Go.ORDER_MODULUS) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'DIVISOR', - Blockly.Go.ORDER_MODULUS) || '0'; + var argument0 = Go.valueToCode(block, 'DIVIDEND', + Go.ORDER_MODULUS) || '0'; + var argument1 = Go.valueToCode(block, 'DIVISOR', + Go.ORDER_MODULUS) || '0'; var code = argument0 + ' % ' + argument1; - return [code, Blockly.Go.ORDER_MODULUS]; + return [code, Go.ORDER_MODULUS]; }; -Blockly.Go['math_constrain'] = function(block) { +Go['math_constrain'] = function(block) { // Constrain a number between two limits. - var argument0 = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_COMMA) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'LOW', - Blockly.Go.ORDER_COMMA) || '0'; - var argument2 = Blockly.Go.valueToCode(block, 'HIGH', - Blockly.Go.ORDER_COMMA) || 'Infinity'; + var argument0 = Go.valueToCode(block, 'VALUE', + Go.ORDER_COMMA) || '0'; + var argument1 = Go.valueToCode(block, 'LOW', + Go.ORDER_COMMA) || '0'; + var argument2 = Go.valueToCode(block, 'HIGH', + Go.ORDER_COMMA) || 'Infinity'; var code = 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['math_random_int'] = function(block) { +Go['math_random_int'] = function(block) { // Random integer between [X] and [Y]. - var argument0 = Blockly.Go.valueToCode(block, 'FROM', - Blockly.Go.ORDER_COMMA) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'TO', - Blockly.Go.ORDER_COMMA) || '0'; - var functionName = Blockly.Go.provideFunction_( + var argument0 = Go.valueToCode(block, 'FROM', + Go.ORDER_COMMA) || '0'; + var argument1 = Go.valueToCode(block, 'TO', + Go.ORDER_COMMA) || '0'; + var functionName = Go.provideFunction_( 'math_random_int', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($a, $b) {', ' if ($a > $b) {', ' return rand($b, $a)', @@ -351,20 +351,20 @@ Blockly.Go['math_random_int'] = function(block) { ' return rand($a, $b)', '}']); var code = functionName + '(' + argument0 + ', ' + argument1 + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['math_random_float'] = function(block) { +Go['math_random_float'] = function(block) { // Random fraction between 0 and 1. - return ['(float)rand()/(float)getrandmax()', Blockly.Go.ORDER_FUNCTION_CALL]; + return ['(float)rand()/(float)getrandmax()', Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['math_atan2'] = function(block) { +Go['math_atan2'] = function(block) { // Arctangent of point (X, Y) in degrees from -180 to 180. - var argument0 = Blockly.Go.valueToCode(block, 'X', - Blockly.Go.ORDER_COMMA) || '0'; - var argument1 = Blockly.Go.valueToCode(block, 'Y', - Blockly.Go.ORDER_COMMA) || '0'; + var argument0 = Go.valueToCode(block, 'X', + Go.ORDER_COMMA) || '0'; + var argument1 = Go.valueToCode(block, 'Y', + Go.ORDER_COMMA) || '0'; return ['atan2(' + argument1 + ', ' + argument0 + ') / pi() * 180', - Blockly.Go.ORDER_DIVISION]; + Go.ORDER_DIVISION]; }; diff --git a/generators/go/procedures.js b/generators/go/procedures.js index 11b19c99683..a5349172b8b 100644 --- a/generators/go/procedures.js +++ b/generators/go/procedures.js @@ -10,11 +10,11 @@ */ 'use strict'; -goog.provide('Blockly.Go.procedures'); +goog.module('Blockly.Go.procedures'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['procedures_defreturn'] = function(block) { +Go['procedures_defreturn'] = function(block) { // Define a procedure with a return value. // First, add a 'global' statement for every variable that is not shadowed by // a local parameter. @@ -25,105 +25,105 @@ Blockly.Go['procedures_defreturn'] = function(block) { /*for (var i = 0, variable; variable = variables[i]; i++) { varName = variable.name; if (block.arguments_.indexOf(varName) == -1) { - globals.push(Blockly.Go.variableDB_.getName(varName, + globals.push(Go.variableDB_.getName(varName, Blockly.VARIABLE_CATEGORY_NAME)); } }*/ // Add developer variables. /*var devVarList = Blockly.Variables.allDeveloperVariables(workspace); for (var i = 0; i < devVarList.length; i++) { - globals.push(Blockly.Go.variableDB_.getName(devVarList[i], + globals.push(Go.variableDB_.getName(devVarList[i], Blockly.Names.DEVELOPER_VARIABLE_TYPE)); } globals = globals.length ? - Blockly.Go.INDENT + 'global ' + globals.join(', ') + '\n' : ''; + Go.INDENT + 'global ' + globals.join(', ') + '\n' : ''; */ - var funcName = Blockly.Go.variableDB_.getName( + var funcName = Go.variableDB_.getName( block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME); var xfix1 = ''; - if (Blockly.Go.STATEMENT_PREFIX) { - xfix1 += Blockly.Go.injectId(Blockly.Go.STATEMENT_PREFIX, block); + if (Go.STATEMENT_PREFIX) { + xfix1 += Go.injectId(Go.STATEMENT_PREFIX, block); } - if (Blockly.Go.STATEMENT_SUFFIX) { - xfix1 += Blockly.Go.injectId(Blockly.Go.STATEMENT_SUFFIX, block); + if (Go.STATEMENT_SUFFIX) { + xfix1 += Go.injectId(Go.STATEMENT_SUFFIX, block); } if (xfix1) { - xfix1 = Blockly.Go.prefixLines(xfix1, Blockly.Go.INDENT); + xfix1 = Go.prefixLines(xfix1, Go.INDENT); } var loopTrap = ''; - if (Blockly.Go.INFINITE_LOOP_TRAP) { - loopTrap = Blockly.Go.prefixLines( - Blockly.Go.injectId(Blockly.Go.INFINITE_LOOP_TRAP, block), - Blockly.Go.INDENT); + if (Go.INFINITE_LOOP_TRAP) { + loopTrap = Go.prefixLines( + Go.injectId(Go.INFINITE_LOOP_TRAP, block), + Go.INDENT); } - var branch = Blockly.Go.statementToCode(block, 'STACK'); - var returnValue = Blockly.Go.valueToCode(block, 'RETURN', - Blockly.Go.ORDER_NONE) || ''; + var branch = Go.statementToCode(block, 'STACK'); + var returnValue = Go.valueToCode(block, 'RETURN', + Go.ORDER_NONE) || ''; var xfix2 = ''; if (branch && returnValue) { // After executing the function body, revisit this block for the return. xfix2 = xfix1; } if (returnValue) { - returnValue = Blockly.Go.INDENT + 'return ' + returnValue + '\n'; + returnValue = Go.INDENT + 'return ' + returnValue + '\n'; } var args = []; for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.Go.variableDB_.getName(block.arguments_[i], + args[i] = Go.variableDB_.getName(block.arguments_[i], Blockly.VARIABLE_CATEGORY_NAME); } var code = 'func ' + funcName + '(' + args.join(', ') + ') {\n' + xfix1 + loopTrap + branch + xfix2 + returnValue + '}'; - code = Blockly.Go.scrub_(block, code); + code = Go.scrub_(block, code); // Add % so as not to collide with helper functions in definitions list. - Blockly.Go.definitions_['%' + funcName] = code; + Go.definitions_['%' + funcName] = code; return null; }; // Defining a procedure without a return value uses the same generator as // a procedure with a return value. -Blockly.Go['procedures_defnoreturn'] = - Blockly.Go['procedures_defreturn']; +Go['procedures_defnoreturn'] = + Go['procedures_defreturn']; -Blockly.Go['procedures_callreturn'] = function(block) { +Go['procedures_callreturn'] = function(block) { // Call a procedure with a return value. - var funcName = Blockly.Go.variableDB_.getName( + var funcName = Go.variableDB_.getName( block.getFieldValue('NAME'), Blockly.PROCEDURE_CATEGORY_NAME); var args = []; for (var i = 0; i < block.arguments_.length; i++) { - args[i] = Blockly.Go.valueToCode(block, 'ARG' + i, - Blockly.Go.ORDER_COMMA) || 'null'; + args[i] = Go.valueToCode(block, 'ARG' + i, + Go.ORDER_COMMA) || 'null'; } var code = funcName + '(' + args.join(', ') + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['procedures_callnoreturn'] = function(block) { +Go['procedures_callnoreturn'] = function(block) { // Call a procedure with no return value. // Generated code is for a function call as a statement is the same as a // function call as a value, with the addition of line ending. - var tuple = Blockly.Go['procedures_callreturn'](block); + var tuple = Go['procedures_callreturn'](block); return tuple[0] + '\n'; }; -Blockly.Go['procedures_ifreturn'] = function(block) { +Go['procedures_ifreturn'] = function(block) { // Conditionally return value from a procedure. - var condition = Blockly.Go.valueToCode(block, 'CONDITION', - Blockly.Go.ORDER_NONE) || 'false'; + var condition = Go.valueToCode(block, 'CONDITION', + Go.ORDER_NONE) || 'false'; var code = 'if (' + condition + ') {\n'; - if (Blockly.Go.STATEMENT_SUFFIX) { + if (Go.STATEMENT_SUFFIX) { // Inject any statement suffix here since the regular one at the end // will not get executed if the return is triggered. - code += Blockly.Go.prefixLines( - Blockly.Go.injectId(Blockly.Go.STATEMENT_SUFFIX, block), - Blockly.Go.INDENT); + code += Go.prefixLines( + Go.injectId(Go.STATEMENT_SUFFIX, block), + Go.INDENT); } if (block.hasReturnValue_) { - var value = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || 'null'; - code += Blockly.Go.INDENT + 'return ' + value + '\n'; + var value = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || 'null'; + code += Go.INDENT + 'return ' + value + '\n'; } else { - code += Blockly.Go.INDENT + 'return\n'; + code += Go.INDENT + 'return\n'; } code += '}\n'; return code; diff --git a/generators/go/text.js b/generators/go/text.js index b30d9ece2b5..f8c6bb3514f 100644 --- a/generators/go/text.js +++ b/generators/go/text.js @@ -10,80 +10,81 @@ */ 'use strict'; -goog.provide('Blockly.Go.texts'); +goog.module('Blockly.Go.texts'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['text'] = function(block) { + +Go['text'] = function(block) { // Text value. - var code = Blockly.Go.quote_(block.getFieldValue('TEXT')); - return [code, Blockly.Go.ORDER_ATOMIC]; + var code = Go.quote_(block.getFieldValue('TEXT')); + return [code, Go.ORDER_ATOMIC]; }; -Blockly.Go['text_multiline'] = function(block) { +Go['text_multiline'] = function(block) { // Text value. - var code = Blockly.Go.multiline_quote_(block.getFieldValue('TEXT')); - return [code, Blockly.Go.ORDER_ATOMIC]; + var code = Go.multiline_quote_(block.getFieldValue('TEXT')); + return [code, Go.ORDER_ATOMIC]; }; -Blockly.Go['text_join'] = function(block) { +Go['text_join'] = function(block) { // Create a string made up of any number of elements of any type. if (block.itemCount_ == 0) { - return ['\'\'', Blockly.Go.ORDER_ATOMIC]; + return ['\'\'', Go.ORDER_ATOMIC]; } else if (block.itemCount_ == 1) { - var element = Blockly.Go.valueToCode(block, 'ADD0', - Blockly.Go.ORDER_NONE) || '\'\''; + var element = Go.valueToCode(block, 'ADD0', + Go.ORDER_NONE) || '\'\''; var code = element; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } else if (block.itemCount_ == 2) { - var element0 = Blockly.Go.valueToCode(block, 'ADD0', - Blockly.Go.ORDER_ATOMIC) || '\'\''; - var element1 = Blockly.Go.valueToCode(block, 'ADD1', - Blockly.Go.ORDER_ATOMIC) || '\'\''; + var element0 = Go.valueToCode(block, 'ADD0', + Go.ORDER_ATOMIC) || '\'\''; + var element1 = Go.valueToCode(block, 'ADD1', + Go.ORDER_ATOMIC) || '\'\''; var code = element0 + ' . ' + element1; - return [code, Blockly.Go.ORDER_STRING_CONCAT]; + return [code, Go.ORDER_STRING_CONCAT]; } else { var elements = new Array(block.itemCount_); for (var i = 0; i < block.itemCount_; i++) { - elements[i] = Blockly.Go.valueToCode(block, 'ADD' + i, - Blockly.Go.ORDER_COMMA) || '\'\''; + elements[i] = Go.valueToCode(block, 'ADD' + i, + Go.ORDER_COMMA) || '\'\''; } var code = 'strings.Join(\'\', []string{' + elements.join(',') + '})'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } }; -Blockly.Go['text_append'] = function(block) { +Go['text_append'] = function(block) { // Append to a variable in place. - var varName = Blockly.Go.variableDB_.getName( + var varName = Go.variableDB_.getName( block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); - var value = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_ASSIGNMENT) || '\'\''; + var value = Go.valueToCode(block, 'TEXT', + Go.ORDER_ASSIGNMENT) || '\'\''; return varName + ' += ' + value + '\n'; }; -Blockly.Go['text_length'] = function(block) { - var text = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || '\'\''; +Go['text_length'] = function(block) { + var text = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || '\'\''; return 'len(' + text + ')'; }; -Blockly.Go['text_isEmpty'] = function(block) { +Go['text_isEmpty'] = function(block) { // Is the string null or array empty? - var text = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || '\'\''; - return ['empty(' + text + ')', Blockly.Go.ORDER_FUNCTION_CALL]; + var text = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || '\'\''; + return ['empty(' + text + ')', Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_indexOf'] = function(block) { +Go['text_indexOf'] = function(block) { // Search the text for a substring. var operator = block.getFieldValue('END') == 'FIRST' ? 'strpos' : 'strrpos'; - var substring = Blockly.Go.valueToCode(block, 'FIND', - Blockly.Go.ORDER_NONE) || '\'\''; - var text = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_NONE) || '\'\''; + var substring = Go.valueToCode(block, 'FIND', + Go.ORDER_NONE) || '\'\''; + var text = Go.valueToCode(block, 'VALUE', + Go.ORDER_NONE) || '\'\''; if (block.workspace.options.oneBasedIndex) { var errorIndex = ' 0'; var indexAdjustment = ' + 1'; @@ -91,66 +92,66 @@ Blockly.Go['text_indexOf'] = function(block) { var errorIndex = ' -1'; var indexAdjustment = ''; } - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( block.getFieldValue('END') == 'FIRST' ? 'text_indexOf' : 'text_lastIndexOf', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($text, $search) {', ' $pos = ' + operator + '($text, $search)', ' return $pos === false ? ' + errorIndex + ' : $pos' + indexAdjustment + '', '}']); var code = functionName + '(' + text + ', ' + substring + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_charAt'] = function(block) { +Go['text_charAt'] = function(block) { // Get letter at index. var where = block.getFieldValue('WHERE') || 'FROM_START'; - var textOrder = (where == 'RANDOM') ? Blockly.Go.ORDER_NONE : - Blockly.Go.ORDER_COMMA; - var text = Blockly.Go.valueToCode(block, 'VALUE', textOrder) || '\'\''; + var textOrder = (where == 'RANDOM') ? Go.ORDER_NONE : + Go.ORDER_COMMA; + var text = Go.valueToCode(block, 'VALUE', textOrder) || '\'\''; switch (where) { case 'FIRST': var code = 'substr(' + text + ', 0, 1)'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; case 'LAST': var code = 'substr(' + text + ', -1)'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; case 'FROM_START': - var at = Blockly.Go.getAdjusted(block, 'AT'); + var at = Go.getAdjusted(block, 'AT'); var code = 'substr(' + text + ', ' + at + ', 1)'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; case 'FROM_END': - var at = Blockly.Go.getAdjusted(block, 'AT', 1, true); + var at = Go.getAdjusted(block, 'AT', 1, true); var code = 'substr(' + text + ', ' + at + ', 1)'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; case 'RANDOM': - var functionName = Blockly.Go.provideFunction_( + var functionName = Go.provideFunction_( 'text_random_letter', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + '($text) {', + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($text) {', ' return $text[rand(0, strlen($text) - 1)]', '}']); code = functionName + '(' + text + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; } throw Error('Unhandled option (text_charAt).'); }; -Blockly.Go['text_getSubstring'] = function(block) { +Go['text_getSubstring'] = function(block) { // Get substring. - var text = Blockly.Go.valueToCode(block, 'STRING', - Blockly.Go.ORDER_FUNCTION_CALL) || '\'\''; + var text = Go.valueToCode(block, 'STRING', + Go.ORDER_FUNCTION_CALL) || '\'\''; var where1 = block.getFieldValue('WHERE1'); var where2 = block.getFieldValue('WHERE2'); if (where1 == 'FIRST' && where2 == 'LAST') { var code = text; } else { - var at1 = Blockly.Go.getAdjusted(block, 'AT1'); - var at2 = Blockly.Go.getAdjusted(block, 'AT2'); - var functionName = Blockly.Go.provideFunction_( + var at1 = Go.getAdjusted(block, 'AT1'); + var at2 = Go.getAdjusted(block, 'AT2'); + var functionName = Go.provideFunction_( 'text_get_substring', - ['func ' + Blockly.Go.FUNCTION_NAME_PLACEHOLDER_ + + ['func ' + Go.FUNCTION_NAME_PLACEHOLDER_ + '($text, $where1, $at1, $where2, $at2) {', ' if ($where1 == \'FROM_END\') {', ' $at1 = strlen($text) - 1 - $at1', @@ -174,13 +175,13 @@ Blockly.Go['text_getSubstring'] = function(block) { var code = functionName + '(' + text + ', \'' + where1 + '\', ' + at1 + ', \'' + where2 + '\', ' + at2 + ')'; } - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_changeCase'] = function(block) { +Go['text_changeCase'] = function(block) { // Change capitalization. - var text = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_NONE) || '\'\''; + var text = Go.valueToCode(block, 'TEXT', + Go.ORDER_NONE) || '\'\''; if (block.getFieldValue('CASE') == 'UPPERCASE') { var code = 'strtoupper(' + text + ')'; } else if (block.getFieldValue('CASE') == 'LOWERCASE') { @@ -188,10 +189,10 @@ Blockly.Go['text_changeCase'] = function(block) { } else if (block.getFieldValue('CASE') == 'TITLECASE') { var code = 'ucwords(strtolower(' + text + '))'; } - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_trim'] = function(block) { +Go['text_trim'] = function(block) { // Trim spaces. var OPERATORS = { 'LEFT': 'ltrim', @@ -199,63 +200,63 @@ Blockly.Go['text_trim'] = function(block) { 'BOTH': 'trim' }; var operator = OPERATORS[block.getFieldValue('MODE')]; - var text = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_NONE) || '\'\''; - return [operator + '(' + text + ')', Blockly.Go.ORDER_FUNCTION_CALL]; + var text = Go.valueToCode(block, 'TEXT', + Go.ORDER_NONE) || '\'\''; + return [operator + '(' + text + ')', Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_print'] = function(block) { +Go['text_print'] = function(block) { // Print statement. - var msg = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_NONE) || '\'\''; + var msg = Go.valueToCode(block, 'TEXT', + Go.ORDER_NONE) || '\'\''; return 'println(' + msg + ')\n'; }; -Blockly.Go['text_prompt_ext'] = function(block) { +Go['text_prompt_ext'] = function(block) { // Prompt function. if (block.getField('TEXT')) { // Internal message. - var msg = Blockly.Go.quote_(block.getFieldValue('TEXT')); + var msg = Go.quote_(block.getFieldValue('TEXT')); } else { // External message. - var msg = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_NONE) || '\'\''; + var msg = Go.valueToCode(block, 'TEXT', + Go.ORDER_NONE) || '\'\''; } var code = 'readline(' + msg + ')'; var toNumber = block.getFieldValue('TYPE') == 'NUMBER'; if (toNumber) { code = 'floatval(' + code + ')'; } - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_prompt'] = Blockly.Go['text_prompt_ext']; +Go['text_prompt'] = Go['text_prompt_ext']; -Blockly.Go['text_count'] = function(block) { - var text = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_MEMBER) || '\'\''; - var sub = Blockly.Go.valueToCode(block, 'SUB', - Blockly.Go.ORDER_NONE) || '\'\''; +Go['text_count'] = function(block) { + var text = Go.valueToCode(block, 'TEXT', + Go.ORDER_MEMBER) || '\'\''; + var sub = Go.valueToCode(block, 'SUB', + Go.ORDER_NONE) || '\'\''; var code = 'strlen(' + sub + ') === 0' + ' ? strlen(' + text + ') + 1' + ' : substr_count(' + text + ', ' + sub + ')'; - return [code, Blockly.Go.ORDER_CONDITIONAL]; + return [code, Go.ORDER_CONDITIONAL]; }; -Blockly.Go['text_replace'] = function(block) { - var text = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_MEMBER) || '\'\''; - var from = Blockly.Go.valueToCode(block, 'FROM', - Blockly.Go.ORDER_NONE) || '\'\''; - var to = Blockly.Go.valueToCode(block, 'TO', - Blockly.Go.ORDER_NONE) || '\'\''; +Go['text_replace'] = function(block) { + var text = Go.valueToCode(block, 'TEXT', + Go.ORDER_MEMBER) || '\'\''; + var from = Go.valueToCode(block, 'FROM', + Go.ORDER_NONE) || '\'\''; + var to = Go.valueToCode(block, 'TO', + Go.ORDER_NONE) || '\'\''; var code = 'str_replace(' + from + ', ' + to + ', ' + text + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; -Blockly.Go['text_reverse'] = function(block) { - var text = Blockly.Go.valueToCode(block, 'TEXT', - Blockly.Go.ORDER_MEMBER) || '\'\''; +Go['text_reverse'] = function(block) { + var text = Go.valueToCode(block, 'TEXT', + Go.ORDER_MEMBER) || '\'\''; var code = 'strrev(' + text + ')'; - return [code, Blockly.Go.ORDER_FUNCTION_CALL]; + return [code, Go.ORDER_FUNCTION_CALL]; }; diff --git a/generators/go/variables.js b/generators/go/variables.js index 1cf2ffd0a1d..8c4ae135ccc 100644 --- a/generators/go/variables.js +++ b/generators/go/variables.js @@ -10,23 +10,23 @@ */ 'use strict'; -goog.provide('Blockly.Go.variables'); +goog.module('Blockly.Go.variables'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); -Blockly.Go['variables_get'] = function(block) { +Go['variables_get'] = function(block) { // Variable getter. - var code = Blockly.Go.variableDB_.getName(block.getFieldValue('VAR'), + var code = Go.variableDB_.getName(block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); - return [code, Blockly.Go.ORDER_ATOMIC]; + return [code, Go.ORDER_ATOMIC]; }; -Blockly.Go['variables_set'] = function(block) { +Go['variables_set'] = function(block) { // Variable setter. - var argument0 = Blockly.Go.valueToCode(block, 'VALUE', - Blockly.Go.ORDER_ASSIGNMENT) || '0'; - var varName = Blockly.Go.variableDB_.getName( + var argument0 = Go.valueToCode(block, 'VALUE', + Go.ORDER_ASSIGNMENT) || '0'; + var varName = Go.variableDB_.getName( block.getFieldValue('VAR'), Blockly.VARIABLE_CATEGORY_NAME); return varName + ' = ' + argument0 + '\n'; }; diff --git a/generators/go/variables_dynamic.js b/generators/go/variables_dynamic.js index ed5b604daf0..3251ccce049 100644 --- a/generators/go/variables_dynamic.js +++ b/generators/go/variables_dynamic.js @@ -10,12 +10,13 @@ */ 'use strict'; -goog.provide('Blockly.Go.variablesDynamic'); +goog.module('Blockly.Go.variablesDynamic'); -goog.require('Blockly.Go'); +const Go = goog.require('Blockly.Go'); +/** @suppress {extraRequire} */ goog.require('Blockly.Go.variables'); // Go is dynamically typed. -Blockly.Go['variables_get_dynamic'] = Blockly.Go['variables_get']; -Blockly.Go['variables_set_dynamic'] = Blockly.Go['variables_set']; +Go['variables_get_dynamic'] = Go['variables_get']; +Go['variables_set_dynamic'] = Go['variables_set']; diff --git a/tests/deps.js b/tests/deps.js index 9dad816c341..2294d4e4cbd 100644 --- a/tests/deps.js +++ b/tests/deps.js @@ -7,7 +7,7 @@ goog.addDependency('../../blocks/loops.js', ['Blockly.libraryBlocks.loops'], ['B goog.addDependency('../../blocks/math.js', ['Blockly.libraryBlocks.math'], ['Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldLabel', 'Blockly.FieldNumber', 'Blockly.FieldVariable', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../blocks/procedures.js', ['Blockly.libraryBlocks.procedures'], ['Blockly.Comment', 'Blockly.ContextMenu', 'Blockly.Events', 'Blockly.FieldCheckbox', 'Blockly.FieldLabel', 'Blockly.FieldTextInput', 'Blockly.Input', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.Names', 'Blockly.Procedures', 'Blockly.Variables', 'Blockly.Warning', 'Blockly.Xml', 'Blockly.common', 'Blockly.config', 'Blockly.utils.xml'], {'lang': 'es9', 'module': 'goog'}); goog.addDependency('../../blocks/text.js', ['Blockly.libraryBlocks.texts'], ['Blockly.ConnectionType', 'Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldImage', 'Blockly.FieldMultilineInput', 'Blockly.FieldTextInput', 'Blockly.FieldVariable', 'Blockly.Input', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es9', 'module': 'goog'}); -goog.addDependency('../../blocks/tinygo.js', ['Blockly.TinyGo'], ['Blockly.Types'], {'lang': 'es6'}); +goog.addDependency('../../blocks/tinygo.js', ['Blockly.TinyGo'], ['Blockly.Types', 'Blockly.common'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../blocks/variables.js', ['Blockly.libraryBlocks.variables'], ['Blockly.ContextMenu', 'Blockly.Extensions', 'Blockly.FieldLabel', 'Blockly.FieldVariable', 'Blockly.Msg', 'Blockly.Variables', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../blocks/variables_dynamic.js', ['Blockly.libraryBlocks.variablesDynamic'], ['Blockly.ContextMenu', 'Blockly.Extensions', 'Blockly.FieldLabel', 'Blockly.FieldVariable', 'Blockly.Msg', 'Blockly.Variables', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/block.js', ['Blockly.Block'], ['Blockly.ASTNode', 'Blockly.Connection', 'Blockly.ConnectionType', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Events.utils', 'Blockly.Extensions', 'Blockly.IASTNodeLocation', 'Blockly.IDeletable', 'Blockly.Input', 'Blockly.Tooltip', 'Blockly.blocks', 'Blockly.common', 'Blockly.constants', 'Blockly.fieldRegistry', 'Blockly.inputTypes', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.array', 'Blockly.utils.idGenerator', 'Blockly.utils.object', 'Blockly.utils.parsing'], {'lang': 'es6', 'module': 'goog'}); @@ -283,18 +283,18 @@ goog.addDependency('../../generators/dart/procedures.js', ['Blockly.Dart.procedu goog.addDependency('../../generators/dart/text.js', ['Blockly.Dart.texts'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../generators/dart/variables.js', ['Blockly.Dart.variables'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../generators/dart/variables_dynamic.js', ['Blockly.Dart.variablesDynamic'], ['Blockly.Dart', 'Blockly.Dart.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/go.js', ['Blockly.Go'], ['Blockly.Generator', 'Blockly.TinyGo', 'Blockly.Types', 'Blockly.utils.string', 'GoFmtServer'], {'lang': 'es6'}); -goog.addDependency('../../generators/go/all.js', ['Blockly.Go.all'], ['Blockly.Go.colour', 'Blockly.Go.lists', 'Blockly.Go.logic', 'Blockly.Go.loops', 'Blockly.Go.math', 'Blockly.Go.procedures', 'Blockly.Go.texts', 'Blockly.Go.variables', 'Blockly.Go.variablesDynamic'], {'module': 'goog'}); -goog.addDependency('../../generators/go/colour.js', ['Blockly.Go.colour'], ['Blockly.Go']); +goog.addDependency('../../generators/go.js', ['Blockly.Go'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.Types', 'Blockly.utils.string', 'GoFmtServer'], {'lang': 'es6'}); +goog.addDependency('../../generators/go/all.js', ['Blockly.Go.all'], ['Blockly.Go.colour', 'Blockly.Go.lists', 'Blockly.Go.logic', 'Blockly.Go.loops', 'Blockly.Go.math', 'Blockly.Go.procedures', 'Blockly.Go.texts', 'Blockly.Go.variables', 'Blockly.Go.variablesDynamic', 'Blockly.TinyGo'], {'module': 'goog'}); +goog.addDependency('../../generators/go/colour.js', ['Blockly.Go.colour'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../generators/go/gofmt_server.js', ['GoFmtServer'], []); -goog.addDependency('../../generators/go/lists.js', ['Blockly.Go.lists'], []); -goog.addDependency('../../generators/go/logic.js', ['Blockly.Go.logic'], ['Blockly.Go']); -goog.addDependency('../../generators/go/loops.js', ['Blockly.Go.loops'], ['Blockly.Go']); -goog.addDependency('../../generators/go/math.js', ['Blockly.Go.math'], ['Blockly.Go']); -goog.addDependency('../../generators/go/procedures.js', ['Blockly.Go.procedures'], ['Blockly.Go']); -goog.addDependency('../../generators/go/text.js', ['Blockly.Go.texts'], ['Blockly.Go']); -goog.addDependency('../../generators/go/variables.js', ['Blockly.Go.variables'], ['Blockly.Go']); -goog.addDependency('../../generators/go/variables_dynamic.js', ['Blockly.Go.variablesDynamic'], ['Blockly.Go', 'Blockly.Go.variables']); +goog.addDependency('../../generators/go/lists.js', ['Blockly.Go.lists'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/logic.js', ['Blockly.Go.logic'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/loops.js', ['Blockly.Go.loops'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/math.js', ['Blockly.Go.math'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/procedures.js', ['Blockly.Go.procedures'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/text.js', ['Blockly.Go.texts'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/variables.js', ['Blockly.Go.variables'], ['Blockly.Go'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../generators/go/variables_dynamic.js', ['Blockly.Go.variablesDynamic'], ['Blockly.Go', 'Blockly.Go.variables'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../generators/javascript.js', ['Blockly.JavaScript'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.Variables', 'Blockly.inputTypes', 'Blockly.utils.global', 'Blockly.utils.object', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../generators/javascript/all.js', ['Blockly.JavaScript.all'], ['Blockly.JavaScript.colour', 'Blockly.JavaScript.lists', 'Blockly.JavaScript.logic', 'Blockly.JavaScript.loops', 'Blockly.JavaScript.math', 'Blockly.JavaScript.procedures', 'Blockly.JavaScript.texts', 'Blockly.JavaScript.variables', 'Blockly.JavaScript.variablesDynamic'], {'module': 'goog'}); goog.addDependency('../../generators/javascript/colour.js', ['Blockly.JavaScript.colour'], ['Blockly.JavaScript'], {'lang': 'es6', 'module': 'goog'}); diff --git a/tests/playgrounds/prepare.js b/tests/playgrounds/prepare.js index 4c610e07497..8f53a3d797c 100644 --- a/tests/playgrounds/prepare.js +++ b/tests/playgrounds/prepare.js @@ -56,12 +56,7 @@ [ 'Blockly', 'Blockly.libraryBlocks', - 'Blockly.Dart.all', - 'Blockly.JavaScript.all', - 'Blockly.Lua.all', 'Blockly.Go.all', - 'Blockly.PHP.all', - 'Blockly.Python.all', ], resolve); }).then(() => { // Copy Messages from temporary Blockly.Msg object to the real one: @@ -80,11 +75,6 @@ 'blockly_compressed.js', 'msg/messages.js', 'blocks_compressed.js', - 'dart_compressed.js', - 'javascript_compressed.js', - 'lua_compressed.js', - 'php_compressed.js', - 'python_compressed.js', 'go_compressed.js', ]; diff --git a/tests/tiny_playground.html b/tests/tiny_playground.html index b8281d5e462..824ecb9046f 100644 --- a/tests/tiny_playground.html +++ b/tests/tiny_playground.html @@ -1,791 +1,847 @@ - -Blockly Playground - - - - - - + + + - - + + // Disable the "Load" button if the save state is invalid. + // Preserve text between page reloads. + function taChange() { + var textarea = document.getElementById('importExport'); + if (sessionStorage) { + sessionStorage.setItem('textarea', textarea.value); + } + var valid = saveIsValid(textarea.value); + document.getElementById('import').disabled = !valid.json && !valid.xml; + } + + function saveIsValid(save) { + var validJson = true; + try { + JSON.parse(save); + } catch (e) { + validJson = false; + } + var validXml = true + try { + Blockly.Xml.textToDom(save); + } catch (e) { + validXml = false; + } + return { + json: validJson, + xml: validXml + } + } + + function logEvents(state) { + var checkbox = document.getElementById('logCheck'); + checkbox.checked = state; + if (sessionStorage) { + sessionStorage.setItem('logEvents', Number(state)); + } + if (state) { + workspace.addChangeListener(logger); + } else { + workspace.removeChangeListener(logger); + } + } + + function logFlyoutEvents(state) { + var checkbox = document.getElementById('logFlyoutCheck'); + checkbox.checked = state; + if (sessionStorage) { + sessionStorage.setItem('logFlyoutEvents', Number(state)); + } + var flyoutWorkspace = workspace.getFlyout().getWorkspace(); + if (state) { + flyoutWorkspace.addChangeListener(logger); + } else { + flyoutWorkspace.removeChangeListener(logger); + } + } + + function configureContextMenu(menuOptions, e) { + var screenshotOption = { + text: 'Download Screenshot', + enabled: workspace.getTopBlocks().length, + callback: function () { + downloadScreenshot(workspace); + } + }; + menuOptions.push(screenshotOption); + + // Adds a default-sized workspace comment to the workspace. + menuOptions.push(Blockly.ContextMenu.workspaceCommentOption(workspace, e)); + } + + function logger(e) { + console.log(e); + } + + function demo1() { + let xml = '\n' + + ' \n' + + ' myNumberVariable\n' + + ' myTextVariable\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' Another line\n' + + ' \n' + + ' \n' + + ' some text\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' myFunction\n' + + ' Describe this function...\n' + + ' \n' + + ' \n' + + ' myNumberVariable\n' + + ' \n' + + ' \n' + + ' 123\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' myTextVariable\n' + + ' \n' + + ' \n' + + ' ABC\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' 13\n' + + ' \n' + + ' \n' + + ' FALSE\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' 10\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' abc\n' + + ' \n' + + ' \n' + + ' myTextVariable\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' WHILE\n' + + ' \n' + + ' \n' + + ' TRUE\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' myNumberVariable\n' + + ' \n' + + ' \n' + + ' 1\n' + + ' \n' + + ' \n' + + ' 2\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' abc\n' + + ' \n' + + ' \n' + + ' myNumberVariable\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' GTE\n' + + ' \n' + + ' \n' + + ' myNumberVariable\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' 130\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' BREAK\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' 13\n' + + ' \n' + + ' \n' + + ' TRUE\n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ' \n' + + ''; + var dom = Blockly.Xml.textToDom(xml); + Blockly.Xml.domToWorkspace(dom, workspace); + } + + function demo2() { + let xml = '\n' + + ' \n' + + ' fdggh\n' + + ' \n' + + ' \n' + + ' fdggh\n' + + ' \n' + + ' \n' + + ' gdfg\n' + + ' \n' + + ' \n' + + ' \n' + + ''; + var dom = Blockly.Xml.textToDom(xml); + Blockly.Xml.domToWorkspace(dom, workspace); + } + + // Call start(). Because this + + -
+
-

Blockly Playground

+

Blockly Playground

-

+



-

+

-

+

Stress test:   - - - -

- + + + + + + + + + + + + + + + + + + + +