/**
  *
  * @param array $stackFrame
  * @return TokenStream
  */
 public function parseStackFrame(array $stackFrame, VarParser $varParser)
 {
     $builder = new TokenStreamBuilder();
     if (isset($stackFrame['class'])) {
         $reflect = new \ReflectionClass($stackFrame['class']);
         $builder->addKeyword($reflect->getShortName(), $stackFrame['class'])->addPunctuation($stackFrame['type']);
     }
     if (isset($stackFrame['function'])) {
         $args = array();
         foreach ($stackFrame['args'] as $arg) {
             $args[] = $varParser->parse($arg, -1);
         }
         $builder->addKeyword($stackFrame['function'])->addBrace('(');
         if (count($args)) {
             $builder->addStream(array_shift($args));
             while (count($args)) {
                 $builder->addPunctuation(',')->addWhitespece()->addStream(array_shift($args));
             }
         }
         $builder->addBrace(')');
     }
     if (isset($stackFrame['file'])) {
         if (isset($stackFrame['class']) or isset($stackFrame['function'])) {
             $builder->addWhitespece()->addPlainText('in')->addWhitespece();
         }
         $builder->addKeyword(basename($stackFrame['file']), $stackFrame['file']);
         if (isset($stackFrame['line'])) {
             $builder->addWhitespece()->addPlainText('line')->addWhitespece()->addKeyword($stackFrame['line']);
         }
     }
     return $builder->getStream();
 }
 /**
  *
  * @param mixed $var
  * @param integer $deep
  * @param VarParser $parser
  * @return TokenStream
  */
 public function tokenize($var, $deep, VarParser $parser)
 {
     $builder = new TokenStreamBuilder();
     if ($var == '' or $deep >= $this->maxDeep) {
         $builder->addString('"' . $var . '"');
         return $builder->getStream();
     }
     $lines = $lines = array_map('trim', explode("\n", $var));
     $firstLine = array_shift($lines);
     if ($this->maxLen and strlen($firstLine) > $this->maxLen) {
         $firstLine = substr($firstLine, 0, $this->maxLen) . '…';
     }
     $builder->addString('"' . $firstLine . '"', implode("\n", $lines));
     return $builder->getStream();
 }
 protected function tokenizeProps(TokenStreamBuilder $builder, $var, $props, $deep, VarParser $parser)
 {
     $keyLen = array_reduce($props, function ($maxLen, $prop) {
         $len = strlen($prop->getName());
         return $len > $maxLen ? $len : $maxLen;
     });
     $builder->addNewLine();
     foreach ($props as $prop) {
         $propName = $prop->getName();
         $propValue = $prop->getValue($var);
         $modifiers = $this->getPropModifiers($prop);
         $diff = $keyLen - strlen($propName . '');
         $builder->addIndention()->addType(implode('', $modifiers))->addWhitespece()->addBrace('[')->addString('"' . $propName . '"')->addBrace(']')->addWhitespece($diff + 1)->addPunctuation('=>')->addWhitespece();
         $stream = $parser->parse($propValue, $deep - 1);
         $builder->addStream($stream);
         $builder->addNewLine();
     }
 }
 protected function tokenizeItems(TokenStreamBuilder $builder, $var, $deep, VarParser $parser)
 {
     $keyLen = array_reduce(array_keys($var), function ($maxLen, $key) {
         $len = strlen($key . '') + (is_string($key) ? 2 : 0);
         return $len > $maxLen ? $len : $maxLen;
     });
     $builder->addWhitespece()->addBrace('{')->addNewLine();
     foreach ($var as $key => $value) {
         $builder->addIndention();
         //            $builder->addBrace('[');
         if (is_string($key)) {
             $builder->addString('"' . $key . '"');
         } else {
             $builder->addNumber($key);
         }
         //            $builder->addBrace(']');
         $diff = $keyLen - strlen($key . '') - (is_string($key) ? 2 : 0);
         $builder->addWhitespece($diff + 1)->addPunctuation('=>')->addWhitespece();
         $stream = $parser->parse($value, $deep - 1);
         $builder->addStream($stream);
         $builder->addNewLine();
     }
     $builder->addBrace('}');
 }
 /**
  *
  * @param mixed $var
  * @param integer $deep
  * @param VarParser $parser
  * @return TokenStream
  */
 public function tokenize($var, $deep, VarParser $parser)
 {
     $builder = new TokenStreamBuilder();
     switch (gettype($var)) {
         case 'object':
             if ($deep >= 0) {
                 $builder->addKeyword(get_class($var))->addWhitespece()->addBrace('{}');
             } else {
                 $reflect = new \ReflectionClass($var);
                 $builder->addKeyword($reflect->getShortName())->addWhitespece()->addBrace('{}');
             }
             break;
         case 'array':
             $builder->addType('array')->addBrace('(')->addNumber(count($var))->addBrace(')')->addWhitespece()->addBrace('{');
             if (count($var)) {
                 $builder->addKeyword('…');
             }
             $builder->addBrace('{}');
             break;
         case 'NULL':
             $builder->addKeyword('null');
             break;
         case 'boolean':
             $builder->addKeyword($var ? 'true' : 'false');
             break;
         case 'integer':
         case 'double':
             $builder->addNumber($var);
             break;
         case 'string':
             $builder->addString('"' . $var . '"');
             break;
     }
     return $builder->getStream();
 }