1: <?php declare(strict_types = 1);
2:
3: namespace PHPStan\PhpDoc;
4:
5: use PHPStan\Analyser\NameScope;
6: use PHPStan\DependencyInjection\AutowiredService;
7: use PHPStan\PhpDocParser\Lexer\Lexer;
8: use PHPStan\PhpDocParser\Parser\TokenIterator;
9: use PHPStan\PhpDocParser\Parser\TypeParser;
10: use PHPStan\Type\Type;
11:
12: #[AutowiredService]
13: final class TypeStringResolver
14: {
15:
16: public function __construct(private Lexer $typeLexer, private TypeParser $typeParser, private TypeNodeResolver $typeNodeResolver)
17: {
18: }
19:
20: /** @api */
21: public function resolve(string $typeString, ?NameScope $nameScope = null): Type
22: {
23: $tokens = new TokenIterator($this->typeLexer->tokenize($typeString));
24: $typeNode = $this->typeParser->parse($tokens);
25: $tokens->consumeTokenType(Lexer::TOKEN_END); // @phpstan-ignore missingType.checkedException
26:
27: return $this->typeNodeResolver->resolve($typeNode, $nameScope ?? new NameScope(null, []));
28: }
29:
30: }
31: