in generators/php/lists.js [247:345]
Blockly.PHP['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.PHP.valueToCode(block, 'TO',
Blockly.PHP.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.PHP.nameDB_.getDistinctName(
'tmp_list', Blockly.VARIABLE_CATEGORY_NAME);
var code = listVar + ' = &' + list + ';\n';
list = listVar;
return code;
}
switch (where) {
case 'FIRST':
if (mode == 'SET') {
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_MEMBER) || 'array()';
return list + '[0] = ' + value + ';\n';
} else if (mode == 'INSERT') {
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || 'array()';
return 'array_unshift(' + list + ', ' + value + ');\n';
}
break;
case 'LAST':
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || 'array()';
if (mode == 'SET') {
var functionName = Blockly.PHP.provideFunction_(
'lists_set_last_item',
['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'(&$list, $value) {',
' $list[count($list) - 1] = $value;',
'}']);
return functionName + '(' + list + ', ' + value + ');\n';
} else if (mode == 'INSERT') {
return 'array_push(' + list + ', ' + value + ');\n';
}
break;
case 'FROM_START':
var at = Blockly.PHP.getAdjusted(block, 'AT');
if (mode == 'SET') {
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_MEMBER) || 'array()';
return list + '[' + at + '] = ' + value + ';\n';
} else if (mode == 'INSERT') {
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || 'array()';
return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\n';
}
break;
case 'FROM_END':
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_NONE) || 'array()';
var at = Blockly.PHP.getAdjusted(block, 'AT', 1);
if (mode == 'SET') {
var functionName = Blockly.PHP.provideFunction_(
'lists_set_from_end',
['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'(&$list, $at, $value) {',
' $list[count($list) - $at] = $value;',
'}']);
return functionName + '(' + list + ', ' + at + ', ' + value + ');\n';
} else if (mode == 'INSERT') {
var functionName = Blockly.PHP.provideFunction_(
'lists_insert_from_end',
['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ +
'(&$list, $at, $value) {',
' return array_splice($list, count($list) - $at, 0, $value);',
'}']);
return functionName + '(' + list + ', ' + at + ', ' + value + ');\n';
}
break;
case 'RANDOM':
var list = Blockly.PHP.valueToCode(block, 'LIST',
Blockly.PHP.ORDER_REFERENCE) || 'array()';
var code = cacheList();
var xVar = Blockly.PHP.nameDB_.getDistinctName(
'tmp_x', Blockly.VARIABLE_CATEGORY_NAME);
code += xVar + ' = rand(0, count(' + list + ')-1);\n';
if (mode == 'SET') {
code += list + '[' + xVar + '] = ' + value + ';\n';
return code;
} else if (mode == 'INSERT') {
code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value +
');\n';
return code;
}
break;
}
throw Error('Unhandled combination (lists_setIndex).');
};