Skip to content

Commit 803d496

Browse files
author
Andrew Hall
authored
Ignore updates with no changes for csharp files (#8162)
Before #7826 razor would use textdocument/{open, changed, closed} for csharp changes. That would mean that if the text didn't actually change vs code wouldn't notify roslyn. After that change the notification is handled for closed files by the razorDocumentManager. This causes a loop where csharp generated -> workspace changed for generated csharp -> workspace listeners notifies change -> generation is queued -> change is reported -> workspace changed for csharp -> ....
1 parent 24db10c commit 803d496

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

src/razor/src/document/IRazorDocumentChangeEvent.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { ServerTextChange } from '../rpc/serverTextChange';
67
import { IRazorDocument } from './IRazorDocument';
78
import { RazorDocumentChangeKind } from './razorDocumentChangeKind';
89

910
export interface IRazorDocumentChangeEvent {
1011
readonly document: IRazorDocument;
1112
readonly kind: RazorDocumentChangeKind;
13+
readonly changes: ServerTextChange[];
1214
}

src/razor/src/document/razorDocumentManager.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { createDocument } from './razorDocumentFactory';
2020
import { razorInitializeCommand } from '../../../lsptoolshost/razor/razorCommands';
2121
import { PlatformInformation } from '../../../shared/platform';
2222
import { v4 as uuidv4 } from 'uuid';
23+
import { ServerTextChange } from '../rpc/serverTextChange';
2324

2425
export class RazorDocumentManager implements IRazorDocumentManager {
2526
public roslynActivated = false;
@@ -158,7 +159,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
158159

159160
const document = this._getDocument(uri);
160161

161-
this.notifyDocumentChange(document, RazorDocumentChangeKind.opened);
162+
this.notifyDocumentChange(document, RazorDocumentChangeKind.opened, []);
162163
}
163164

164165
public async ensureRazorInitialized() {
@@ -189,7 +190,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
189190
}
190191
}
191192

192-
this.notifyDocumentChange(document, RazorDocumentChangeKind.closed);
193+
this.notifyDocumentChange(document, RazorDocumentChangeKind.closed, []);
193194
}
194195

195196
private addDocument(uri: vscode.Uri): IRazorDocument {
@@ -203,7 +204,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
203204
document = createDocument(uri);
204205
this.razorDocuments[document.path] = document;
205206

206-
this.notifyDocumentChange(document, RazorDocumentChangeKind.added);
207+
this.notifyDocumentChange(document, RazorDocumentChangeKind.added, []);
207208

208209
return document;
209210
}
@@ -212,7 +213,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
212213
const document = this._getDocument(uri);
213214
delete this.razorDocuments[document.path];
214215

215-
this.notifyDocumentChange(document, RazorDocumentChangeKind.removed);
216+
this.notifyDocumentChange(document, RazorDocumentChangeKind.removed, []);
216217
}
217218

218219
private findDocument(path: string) {
@@ -267,7 +268,7 @@ export class RazorDocumentManager implements IRazorDocumentManager {
267268
updateBufferRequest.encodingCodePage
268269
);
269270

270-
this.notifyDocumentChange(document, RazorDocumentChangeKind.csharpChanged);
271+
this.notifyDocumentChange(document, RazorDocumentChangeKind.csharpChanged, updateBufferRequest.changes);
271272
} else {
272273
this.logger.logWarning(
273274
'Failed to update the C# document buffer. This is unexpected and may result in incorrect C# interactions.'
@@ -310,24 +311,27 @@ export class RazorDocumentManager implements IRazorDocumentManager {
310311

311312
htmlProjectedDocument.update(updateBufferRequest.changes, updateBufferRequest.hostDocumentVersion);
312313

313-
this.notifyDocumentChange(document, RazorDocumentChangeKind.htmlChanged);
314+
this.notifyDocumentChange(document, RazorDocumentChangeKind.htmlChanged, updateBufferRequest.changes);
314315
} else {
315316
this.logger.logWarning(
316317
'Failed to update the HTML document buffer. This is unexpected and may result in incorrect HTML interactions.'
317318
);
318319
}
319320
}
320321

321-
private notifyDocumentChange(document: IRazorDocument, kind: RazorDocumentChangeKind) {
322+
private notifyDocumentChange(document: IRazorDocument, kind: RazorDocumentChangeKind, changes: ServerTextChange[]) {
322323
if (this.logger.verboseEnabled) {
323324
this.logger.logVerbose(
324-
`Notifying document '${getUriPath(document.uri)}' changed '${RazorDocumentChangeKind[kind]}'`
325+
`Notifying document '${getUriPath(document.uri)}' changed '${RazorDocumentChangeKind[kind]}' with '${
326+
changes.length
327+
}' changes.`
325328
);
326329
}
327330

328331
const args: IRazorDocumentChangeEvent = {
329332
document,
330333
kind,
334+
changes,
331335
};
332336

333337
this.onChangeEmitter.fire(args);

src/razor/src/dynamicFile/dynamicFileInfoHandler.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ export class DynamicFileInfoHandler {
4040
}
4141
);
4242
this.documentManager.onChange(async (e) => {
43-
if (e.kind == RazorDocumentChangeKind.csharpChanged && !e.document.isOpen) {
43+
// Ignore any updates without text changes. This is important for perf since sending an update to roslyn does
44+
// a round trip for producing nothing new and causes a lot of churn in solution updates.
45+
if (e.kind == RazorDocumentChangeKind.csharpChanged && !e.document.isOpen && e.changes.length > 0) {
4446
const uriString = UriConverter.serialize(e.document.uri);
4547
const identifier = TextDocumentIdentifier.create(uriString);
4648
await vscode.commands.executeCommand(

0 commit comments

Comments
 (0)