<?php

/**
 * Expression
 *
 * @package Less
 * @subpackage tree
 */
class Less_Tree_Expression extends Less_Tree {

	public $value = array();
	public $parens = false;
	public $parensInOp = false;
	public $type = 'Expression';

	public function __construct( $value, $parens = null ) {
		$this->value = $value;
		$this->parens = $parens;
	}

	public function accept( $visitor ) {
		$this->value = $visitor->visitArray( $this->value );
	}

	public function compile( $env ) {
		$doubleParen = false;

		if ( $this->parens && !$this->parensInOp ) {
			Less_Environment::$parensStack++;
		}

		$returnValue = null;
		if ( $this->value ) {

			$count = count( $this->value );

			if ( $count > 1 ) {

				$ret = array();
				foreach ( $this->value as $e ) {
					$ret[] = $e->compile( $env );
				}
				$returnValue = new Less_Tree_Expression( $ret );

			} else {

				if ( ( $this->value[0] instanceof Less_Tree_Expression ) && $this->value[0]->parens && !$this->value[0]->parensInOp ) {
					$doubleParen = true;
				}

				$returnValue = $this->value[0]->compile( $env );
			}

		} else {
			$returnValue = $this;
		}

		if ( $this->parens ) {
			if ( !$this->parensInOp ) {
				Less_Environment::$parensStack--;

			} elseif ( !Less_Environment::isMathOn() && !$doubleParen ) {
				$returnValue = new Less_Tree_Paren( $returnValue );

			}
		}
		return $returnValue;
	}

	/**
	 * @see Less_Tree::genCSS
	 */
	public function genCSS( $output ) {
		$val_len = count( $this->value );
		for ( $i = 0; $i < $val_len; $i++ ) {
			$this->value[$i]->genCSS( $output );
			if ( $i + 1 < $val_len ) {
				$output->add( ' ' );
			}
		}
	}

	public function throwAwayComments() {
		if ( is_array( $this->value ) ) {
			$new_value = array();
			foreach ( $this->value as $v ) {
				if ( $v instanceof Less_Tree_Comment ) {
					continue;
				}
				$new_value[] = $v;
			}
			$this->value = $new_value;
		}
	}
}
