@@ -30,11 +30,6 @@ class DiagnosticsEngine
3030 */
3131 private array $ diagnostics = [];
3232
33- /**
34- * @var array<int|string,int|string>
35- */
36- private array $ versions = [];
37-
3833 /**
3934 * @var array<string,Deferred<bool>>
4035 */
@@ -78,9 +73,14 @@ public function run(CancellationToken $token): Promise
7873
7974 yield $ this ->awaitNextDocument ();
8075
76+ $ beforeDocument = $ this ->waiting ;
8177 $ gracePeriod = abs ($ this ->sleepTime - ((microtime (true ) - $ this ->lastUpdatedAt ) * 1000 ));
8278 yield delay (intval ($ gracePeriod ));
8379
80+ if ($ beforeDocument !== $ this ->waiting ) {
81+ continue ;
82+ }
83+
8484 $ textDocument = $ this ->waiting ;
8585 $ this ->waiting = null ;
8686 // allow the next document update to resolve
@@ -99,8 +99,6 @@ public function run(CancellationToken $token): Promise
9999 );
100100 $ this ->diagnostics [$ textDocument ->uri ] = [];
101101
102- $ this ->versions [$ textDocument ->uri ] = $ textDocument ->version ;
103-
104102 $ crashedProviders = [];
105103
106104 foreach ($ this ->providers as $ providerId => $ provider ) {
@@ -144,15 +142,14 @@ public function run(CancellationToken $token): Promise
144142
145143 $ elapsed = (int )round ((microtime (true ) - $ start ) / 1000 );
146144
147- $ this ->diagnostics [$ textDocument ->uri ] = array_merge (
148- $ this ->diagnostics [$ textDocument ->uri ] ?? [],
149- $ diagnostics
150- );
151-
152145 if (!$ this ->isDocumentCurrent ($ textDocument )) {
153146 return ;
154147 }
155148
149+ $ this ->diagnostics [$ textDocument ->uri ] = array_merge (
150+ $ this ->diagnostics [$ textDocument ->uri ] ?? [],
151+ $ diagnostics
152+ );
156153
157154 $ this ->clientApi ->diagnostics ()->publishDiagnostics (
158155 $ textDocument ->uri ,
@@ -188,7 +185,7 @@ public function enqueue(TextDocumentItem $textDocument): void
188185
189186 private function isDocumentCurrent (TextDocumentItem $ textDocument ): bool
190187 {
191- return $ textDocument -> version === ( $ this -> versions [ $ textDocument -> uri ] ?? - 1 ) ;
188+ return $ this -> waiting === null ;
192189 }
193190
194191 /**
0 commit comments