diff --git a/src/Psalm/Internal/Analyzer/CommentAnalyzer.php b/src/Psalm/Internal/Analyzer/CommentAnalyzer.php index a249971508f..24ceee83bb5 100644 --- a/src/Psalm/Internal/Analyzer/CommentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/CommentAnalyzer.php @@ -12,6 +12,7 @@ use Psalm\Internal\Scanner\FunctionDocblockComment; use Psalm\Internal\Scanner\VarDocblockComment; use Psalm\Internal\Type\ParseTree; +use Psalm\Internal\Type\TypeAlias; use Psalm\Internal\Type\TypeParser; use Psalm\Internal\Type\TypeTokenizer; use Psalm\Type; @@ -46,7 +47,7 @@ class CommentAnalyzer /** * @param array>|null $template_type_map - * @param array> $type_aliases + * @param array $type_aliases * * @throws DocblockParseException if there was a problem parsing the docblock * @@ -73,7 +74,7 @@ public static function getTypeFromComment( /** * @param array>|null $template_type_map - * @param array> $type_aliases + * @param array $type_aliases * @param array{description:string, specials:array>} $parsed_docblock * * @return VarDocblockComment[] @@ -240,11 +241,11 @@ private static function sanitizeDocblockType(string $docblock_type) : string /** * @param Aliases $aliases - * @param array> $type_aliases + * @param array $type_aliases * * @throws DocblockParseException if there was a problem parsing the docblock * - * @return array> + * @return array */ public static function getTypeAliasesFromComment( PhpParser\Comment\Doc $comment, @@ -267,11 +268,11 @@ public static function getTypeAliasesFromComment( /** * @param array $type_alias_comment_lines * @param Aliases $aliases - * @param array> $type_aliases + * @param array $type_aliases * * @throws DocblockParseException if there was a problem parsing the docblock * - * @return array> + * @return array */ private static function getTypeAliasesFromCommentLines( array $type_alias_comment_lines, @@ -335,7 +336,7 @@ private static function getTypeAliasesFromCommentLines( throw new DocblockParseException($type_string . ' is not a valid type'); } - $type_alias_tokens[$type_alias] = $type_tokens; + $type_alias_tokens[$type_alias] = new TypeAlias($type_tokens); } return $type_alias_tokens; diff --git a/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php b/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php index ed95ad39064..0230eb45b16 100644 --- a/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php +++ b/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php @@ -42,6 +42,7 @@ use Psalm\Internal\Scanner\PhpStormMetaScanner; use Psalm\Internal\Scanner\UnresolvedConstant; use Psalm\Internal\Scanner\UnresolvedConstantComponent; +use Psalm\Internal\Type\TypeAlias; use Psalm\Internal\Type\TypeParser; use Psalm\Internal\Type\TypeTokenizer; use Psalm\Issue\DuplicateClass; @@ -127,7 +128,7 @@ class ReflectorVisitor extends PhpParser\NodeVisitorAbstract implements PhpParse private $skip_if_descendants = null; /** - * @var array> + * @var array */ private $type_aliases = []; @@ -164,9 +165,11 @@ public function enterNode(PhpParser\Node $node) $this->type_aliases ); - foreach ($type_alias_tokens as $type_tokens) { - // finds issues, if there are any - TypeParser::parseTokens($type_tokens); + foreach ($type_alias_tokens as $type_alias) { + if ($type_alias->replacement_tokens) { + // finds issues, if there are any + TypeParser::parseTokens($type_alias->replacement_tokens); + } } $this->type_aliases += $type_alias_tokens; diff --git a/src/Psalm/Internal/Type/TypeAlias.php b/src/Psalm/Internal/Type/TypeAlias.php new file mode 100644 index 00000000000..99c9a53c108 --- /dev/null +++ b/src/Psalm/Internal/Type/TypeAlias.php @@ -0,0 +1,18 @@ +|null + */ + public $replacement_tokens = null; + + /** + * @param list|null $replacement_tokens + */ + public function __construct(?array $replacement_tokens) + { + $this->replacement_tokens = $replacement_tokens; + } +} diff --git a/src/Psalm/Internal/Type/TypeTokenizer.php b/src/Psalm/Internal/Type/TypeTokenizer.php index 820657e4440..736e8dd44a5 100644 --- a/src/Psalm/Internal/Type/TypeTokenizer.php +++ b/src/Psalm/Internal/Type/TypeTokenizer.php @@ -322,8 +322,8 @@ public static function fixScalarTerms( } /** - * @param array|null $template_type_map - * @param array>|null $type_aliases + * @param array|null $template_type_map + * @param array|null $type_aliases * * @return list */ @@ -443,17 +443,21 @@ public static function getFullyQualifiedTokens( } if (isset($type_aliases[$string_type_token[0]])) { - $replacement_tokens = $type_aliases[$string_type_token[0]]; + $type_alias = $type_aliases[$string_type_token[0]]; - array_unshift($replacement_tokens, ['(', $i]); - array_push($replacement_tokens, [')', $i]); + if ($type_alias->replacement_tokens) { + $replacement_tokens = $type_alias->replacement_tokens; - $diff = count($replacement_tokens) - 1; + array_unshift($replacement_tokens, ['(', $i]); + array_push($replacement_tokens, [')', $i]); - array_splice($type_tokens, $i, 1, $replacement_tokens); + $diff = count($replacement_tokens) - 1; - $i += $diff; - $l += $diff; + array_splice($type_tokens, $i, 1, $replacement_tokens); + + $i += $diff; + $l += $diff; + } } else { $type_tokens[$i][0] = \Psalm\Type::getFQCLNFromString( $string_type_token[0], diff --git a/src/Psalm/Storage/FileStorage.php b/src/Psalm/Storage/FileStorage.php index 95779f721ad..5f7dbebe235 100644 --- a/src/Psalm/Storage/FileStorage.php +++ b/src/Psalm/Storage/FileStorage.php @@ -82,7 +82,7 @@ class FileStorage public $docblock_issues = []; /** - * @var array> + * @var array */ public $type_aliases = [];