mirror of
https://github.com/google/blockly.git
synced 2026-01-06 00:20:37 +01:00
There are only 10 instances of ++x in our codebase, compared with over 500 instances of x++. The stlye guide has no opinion on which to use, nor do I. But the lack of consistency was making regex searches for bugs more difficult.
129 lines
4.4 KiB
JavaScript
129 lines
4.4 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright 2012 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @fileoverview Generating JavaScript for logic blocks.
|
|
*/
|
|
'use strict';
|
|
|
|
goog.provide('Blockly.JavaScript.logic');
|
|
|
|
goog.require('Blockly.JavaScript');
|
|
|
|
|
|
Blockly.JavaScript['controls_if'] = function(block) {
|
|
// If/elseif/else condition.
|
|
var n = 0;
|
|
var code = '', branchCode, conditionCode;
|
|
if (Blockly.JavaScript.STATEMENT_PREFIX) {
|
|
// Automatic prefix insertion is switched off for this block. Add manually.
|
|
code += Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_PREFIX,
|
|
block);
|
|
}
|
|
do {
|
|
conditionCode = Blockly.JavaScript.valueToCode(block, 'IF' + n,
|
|
Blockly.JavaScript.ORDER_NONE) || 'false';
|
|
branchCode = Blockly.JavaScript.statementToCode(block, 'DO' + n);
|
|
if (Blockly.JavaScript.STATEMENT_SUFFIX) {
|
|
branchCode = Blockly.JavaScript.prefixLines(
|
|
Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
|
|
block), Blockly.JavaScript.INDENT) + branchCode;
|
|
}
|
|
code += (n > 0 ? ' else ' : '') +
|
|
'if (' + conditionCode + ') {\n' + branchCode + '}';
|
|
n++;
|
|
} while (block.getInput('IF' + n));
|
|
|
|
if (block.getInput('ELSE') || Blockly.JavaScript.STATEMENT_SUFFIX) {
|
|
branchCode = Blockly.JavaScript.statementToCode(block, 'ELSE');
|
|
if (Blockly.JavaScript.STATEMENT_SUFFIX) {
|
|
branchCode = Blockly.JavaScript.prefixLines(
|
|
Blockly.JavaScript.injectId(Blockly.JavaScript.STATEMENT_SUFFIX,
|
|
block), Blockly.JavaScript.INDENT) + branchCode;
|
|
}
|
|
code += ' else {\n' + branchCode + '}';
|
|
}
|
|
return code + '\n';
|
|
};
|
|
|
|
Blockly.JavaScript['controls_ifelse'] = Blockly.JavaScript['controls_if'];
|
|
|
|
Blockly.JavaScript['logic_compare'] = function(block) {
|
|
// Comparison operator.
|
|
var OPERATORS = {
|
|
'EQ': '==',
|
|
'NEQ': '!=',
|
|
'LT': '<',
|
|
'LTE': '<=',
|
|
'GT': '>',
|
|
'GTE': '>='
|
|
};
|
|
var operator = OPERATORS[block.getFieldValue('OP')];
|
|
var order = (operator === '==' || operator === '!=') ?
|
|
Blockly.JavaScript.ORDER_EQUALITY : Blockly.JavaScript.ORDER_RELATIONAL;
|
|
var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order) || '0';
|
|
var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order) || '0';
|
|
var code = argument0 + ' ' + operator + ' ' + argument1;
|
|
return [code, order];
|
|
};
|
|
|
|
Blockly.JavaScript['logic_operation'] = function(block) {
|
|
// Operations 'and', 'or'.
|
|
var operator = (block.getFieldValue('OP') === 'AND') ? '&&' : '||';
|
|
var order = (operator === '&&') ? Blockly.JavaScript.ORDER_LOGICAL_AND :
|
|
Blockly.JavaScript.ORDER_LOGICAL_OR;
|
|
var argument0 = Blockly.JavaScript.valueToCode(block, 'A', order);
|
|
var argument1 = Blockly.JavaScript.valueToCode(block, 'B', order);
|
|
if (!argument0 && !argument1) {
|
|
// If there are no arguments, then the return value is false.
|
|
argument0 = 'false';
|
|
argument1 = 'false';
|
|
} else {
|
|
// Single missing arguments have no effect on the return value.
|
|
var defaultArgument = (operator === '&&') ? 'true' : 'false';
|
|
if (!argument0) {
|
|
argument0 = defaultArgument;
|
|
}
|
|
if (!argument1) {
|
|
argument1 = defaultArgument;
|
|
}
|
|
}
|
|
var code = argument0 + ' ' + operator + ' ' + argument1;
|
|
return [code, order];
|
|
};
|
|
|
|
Blockly.JavaScript['logic_negate'] = function(block) {
|
|
// Negation.
|
|
var order = Blockly.JavaScript.ORDER_LOGICAL_NOT;
|
|
var argument0 = Blockly.JavaScript.valueToCode(block, 'BOOL', order) ||
|
|
'true';
|
|
var code = '!' + argument0;
|
|
return [code, order];
|
|
};
|
|
|
|
Blockly.JavaScript['logic_boolean'] = function(block) {
|
|
// Boolean values true and false.
|
|
var code = (block.getFieldValue('BOOL') === 'TRUE') ? 'true' : 'false';
|
|
return [code, Blockly.JavaScript.ORDER_ATOMIC];
|
|
};
|
|
|
|
Blockly.JavaScript['logic_null'] = function(block) {
|
|
// Null data type.
|
|
return ['null', Blockly.JavaScript.ORDER_ATOMIC];
|
|
};
|
|
|
|
Blockly.JavaScript['logic_ternary'] = function(block) {
|
|
// Ternary operator.
|
|
var value_if = Blockly.JavaScript.valueToCode(block, 'IF',
|
|
Blockly.JavaScript.ORDER_CONDITIONAL) || 'false';
|
|
var value_then = Blockly.JavaScript.valueToCode(block, 'THEN',
|
|
Blockly.JavaScript.ORDER_CONDITIONAL) || 'null';
|
|
var value_else = Blockly.JavaScript.valueToCode(block, 'ELSE',
|
|
Blockly.JavaScript.ORDER_CONDITIONAL) || 'null';
|
|
var code = value_if + ' ? ' + value_then + ' : ' + value_else;
|
|
return [code, Blockly.JavaScript.ORDER_CONDITIONAL];
|
|
};
|