Blockly.PHP[''] = function()

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).');
};