@@ -463,7 +463,7 @@ public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\Ph
463463 case '@psalm-template-contravariant ' :
464464 $ tagValue = $ this ->typeParser ->parseTemplateTagValue (
465465 $ tokens ,
466- fn ($ tokens ) => $ this ->parseOptionalDescription ($ tokens ),
466+ fn ($ tokens ) => $ this ->parseOptionalDescription ($ tokens, true ),
467467 );
468468 break ;
469469
@@ -536,7 +536,7 @@ public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\Ph
536536
537537 } catch (ParserException $ e ) {
538538 $ tokens ->rollback ();
539- $ tagValue = new Ast \PhpDoc \InvalidTagValueNode ($ this ->parseOptionalDescription ($ tokens ), $ e );
539+ $ tagValue = new Ast \PhpDoc \InvalidTagValueNode ($ this ->parseOptionalDescription ($ tokens, false ), $ e );
540540 }
541541
542542 return $ this ->enrichWithAttributes ($ tokens , $ tagValue , $ startLine , $ startIndex );
@@ -865,7 +865,7 @@ private function parseParamTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTag
865865 $ isReference = $ tokens ->tryConsumeTokenType (Lexer::TOKEN_REFERENCE );
866866 $ isVariadic = $ tokens ->tryConsumeTokenType (Lexer::TOKEN_VARIADIC );
867867 $ parameterName = $ this ->parseRequiredVariableName ($ tokens );
868- $ description = $ this ->parseOptionalDescription ($ tokens );
868+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
869869
870870 if ($ type !== null ) {
871871 return new Ast \PhpDoc \ParamTagValueNode ($ type , $ isVariadic , $ parameterName , $ description , $ isReference );
@@ -878,7 +878,7 @@ private function parseParamTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTag
878878 private function parseParamImmediatelyInvokedCallableTagValue (TokenIterator $ tokens ): Ast \PhpDoc \ParamImmediatelyInvokedCallableTagValueNode
879879 {
880880 $ parameterName = $ this ->parseRequiredVariableName ($ tokens );
881- $ description = $ this ->parseOptionalDescription ($ tokens );
881+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
882882
883883 return new Ast \PhpDoc \ParamImmediatelyInvokedCallableTagValueNode ($ parameterName , $ description );
884884 }
@@ -887,7 +887,7 @@ private function parseParamImmediatelyInvokedCallableTagValue(TokenIterator $tok
887887 private function parseParamLaterInvokedCallableTagValue (TokenIterator $ tokens ): Ast \PhpDoc \ParamLaterInvokedCallableTagValueNode
888888 {
889889 $ parameterName = $ this ->parseRequiredVariableName ($ tokens );
890- $ description = $ this ->parseOptionalDescription ($ tokens );
890+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
891891
892892 return new Ast \PhpDoc \ParamLaterInvokedCallableTagValueNode ($ parameterName , $ description );
893893 }
@@ -897,7 +897,7 @@ private function parseParamClosureThisTagValue(TokenIterator $tokens): Ast\PhpDo
897897 {
898898 $ type = $ this ->typeParser ->parse ($ tokens );
899899 $ parameterName = $ this ->parseRequiredVariableName ($ tokens );
900- $ description = $ this ->parseOptionalDescription ($ tokens );
900+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
901901
902902 return new Ast \PhpDoc \ParamClosureThisTagValueNode ($ type , $ parameterName , $ description );
903903 }
@@ -950,7 +950,7 @@ private function parseRequireImplementsTagValue(TokenIterator $tokens): Ast\PhpD
950950
951951 private function parseDeprecatedTagValue (TokenIterator $ tokens ): Ast \PhpDoc \DeprecatedTagValueNode
952952 {
953- $ description = $ this ->parseOptionalDescription ($ tokens );
953+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
954954 return new Ast \PhpDoc \DeprecatedTagValueNode ($ description );
955955 }
956956
@@ -959,7 +959,7 @@ private function parsePropertyTagValue(TokenIterator $tokens): Ast\PhpDoc\Proper
959959 {
960960 $ type = $ this ->typeParser ->parse ($ tokens );
961961 $ parameterName = $ this ->parseRequiredVariableName ($ tokens );
962- $ description = $ this ->parseOptionalDescription ($ tokens );
962+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
963963 return new Ast \PhpDoc \PropertyTagValueNode ($ type , $ parameterName , $ description );
964964 }
965965
@@ -1018,7 +1018,7 @@ private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTa
10181018 }
10191019 $ tokens ->consumeTokenType (Lexer::TOKEN_CLOSE_PARENTHESES );
10201020
1021- $ description = $ this ->parseOptionalDescription ($ tokens );
1021+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
10221022 return new Ast \PhpDoc \MethodTagValueNode ($ isStatic , $ returnType , $ methodName , $ parameters , $ description , $ templateTypes );
10231023 }
10241024
@@ -1071,7 +1071,7 @@ private function parseExtendsTagValue(string $tagName, TokenIterator $tokens): A
10711071 $ this ->typeParser ->enrichWithAttributes ($ tokens , $ baseType , $ startLine , $ startIndex ),
10721072 );
10731073
1074- $ description = $ this ->parseOptionalDescription ($ tokens );
1074+ $ description = $ this ->parseOptionalDescription ($ tokens, true );
10751075
10761076 switch ($ tagName ) {
10771077 case '@extends ' :
@@ -1112,7 +1112,7 @@ private function parseTypeAliasTagValue(TokenIterator $tokens): Ast\PhpDoc\TypeA
11121112
11131113 return new Ast \PhpDoc \TypeAliasTagValueNode ($ alias , $ type );
11141114 } catch (ParserException $ e ) {
1115- $ this ->parseOptionalDescription ($ tokens );
1115+ $ this ->parseOptionalDescription ($ tokens, false );
11161116 return new Ast \PhpDoc \TypeAliasTagValueNode (
11171117 $ alias ,
11181118 $ this ->enrichWithAttributes ($ tokens , new Ast \Type \InvalidTypeNode ($ e ), $ startLine , $ startIndex ),
@@ -1156,7 +1156,7 @@ private function parseAssertTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTa
11561156 $ isEquality = $ tokens ->tryConsumeTokenType (Lexer::TOKEN_EQUAL );
11571157 $ type = $ this ->typeParser ->parse ($ tokens );
11581158 $ parameter = $ this ->parseAssertParameter ($ tokens );
1159- $ description = $ this ->parseOptionalDescription ($ tokens );
1159+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
11601160
11611161 if (array_key_exists ('method ' , $ parameter )) {
11621162 return new Ast \PhpDoc \AssertTagMethodValueNode ($ type , $ parameter ['parameter ' ], $ parameter ['method ' ], $ isNegated , $ description , $ isEquality );
@@ -1201,7 +1201,7 @@ private function parseAssertParameter(TokenIterator $tokens): array
12011201 private function parseSelfOutTagValue (TokenIterator $ tokens ): Ast \PhpDoc \SelfOutTagValueNode
12021202 {
12031203 $ type = $ this ->typeParser ->parse ($ tokens );
1204- $ description = $ this ->parseOptionalDescription ($ tokens );
1204+ $ description = $ this ->parseOptionalDescription ($ tokens, true );
12051205
12061206 return new Ast \PhpDoc \SelfOutTagValueNode ($ type , $ description );
12071207 }
@@ -1210,7 +1210,7 @@ private function parseParamOutTagValue(TokenIterator $tokens): Ast\PhpDoc\ParamO
12101210 {
12111211 $ type = $ this ->typeParser ->parse ($ tokens );
12121212 $ parameterName = $ this ->parseRequiredVariableName ($ tokens );
1213- $ description = $ this ->parseOptionalDescription ($ tokens );
1213+ $ description = $ this ->parseOptionalDescription ($ tokens, false );
12141214
12151215 return new Ast \PhpDoc \ParamOutTagValueNode ($ type , $ parameterName , $ description );
12161216 }
@@ -1240,7 +1240,10 @@ private function parseRequiredVariableName(TokenIterator $tokens): string
12401240 return $ parameterName ;
12411241 }
12421242
1243- private function parseOptionalDescription (TokenIterator $ tokens , bool $ limitStartToken = false ): string
1243+ /**
1244+ * @param bool $limitStartToken true should be used when the description immediately follows a parsed type
1245+ */
1246+ private function parseOptionalDescription (TokenIterator $ tokens , bool $ limitStartToken ): string
12441247 {
12451248 if ($ limitStartToken ) {
12461249 foreach (self ::DISALLOWED_DESCRIPTION_START_TOKENS as $ disallowedStartToken ) {
0 commit comments