original_string: public function add(
          $id,
          $parentId,
          $blockType,
          array $options = [],
          $siblingId = null,
          $prepend = null
      ) {
          $this->validateId($id, true);
          if (isset($this->items[$id])) {
              throw new Exception\ItemAlreadyExistsException(
                  sprintf(
                      'The "%s" item already exists.'
                      . ' Remove existing item before add the new item with the same id.',
                      $id
                  )
              );
          }
          if (!$parentId && !$this->hierarchy->isEmpty()) {
              throw new Exception\LogicException(
                  sprintf(
                      'The "%s" item cannot be the root item'
                      . ' because another root item ("%s") already exists.',
                      $id,
                      $this->hierarchy->getRootId()
                  )
              );
          }
          if ($parentId) {
              $parentId = $this->validateAndResolveId($parentId);
          }
          if ($siblingId) {
              $siblingId = $this->resolveId($siblingId);
              if (!isset($this->items[$siblingId])) {
                  throw new Exception\ItemNotFoundException(sprintf('The "%s" sibling item does not exist.', $siblingId));
              }
              if ($parentId && $siblingId === $parentId) {
                  throw new Exception\LogicException('The sibling item cannot be the same as the parent item.');
              }
          }
  
          $path = $parentId
              ? $this->getProperty($parentId, self::PATH, true)
              : [];
          $this->hierarchy->add($path, $id, $siblingId, $prepend);
          $path[]           = $id;
          $this->items[$id] = [
              self::PATH       => $path,
              self::BLOCK_TYPE => $blockType,
              self::OPTIONS    => $options
          ];
      }
code: public function add(
          $id,
          $parentId,
          $blockType,
          array $options = [],
          $siblingId = null,
          $prepend = null
      ) {
          $this->validateId($id, true);
          if (isset($this->items[$id])) {
              throw new Exception\ItemAlreadyExistsException(
                  sprintf(
                      'The "%s" item already exists.'
                      . ' Remove existing item before add the new item with the same id.',
                      $id
                  )
              );
          }
          if (!$parentId && !$this->hierarchy->isEmpty()) {
              throw new Exception\LogicException(
                  sprintf(
                      'The "%s" item cannot be the root item'
                      . ' because another root item ("%s") already exists.',
                      $id,
                      $this->hierarchy->getRootId()
                  )
              );
          }
          if ($parentId) {
              $parentId = $this->validateAndResolveId($parentId);
          }
          if ($siblingId) {
              $siblingId = $this->resolveId($siblingId);
              if (!isset($this->items[$siblingId])) {
                  throw new Exception\ItemNotFoundException(sprintf('The "%s" sibling item does not exist.', $siblingId));
              }
              if ($parentId && $siblingId === $parentId) {
                  throw new Exception\LogicException('The sibling item cannot be the same as the parent item.');
              }
          }
  
          $path = $parentId
              ? $this->getProperty($parentId, self::PATH, true)
              : [];
          $this->hierarchy->add($path, $id, $siblingId, $prepend);
          $path[]           = $id;
          $this->items[$id] = [
              self::PATH       => $path,
              self::BLOCK_TYPE => $blockType,
              self::OPTIONS    => $options
          ];
      }
code_tokens: public function add ( $ id , $ parentId , $ blockType , array $ options = [ ] , $ siblingId = null , $ prepend = null ) { $ this -> validateId ( $ id , true ) ; if ( isset ( $ this -> items [ $ id ] ) ) { throw new Exception \ ItemAlreadyExistsException ( sprintf ( 'The "%s" item already exists.' . ' Remove existing item before add the new item with the same id.' , $ id ) ) ; } if ( ! $ parentId && ! $ this -> hierarchy -> isEmpty ( ) ) { throw new Exception \ LogicException ( sprintf ( 'The "%s" item cannot be the root item' . ' because another root item ("%s") already exists.' , $ id , $ this -> hierarchy -> getRootId ( ) ) ) ; } if ( $ parentId ) { $ parentId = $ this -> validateAndResolveId ( $ parentId ) ; } if ( $ siblingId ) { $ siblingId = $ this -> resolveId ( $ siblingId ) ; if ( ! isset ( $ this -> items [ $ siblingId ] ) ) { throw new Exception \ ItemNotFoundException ( sprintf ( 'The "%s" sibling item does not exist.' , $ siblingId ) ) ; } if ( $ parentId && $ siblingId === $ parentId ) { throw new Exception \ LogicException ( 'The sibling item cannot be the same as the parent item.' ) ; } } $ path = $ parentId ? $ this -> getProperty ( $ parentId , self :: PATH , true ) : [ ] ; $ this -> hierarchy -> add ( $ path , $ id , $ siblingId , $ prepend ) ; $ path [ ] = $ id ; $ this -> items [ $ id ] = [ self :: PATH => $ path , self :: BLOCK_TYPE => $ blockType , self :: OPTIONS => $ options ] ; }
docstring: Adds a new item to the layout
  
  @param string      $id        The layout item id
  @param string      $parentId  The id or alias of parent item. Set null to add the root item
  @param mixed       $blockType The block type associated with the layout item
  @param array       $options   The layout item options
  @param string|null $siblingId The id or alias of an item which should be nearest neighbor
  @param bool        $prepend   Determines whether the moving item should be located before or after
  the specified sibling item
  
  @throws Exception\InvalidArgumentException if the id or parent id are empty or invalid
  @throws Exception\ItemAlreadyExistsException if the layout item with the same id already exists
  @throws Exception\ItemNotFoundException if the parent layout item does not exist
  @throws Exception\LogicException if the layout item cannot be added by other reasons
  
  @SuppressWarnings(PHPMD.NPathComplexity)
docstring_tokens: Adds a new item to the layout