/**
  * @param array $tokens
  * @param integer $index
  * @param array $token
  */
 private function extractTypehints(&$tokens, $index, $token)
 {
     $typehint = '';
     for ($i = $index - 1; in_array($tokens[$i][0], $this->typehintTokens); $i--) {
         $typehint = $tokens[$i][1] . $typehint;
         unset($tokens[$i]);
     }
     if ($typehint = trim($typehint)) {
         $class = $this->namespaceResolver->resolve($this->currentClass);
         try {
             $typehintFcqn = $this->namespaceResolver->resolve($typehint);
             $this->typeHintIndex->add($class, trim($this->currentFunction), $token[1], $typehintFcqn);
         } catch (DisallowedScalarTypehintException $e) {
             $this->typeHintIndex->addInvalid($class, trim($this->currentFunction), $token[1], $e);
         }
     }
 }
 function it_delegates_resolution_to_wrapped_resolver(NamespaceResolver $namespaceResolver)
 {
     $namespaceResolver->resolve('Bar')->willReturn('Foo\\Bar');
     $this->resolve('Bar')->shouldReturn('Foo\\Bar');
 }
    function it_indexes_invalid_typehints(TypeHintIndex $typeHintIndex, NamespaceResolver $namespaceResolver)
    {
        $e = new DisallowedScalarTypehintException();
        $namespaceResolver->analyse(Argument::any())->shouldBeCalled();
        $namespaceResolver->resolve('Foo')->willReturn('Foo');
        $namespaceResolver->resolve('int')->willThrow($e);
        $this->rewrite('
        <?php

        class Foo
        {
            public function bar(int $bar)
            {
            }
        }

        ');
        $typeHintIndex->addInvalid('Foo', 'bar', '$bar', $e)->shouldHaveBeenCalled();
        $typeHintIndex->add('Foo', 'bar', '$bar', Argument::any())->shouldNotHaveBeenCalled();
    }