*/ private string $enumName ) {} public function traverse(TokenStream $stream): Type { return $this->findPatternEnumType($stream) ?? EnumType::native($this->enumName); } private function findPatternEnumType(TokenStream $stream): ?Type { if ($stream->done() || ! $stream->next() instanceof DoubleColonToken) { return null; } $stream->forward(); if ($stream->done()) { throw new MissingEnumCase($this->enumName); } $symbol = $stream->forward()->symbol(); if ($symbol === '*') { throw new MissingSpecificEnumCase($this->enumName); } return EnumType::fromPattern($this->enumName, $symbol); } public function symbol(): string { return $this->enumName; } }