@@ -9,6 +9,7 @@ import { HtmlProjectedDocument } from '../html/htmlProjectedDocument';
99import { RazorLanguage } from '../razorLanguage' ;
1010import { RazorLanguageServerClient } from '../razorLanguageServerClient' ;
1111import { RazorLogger } from '../razorLogger' ;
12+ import { TelemetryReporter } from '../telemetryReporter' ;
1213import { UpdateBufferRequest } from '../rpc/updateBufferRequest' ;
1314import { getUriPath } from '../uriPaths' ;
1415import { IRazorDocument } from './IRazorDocument' ;
@@ -28,7 +29,11 @@ export class RazorDocumentManager implements IRazorDocumentManager {
2829
2930 public razorDocumentGenerationInitialized = false ;
3031
31- constructor ( private readonly serverClient : RazorLanguageServerClient , private readonly logger : RazorLogger ) { }
32+ constructor (
33+ private readonly serverClient : RazorLanguageServerClient ,
34+ private readonly logger : RazorLogger ,
35+ private readonly telemetryReporter : TelemetryReporter
36+ ) { }
3237
3338 public get onChange ( ) {
3439 return this . onChangeEmitter . event ;
@@ -227,6 +232,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
227232 const projectedDocument = document . csharpDocument ;
228233
229234 if (
235+ updateBufferRequest . previousWasEmpty ||
230236 ! projectedDocument . hostDocumentSyncVersion ||
231237 projectedDocument . hostDocumentSyncVersion <= updateBufferRequest . hostDocumentVersion
232238 ) {
@@ -237,6 +243,15 @@ export class RazorDocumentManager implements IRazorDocumentManager {
237243 await vscode . workspace . openTextDocument ( document . csharpDocument . uri ) ;
238244
239245 const csharpProjectedDocument = projectedDocument as CSharpProjectedDocument ;
246+
247+ // If the language server is telling us that the previous document was empty, then we should clear
248+ // ours out. Hopefully ours would have been empty too, but there are cases where things get out of
249+ // sync
250+ if ( updateBufferRequest . previousWasEmpty && projectedDocument . length !== 0 ) {
251+ this . telemetryReporter . reportBuffersOutOfSync ( ) ;
252+ csharpProjectedDocument . clear ( ) ;
253+ }
254+
240255 csharpProjectedDocument . update ( updateBufferRequest . changes , updateBufferRequest . hostDocumentVersion ) ;
241256
242257 this . notifyDocumentChange ( document , RazorDocumentChangeKind . csharpChanged ) ;
@@ -260,6 +275,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
260275 const projectedDocument = document . htmlDocument ;
261276
262277 if (
278+ updateBufferRequest . previousWasEmpty ||
263279 ! projectedDocument . hostDocumentSyncVersion ||
264280 projectedDocument . hostDocumentSyncVersion <= updateBufferRequest . hostDocumentVersion
265281 ) {
@@ -270,6 +286,15 @@ export class RazorDocumentManager implements IRazorDocumentManager {
270286 await vscode . workspace . openTextDocument ( document . htmlDocument . uri ) ;
271287
272288 const htmlProjectedDocument = projectedDocument as HtmlProjectedDocument ;
289+
290+ // If the language server is telling us that the previous document was empty, then we should clear
291+ // ours out. Hopefully ours would have been empty too, but there are cases where things get out of
292+ // sync
293+ if ( updateBufferRequest . previousWasEmpty && projectedDocument . length !== 0 ) {
294+ this . telemetryReporter . reportBuffersOutOfSync ( ) ;
295+ htmlProjectedDocument . clear ( ) ;
296+ }
297+
273298 htmlProjectedDocument . update ( updateBufferRequest . changes , updateBufferRequest . hostDocumentVersion ) ;
274299
275300 this . notifyDocumentChange ( document , RazorDocumentChangeKind . htmlChanged ) ;
0 commit comments