Skip to content

Commit 8349588

Browse files
authored
Remove notifyChangesToDocument as this is no longer necessary (#14237)
1 parent 516f5f1 commit 8349588

File tree

11 files changed

+34
-92
lines changed

11 files changed

+34
-92
lines changed

src/client/datascience/jupyter/kernels/cellExecution.ts

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
} from '../../notebook/helpers/helpers';
2828
import { MultiCancellationTokenSource } from '../../notebook/helpers/multiCancellationToken';
2929
import { NotebookEditor } from '../../notebook/notebookEditor';
30-
import { INotebookContentProvider } from '../../notebook/types';
3130
import {
3231
IDataScienceErrorHandler,
3332
IJupyterSession,
@@ -41,7 +40,6 @@ const vscodeNotebookEnums = require('vscode') as typeof import('vscode-proposed'
4140

4241
export class CellExecutionFactory {
4342
constructor(
44-
private readonly contentProvider: INotebookContentProvider,
4543
private readonly errorHandler: IDataScienceErrorHandler,
4644
private readonly editorProvider: INotebookEditorProvider,
4745
private readonly appShell: IApplicationShell,
@@ -53,7 +51,6 @@ export class CellExecutionFactory {
5351
return CellExecution.fromCell(
5452
this.vscNotebook.notebookEditors.find((e) => e.document === cell.notebook)!,
5553
cell,
56-
this.contentProvider,
5754
this.errorHandler,
5855
this.editorProvider,
5956
this.appShell
@@ -104,7 +101,6 @@ export class CellExecution {
104101
private constructor(
105102
public readonly editor: VSCNotebookEditor,
106103
public readonly cell: NotebookCell,
107-
private readonly contentProvider: INotebookContentProvider,
108104
private readonly errorHandler: IDataScienceErrorHandler,
109105
private readonly editorProvider: INotebookEditorProvider,
110106
private readonly applicationService: IApplicationShell
@@ -116,12 +112,11 @@ export class CellExecution {
116112
public static fromCell(
117113
editor: VSCNotebookEditor,
118114
cell: NotebookCell,
119-
contentProvider: INotebookContentProvider,
120115
errorHandler: IDataScienceErrorHandler,
121116
editorProvider: INotebookEditorProvider,
122117
appService: IApplicationShell
123118
) {
124-
return new CellExecution(editor, cell, contentProvider, errorHandler, editorProvider, appService);
119+
return new CellExecution(editor, cell, errorHandler, editorProvider, appService);
125120
}
126121

127122
public async start(kernelPromise: Promise<IKernel>, notebook: INotebook) {
@@ -136,8 +131,6 @@ export class CellExecution {
136131
});
137132
});
138133
this.stopWatch.reset();
139-
// Changes to metadata must be saved in ipynb, hence mark doc has dirty.
140-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
141134
this.notifyCellExecution();
142135

143136
// Begin the request that will modify our cell.
@@ -182,13 +175,10 @@ export class CellExecution {
182175
})
183176
);
184177
await updateCellWithErrorStatus(this.editor, this.cell, error);
185-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
186178
this.errorHandler.handleError((error as unknown) as Error).ignoreErrors();
187179

188180
this._completed = true;
189181
this._result.resolve(this.cell.metadata.runState);
190-
// Changes to metadata must be saved in ipynb, hence mark doc has dirty.
191-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
192182
}
193183

194184
private async completedSuccessfully() {
@@ -222,8 +212,6 @@ export class CellExecution {
222212

223213
this._completed = true;
224214
this._result.resolve(this.cell.metadata.runState);
225-
// Changes to metadata must be saved in ipynb, hence mark doc has dirty.
226-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
227215
}
228216

229217
/**
@@ -258,8 +246,6 @@ export class CellExecution {
258246
);
259247
this._completed = true;
260248
this._result.resolve(this.cell.metadata.runState);
261-
// Changes to metadata must be saved in ipynb, hence mark doc has dirty.
262-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
263249
}
264250

265251
/**
@@ -273,7 +259,6 @@ export class CellExecution {
273259
runState: vscodeNotebookEnums.NotebookCellRunState.Running
274260
})
275261
);
276-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
277262
}
278263

279264
private sendPerceivedCellExecute() {
@@ -371,8 +356,6 @@ export class CellExecution {
371356
// tslint:disable-next-line:no-require-imports
372357
const jupyterLab = require('@jupyterlab/services') as typeof import('@jupyterlab/services');
373358

374-
// Keep track of we need to send an update to VS code or not.
375-
let shouldUpdate = true;
376359
try {
377360
if (jupyterLab.KernelMessage.isExecuteResultMsg(msg)) {
378361
await this.handleExecuteResult(msg as KernelMessage.IExecuteResultMsg, clearState);
@@ -382,28 +365,23 @@ export class CellExecution {
382365
// Status is handled by the result promise. While it is running we are active. Otherwise we're stopped.
383366
// So ignore status messages.
384367
const statusMsg = msg as KernelMessage.IStatusMsg;
385-
shouldUpdate = false;
386368
this.handleStatusMessage(statusMsg, clearState);
387369
} else if (jupyterLab.KernelMessage.isStreamMsg(msg)) {
388370
await this.handleStreamMessage(msg as KernelMessage.IStreamMsg, clearState);
389371
} else if (jupyterLab.KernelMessage.isDisplayDataMsg(msg)) {
390372
await this.handleDisplayData(msg as KernelMessage.IDisplayDataMsg, clearState);
391-
} else if (jupyterLab.KernelMessage.isUpdateDisplayDataMsg(msg)) {
392-
// No new data to update UI, hence do not send updates.
393-
shouldUpdate = false;
394373
} else if (jupyterLab.KernelMessage.isClearOutputMsg(msg)) {
395374
await this.handleClearOutput(msg as KernelMessage.IClearOutputMsg, clearState);
396375
} else if (jupyterLab.KernelMessage.isErrorMsg(msg)) {
397376
await this.handleError(msg as KernelMessage.IErrorMsg, clearState);
377+
} else if (jupyterLab.KernelMessage.isUpdateDisplayDataMsg(msg)) {
378+
// Noop.
398379
} else if (jupyterLab.KernelMessage.isCommOpenMsg(msg)) {
399-
// No new data to update UI, hence do not send updates.
400-
shouldUpdate = false;
380+
// Noop.
401381
} else if (jupyterLab.KernelMessage.isCommMsgMsg(msg)) {
402-
// No new data to update UI, hence do not send updates.
403-
shouldUpdate = false;
382+
// Noop.
404383
} else if (jupyterLab.KernelMessage.isCommCloseMsg(msg)) {
405-
// No new data to update UI, hence do not send updates.
406-
shouldUpdate = false;
384+
// Noop.
407385
} else {
408386
traceWarning(`Unknown message ${msg.header.msg_type} : hasData=${'data' in msg.content}`);
409387
}
@@ -412,11 +390,6 @@ export class CellExecution {
412390
if ('execution_count' in msg.content && typeof msg.content.execution_count === 'number') {
413391
updateCellExecutionCount(this.editor, this.cell, msg.content.execution_count).then(noop, noop);
414392
}
415-
416-
// Show our update if any new output.
417-
if (shouldUpdate) {
418-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
419-
}
420393
} catch (err) {
421394
// If not a restart error, then tell the subscriber
422395
this.completedWithErrors(err).then(noop, noop);
@@ -588,9 +561,6 @@ export class CellExecution {
588561
if ('execution_count' in msg.content && typeof msg.content.execution_count === 'number') {
589562
await updateCellExecutionCount(this.editor, this.cell, msg.content.execution_count);
590563
}
591-
592-
// Send this event.
593-
this.contentProvider.notifyChangesToDocument(this.cell.notebook);
594564
}
595565
}
596566
}

src/client/datascience/jupyter/kernels/kernel.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { createDeferred, Deferred } from '../../../common/utils/async';
2424
import { noop } from '../../../common/utils/misc';
2525
import { IInterpreterService } from '../../../interpreter/contracts';
2626
import { CodeSnippets } from '../../constants';
27-
import { INotebookContentProvider } from '../../notebook/types';
2827
import { getDefaultNotebookContent, updateNotebookMetadata } from '../../notebookStorage/baseModel';
2928
import {
3029
IDataScienceErrorHandler,
@@ -82,7 +81,6 @@ export class Kernel implements IKernel {
8281
commandManager: ICommandManager,
8382
interpreterService: IInterpreterService,
8483
private readonly errorHandler: IDataScienceErrorHandler,
85-
contentProvider: INotebookContentProvider,
8684
editorProvider: INotebookEditorProvider,
8785
private readonly kernelProvider: IKernelProvider,
8886
private readonly kernelSelectionUsage: IKernelSelectionUsage,
@@ -94,7 +92,6 @@ export class Kernel implements IKernel {
9492
commandManager,
9593
interpreterService,
9694
errorHandler,
97-
contentProvider,
9895
editorProvider,
9996
kernelSelectionUsage,
10097
appShell,

src/client/datascience/jupyter/kernels/kernelExecution.ts

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { captureTelemetry } from '../../../telemetry';
1313
import { Commands, Telemetry, VSCodeNativeTelemetry } from '../../constants';
1414
import { handleUpdateDisplayDataMessage } from '../../notebook/helpers/executionHelpers';
1515
import { MultiCancellationTokenSource } from '../../notebook/helpers/multiCancellationToken';
16-
import { INotebookContentProvider } from '../../notebook/types';
1716
import { IDataScienceErrorHandler, INotebook, INotebookEditorProvider } from '../../types';
1817
import { CellExecution, CellExecutionFactory } from './cellExecution';
1918
import type { IKernel, IKernelProvider, IKernelSelectionUsage } from './types';
@@ -40,19 +39,12 @@ export class KernelExecution implements IDisposable {
4039
private readonly commandManager: ICommandManager,
4140
private readonly interpreterService: IInterpreterService,
4241
errorHandler: IDataScienceErrorHandler,
43-
private readonly contentProvider: INotebookContentProvider,
4442
editorProvider: INotebookEditorProvider,
4543
readonly kernelSelectionUsage: IKernelSelectionUsage,
4644
readonly appShell: IApplicationShell,
4745
readonly vscNotebook: IVSCodeNotebook
4846
) {
49-
this.executionFactory = new CellExecutionFactory(
50-
this.contentProvider,
51-
errorHandler,
52-
editorProvider,
53-
appShell,
54-
vscNotebook
55-
);
47+
this.executionFactory = new CellExecutionFactory(errorHandler, editorProvider, appShell, vscNotebook);
5648
}
5749

5850
@captureTelemetry(Telemetry.ExecuteNativeCell, undefined, true)
@@ -174,9 +166,7 @@ export class KernelExecution implements IDisposable {
174166
const jupyterLab = require('@jupyterlab/services') as typeof import('@jupyterlab/services');
175167
const editor = this.vscNotebook.notebookEditors.find((e) => e.document === document);
176168
if (jupyterLab.KernelMessage.isUpdateDisplayDataMsg(msg) && editor) {
177-
if (await handleUpdateDisplayDataMessage(msg, editor)) {
178-
this.contentProvider.notifyChangesToDocument(document);
179-
}
169+
await handleUpdateDisplayDataMessage(msg, editor);
180170
}
181171
}
182172

src/client/datascience/jupyter/kernels/kernelProvider.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { IApplicationShell, ICommandManager, IVSCodeNotebook } from '../../../co
1010
import { traceInfo, traceWarning } from '../../../common/logger';
1111
import { IAsyncDisposableRegistry, IConfigurationService, IDisposableRegistry } from '../../../common/types';
1212
import { IInterpreterService } from '../../../interpreter/contracts';
13-
import { INotebookContentProvider } from '../../notebook/types';
1413
import { IDataScienceErrorHandler, INotebookEditorProvider, INotebookProvider } from '../../types';
1514
import { Kernel } from './kernel';
1615
import { KernelSelector } from './kernelSelector';
@@ -27,7 +26,6 @@ export class KernelProvider implements IKernelProvider {
2726
@inject(ICommandManager) private readonly commandManager: ICommandManager,
2827
@inject(IInterpreterService) private readonly interpreterService: IInterpreterService,
2928
@inject(IDataScienceErrorHandler) private readonly errorHandler: IDataScienceErrorHandler,
30-
@inject(INotebookContentProvider) private readonly contentProvider: INotebookContentProvider,
3129
@inject(INotebookEditorProvider) private readonly editorProvider: INotebookEditorProvider,
3230
@inject(KernelSelector) private readonly kernelSelectionUsage: IKernelSelectionUsage,
3331
@inject(IApplicationShell) private readonly appShell: IApplicationShell,
@@ -54,7 +52,6 @@ export class KernelProvider implements IKernelProvider {
5452
this.commandManager,
5553
this.interpreterService,
5654
this.errorHandler,
57-
this.contentProvider,
5855
this.editorProvider,
5956
this,
6057
this.kernelSelectionUsage,

src/client/datascience/notebook/contentProvider.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { inject, injectable } from 'inversify';
77
import { CancellationToken, EventEmitter, Uri } from 'vscode';
88
import type {
99
NotebookCommunication,
10+
NotebookContentProvider as VSCNotebookContentProvider,
1011
NotebookData,
1112
NotebookDocument,
1213
NotebookDocumentBackup,
@@ -22,10 +23,8 @@ import { INotebookStorageProvider } from '../notebookStorage/notebookStorageProv
2223
import { VSCodeNotebookModel } from '../notebookStorage/vscNotebookModel';
2324
import { notebookModelToVSCNotebookData } from './helpers/helpers';
2425
import { NotebookEditorCompatibilitySupport } from './notebookEditorCompatibilitySupport';
25-
import { INotebookContentProvider } from './types';
2626
// tslint:disable-next-line: no-var-requires no-require-imports
2727
const vscodeNotebookEnums = require('vscode') as typeof import('vscode-proposed');
28-
2928
/**
3029
* This class is responsible for reading a notebook file (ipynb or other files) and returning VS Code with the NotebookData.
3130
* Its up to extension authors to read the files and return it in a format that VSCode understands.
@@ -35,7 +34,7 @@ const vscodeNotebookEnums = require('vscode') as typeof import('vscode-proposed'
3534
* When saving, VSC will provide their model and we need to take that and merge it with an existing ipynb json (if any, to preserve metadata).
3635
*/
3736
@injectable()
38-
export class NotebookContentProvider implements INotebookContentProvider {
37+
export class NotebookContentProvider implements VSCNotebookContentProvider {
3938
private notebookChanged = new EventEmitter<NotebookDocumentContentChangeEvent>();
4039
public get onDidChangeNotebook() {
4140
return this.notebookChanged.event;
@@ -45,9 +44,6 @@ export class NotebookContentProvider implements INotebookContentProvider {
4544
@inject(NotebookEditorCompatibilitySupport)
4645
private readonly compatibilitySupport: NotebookEditorCompatibilitySupport
4746
) {}
48-
public notifyChangesToDocument(_document: NotebookDocument) {
49-
// this.notebookChanged.fire({ document });
50-
}
5147
public async resolveNotebook(_document: NotebookDocument, _webview: NotebookCommunication): Promise<void> {
5248
// Later
5349
}

src/client/datascience/notebook/helpers/executionHelpers.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ const vscodeNotebookEnums = require('vscode') as typeof import('vscode-proposed'
2121
export async function handleUpdateDisplayDataMessage(
2222
msg: KernelMessage.IUpdateDisplayDataMsg,
2323
editor: NotebookEditor
24-
): Promise<boolean> {
24+
): Promise<void> {
2525
const document = editor.document;
26-
let updated = false;
2726
// Find any cells that have this same display_id
2827
for (const cell of document.cells) {
2928
if (cell.cellKind !== vscodeNotebookEnums.CellKind.Code) {
30-
return false;
29+
continue;
3130
}
31+
let updated = false;
3232

3333
const outputs = createIOutputFromCellOutputs(cell.outputs);
3434
const changedOutputs = outputs.map((output) => {
@@ -51,15 +51,10 @@ export async function handleUpdateDisplayDataMessage(
5151
}
5252
});
5353

54-
if (!updated) {
55-
continue;
54+
if (updated) {
55+
await updateCellOutput(editor, cell, changedOutputs);
5656
}
57-
58-
await updateCellOutput(editor, cell, changedOutputs);
59-
updated = true;
6057
}
61-
62-
return updated;
6358
}
6459

6560
/**
@@ -87,7 +82,7 @@ export async function updateCellExecutionCount(
8782
editor: NotebookEditor,
8883
cell: NotebookCell,
8984
executionCount: number
90-
): Promise<boolean> {
85+
): Promise<void> {
9186
if (cell.metadata.executionOrder !== executionCount && executionCount) {
9287
const cellIndex = editor.document.cells.indexOf(cell);
9388
await editor.edit((edit) =>
@@ -96,9 +91,7 @@ export async function updateCellExecutionCount(
9691
executionOrder: executionCount
9792
})
9893
);
99-
return true;
10094
}
101-
return false;
10295
}
10396

10497
/**

src/client/datascience/notebook/integration.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
'use strict';
44
import { inject, injectable } from 'inversify';
55
import { ConfigurationTarget } from 'vscode';
6+
import { NotebookContentProvider as VSCNotebookContentProvider } from '../../../../types/vscode-proposed';
67
import { IExtensionSingleActivationService } from '../../activation/types';
78
import {
89
IApplicationEnvironment,
@@ -33,7 +34,7 @@ export class NotebookIntegration implements IExtensionSingleActivationService {
3334
@inject(IVSCodeNotebook) private readonly vscNotebook: IVSCodeNotebook,
3435
@inject(IExperimentsManager) private readonly experiment: IExperimentsManager,
3536
@inject(IDisposableRegistry) private readonly disposables: IDisposableRegistry,
36-
@inject(INotebookContentProvider) private readonly notebookContentProvider: INotebookContentProvider,
37+
@inject(INotebookContentProvider) private readonly notebookContentProvider: VSCNotebookContentProvider,
3738
@inject(VSCodeKernelPickerProvider) private readonly kernelProvider: VSCodeKernelPickerProvider,
3839
@inject(IApplicationEnvironment) private readonly env: IApplicationEnvironment,
3940
@inject(IApplicationShell) private readonly shell: IApplicationShell,

src/client/datascience/notebook/serviceRegistry.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
'use strict';
55

6+
import { NotebookContentProvider as VSCNotebookContentProvider } from '../../../../types/vscode-proposed';
67
import { IExtensionSingleActivationService } from '../../activation/types';
78
import { IInterpreterStatusbarVisibilityFilter } from '../../interpreter/contracts';
89
import { IServiceManager } from '../../ioc/types';
@@ -17,7 +18,7 @@ import { NotebookSurveyBanner, NotebookSurveyDataLogger } from './survey';
1718
import { INotebookContentProvider } from './types';
1819

1920
export function registerTypes(serviceManager: IServiceManager) {
20-
serviceManager.addSingleton<INotebookContentProvider>(INotebookContentProvider, NotebookContentProvider);
21+
serviceManager.addSingleton<VSCNotebookContentProvider>(INotebookContentProvider, NotebookContentProvider);
2122
serviceManager.addSingleton<IExtensionSingleActivationService>(
2223
IExtensionSingleActivationService,
2324
NotebookIntegration

src/client/datascience/notebook/types.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,4 @@
33

44
'use strict';
55

6-
import type { NotebookContentProvider as VSCodeNotebookContentProvider, NotebookDocument } from 'vscode-proposed';
7-
86
export const INotebookContentProvider = Symbol('INotebookContentProvider');
9-
export interface INotebookContentProvider extends VSCodeNotebookContentProvider {
10-
/**
11-
* Notify VS Code that document has changed.
12-
* The change is not something that can be undone by using the `undo`.
13-
* E.g. updating execution count of a cell, or making a notebook readonly, or updating kernel info in ipynb metadata.
14-
*/
15-
notifyChangesToDocument(document: NotebookDocument): void;
16-
}

0 commit comments

Comments
 (0)