@@ -49,6 +49,9 @@ class FileTypeMapper
49
49
/** @var (false|(callable(): \PHPStan\Analyser\NameScope)|\PHPStan\Analyser\NameScope)[][] */
50
50
private array $ inProcess = [];
51
51
52
+ /** @var array<string, ResolvedPhpDocBlock> */
53
+ private array $ resolvedPhpDocBlockCache = [];
54
+
52
55
/** @var array<string, bool> */
53
56
private array $ alreadyProcessedDependentFiles = [];
54
57
@@ -83,14 +86,18 @@ public function getResolvedPhpDoc(
83
86
}
84
87
85
88
$ nameScopeKey = $ this ->getNameScopeKey ($ fileName , $ className , $ traitName , $ functionName );
89
+ $ phpDocKey = md5 (sprintf ('%s-%s ' , $ nameScopeKey , $ docComment ));
90
+ if (isset ($ this ->resolvedPhpDocBlockCache [$ phpDocKey ])) {
91
+ return $ this ->resolvedPhpDocBlockCache [$ phpDocKey ];
92
+ }
86
93
$ nameScopeMap = [];
87
94
88
95
if (!isset ($ this ->inProcess [$ fileName ])) {
89
96
$ nameScopeMap = $ this ->getNameScopeMap ($ fileName );
90
97
}
91
98
92
99
if (isset ($ nameScopeMap [$ nameScopeKey ])) {
93
- return $ this ->createResolvedPhpDocBlock ($ nameScopeMap [$ nameScopeKey ], $ docComment , $ fileName );
100
+ return $ this ->createResolvedPhpDocBlock ($ phpDocKey , $ nameScopeMap [$ nameScopeKey ], $ docComment , $ fileName );
94
101
}
95
102
96
103
if (!isset ($ this ->inProcess [$ fileName ][$ nameScopeKey ])) { // wrong $fileName due to traits
@@ -107,10 +114,10 @@ public function getResolvedPhpDoc(
107
114
$ this ->inProcess [$ fileName ][$ nameScopeKey ] = $ resolveCallback ();
108
115
}
109
116
110
- return $ this ->createResolvedPhpDocBlock ($ this ->inProcess [$ fileName ][$ nameScopeKey ], $ docComment , $ fileName );
117
+ return $ this ->createResolvedPhpDocBlock ($ phpDocKey , $ this ->inProcess [$ fileName ][$ nameScopeKey ], $ docComment , $ fileName );
111
118
}
112
119
113
- private function createResolvedPhpDocBlock (NameScope $ nameScope , string $ phpDocString , string $ fileName ): ResolvedPhpDocBlock
120
+ private function createResolvedPhpDocBlock (string $ phpDocKey , NameScope $ nameScope , string $ phpDocString , string $ fileName ): ResolvedPhpDocBlock
114
121
{
115
122
$ phpDocNode = $ this ->resolvePhpDocStringToDocNode ($ phpDocString );
116
123
$ templateTags = $ this ->phpDocNodeResolver ->resolveTemplateTags ($ phpDocNode , $ nameScope );
@@ -140,7 +147,7 @@ private function createResolvedPhpDocBlock(NameScope $nameScope, string $phpDocS
140
147
$ templateTypeMap = TemplateTypeMap::createEmpty ();
141
148
}
142
149
143
- return ResolvedPhpDocBlock::create (
150
+ return $ this -> resolvedPhpDocBlockCache [ $ phpDocKey ] = ResolvedPhpDocBlock::create (
144
151
$ phpDocNode ,
145
152
$ phpDocString ,
146
153
$ fileName ,
0 commit comments