Skip to content

Commit 69f2632

Browse files
committed
initialize notebook text model data only through ctor.
1 parent a037570 commit 69f2632

File tree

5 files changed

+59
-59
lines changed

5 files changed

+59
-59
lines changed

src/vs/workbench/api/browser/mainThreadNotebook.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -458,27 +458,12 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
458458
});
459459
});
460460
},
461-
createNotebook: async (textModel: NotebookTextModel, backupId?: string) => {
462-
// open notebook document
463-
const data = await this._proxy.$resolveNotebookData(textModel.viewType, textModel.uri, backupId);
464-
textModel.updateLanguages(data.languages);
465-
textModel.metadata = data.metadata;
466-
textModel.transientOptions = options;
467-
468-
if (data.cells.length) {
469-
textModel.initialize(data!.cells);
470-
} else if (textModel.uri.scheme === Schemas.untitled) {
471-
textModel.initialize([{
472-
cellKind: CellKind.Code,
473-
language: textModel.resolvedLanguages.length ? textModel.resolvedLanguages[0] : '',
474-
outputs: [],
475-
metadata: undefined,
476-
source: ''
477-
}]);
478-
}
479-
480-
this._proxy.$acceptDocumentPropertiesChanged(textModel.uri, { metadata: textModel.metadata });
481-
return;
461+
resolveNotebookDocument: async (viewType: string, uri: URI, backupId?: string) => {
462+
const data = await this._proxy.$resolveNotebookData(viewType, uri, backupId);
463+
return {
464+
data,
465+
transientOptions: options
466+
};
482467
},
483468
resolveNotebookEditor: async (viewType: string, uri: URI, editorId: string) => {
484469
await this._proxy.$resolveNotebookEditor(viewType, uri, editorId);

src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Emitter, Event } from 'vs/base/common/event';
99
import { Iterable } from 'vs/base/common/iterator';
1010
import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';
1111
import { ResourceMap } from 'vs/base/common/map';
12+
import { Schemas } from 'vs/base/common/network';
1213
import { URI } from 'vs/base/common/uri';
1314
import { RedoCommand, UndoCommand } from 'vs/editor/browser/editorExtensions';
1415
import { CopyAction, CutAction, PasteAction } from 'vs/editor/contrib/clipboard/clipboard';
@@ -26,7 +27,7 @@ import { NotebookKernelProviderAssociationRegistry, NotebookViewTypesExtensionRe
2627
import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel';
2728
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
2829
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
29-
import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellEditType, CellOutputKind, CellUri, DisplayOrderKey, ICellEditOperation, IDisplayOutput, INotebookKernelInfo2, INotebookKernelProvider, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellOutputsSplice, notebookDocumentFilterMatch, NotebookEditorPriority, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes } from 'vs/workbench/contrib/notebook/common/notebookCommon';
30+
import { ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, BUILTIN_RENDERER_ID, CellEditType, CellKind, CellOutputKind, CellUri, DisplayOrderKey, ICellEditOperation, IDisplayOutput, INotebookKernelInfo2, INotebookKernelProvider, INotebookRendererInfo, INotebookTextModel, IOrderedMimeType, ITransformedDisplayOutputDto, mimeTypeSupportedByCore, NotebookCellOutputsSplice, notebookDocumentFilterMatch, NotebookEditorPriority, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes } from 'vs/workbench/contrib/notebook/common/notebookCommon';
3031
import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer';
3132
import { NotebookEditorDescriptor, NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider';
3233
import { IMainNotebookController, INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService';
@@ -622,8 +623,16 @@ export class NotebookService extends Disposable implements INotebookService, ICu
622623
return notebookModel;
623624

624625
} else {
625-
notebookModel = this._instantiationService.createInstance(NotebookTextModel, viewType, provider.controller.supportBackup, uri);
626-
await provider.controller.createNotebook(notebookModel, backupId);
626+
const dataDto = await provider.controller.resolveNotebookDocument(viewType, uri, backupId);
627+
let cells = dataDto.data.cells.length ? dataDto.data.cells : (uri.scheme === Schemas.untitled ? [{
628+
cellKind: CellKind.Code,
629+
language: dataDto.data.languages.length ? dataDto.data.languages[0] : '',
630+
outputs: [],
631+
metadata: undefined,
632+
source: ''
633+
}] : []);
634+
635+
notebookModel = this._instantiationService.createInstance(NotebookTextModel, viewType, provider.controller.supportBackup, uri, cells, dataDto.data.languages, dataDto.data.metadata, dataDto.transientOptions);
627636
}
628637

629638
// new notebook model created

src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,31 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
153153
private _operationManager: NotebookOperationManager;
154154
private _eventEmitter: DelayedEmitter;
155155

156+
get cells(): readonly NotebookCellTextModel[] {
157+
return this._cells;
158+
}
159+
160+
get versionId() {
161+
return this._versionId;
162+
}
163+
156164
constructor(
157165
readonly viewType: string,
158166
readonly supportBackup: boolean,
159167
readonly uri: URI,
168+
cells: ICellDto2[],
169+
languages: string[],
170+
metadata: NotebookDocumentMetadata,
171+
options: TransientOptions,
160172
@IUndoRedoService private _undoService: IUndoRedoService,
161173
@ITextModelService private _modelService: ITextModelService,
162174
@IModeService private readonly _modeService: IModeService,
163175
) {
164176
super();
165-
this._cells = [];
177+
this.transientOptions = options;
178+
this.metadata = metadata;
179+
this.updateLanguages(languages);
180+
this._initialize(cells);
166181

167182
this._operationManager = new NotebookOperationManager(this._undoService, uri);
168183
this._eventEmitter = new DelayedEmitter(
@@ -172,34 +187,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
172187
);
173188
}
174189

175-
dispose() {
176-
this._onWillDispose.fire();
177-
dispose(this._cellListeners.values());
178-
dispose(this._cells);
179-
super.dispose();
180-
}
181-
182-
get cells(): readonly NotebookCellTextModel[] {
183-
return this._cells;
184-
}
185-
186-
get versionId() {
187-
return this._versionId;
188-
}
189-
190-
createCellTextModel(
191-
source: string,
192-
language: string,
193-
cellKind: CellKind,
194-
outputs: IProcessedOutput[],
195-
metadata: NotebookCellMetadata | undefined
196-
) {
197-
const cellHandle = this._cellhandlePool++;
198-
const cellUri = CellUri.generate(this.uri, cellHandle);
199-
return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata || {}, this.transientOptions, this._modelService);
200-
}
201-
202-
initialize(cells: ICellDto2[]) {
190+
private _initialize(cells: ICellDto2[]) {
203191
this._cells = [];
204192
this._versionId = 0;
205193

@@ -222,6 +210,25 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
222210
this._increaseVersionId();
223211
}
224212

213+
214+
dispose() {
215+
this._onWillDispose.fire();
216+
dispose(this._cellListeners.values());
217+
dispose(this._cells);
218+
super.dispose();
219+
}
220+
createCellTextModel(
221+
source: string,
222+
language: string,
223+
cellKind: CellKind,
224+
outputs: IProcessedOutput[],
225+
metadata: NotebookCellMetadata | undefined
226+
) {
227+
const cellHandle = this._cellhandlePool++;
228+
const cellUri = CellUri.generate(this.uri, cellHandle);
229+
return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata || {}, this.transientOptions, this._modelService);
230+
}
231+
225232
pushStackElement(label: string) {
226233
this._operationManager.pushStackElement(label);
227234
}

src/vs/workbench/contrib/notebook/common/notebookService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.pr
1010
import { Event } from 'vs/base/common/event';
1111
import {
1212
INotebookTextModel, INotebookRendererInfo,
13-
IEditor, ICellEditOperation, NotebookCellOutputsSplice, INotebookKernelProvider, INotebookKernelInfo2, TransientMetadata
13+
IEditor, ICellEditOperation, NotebookCellOutputsSplice, INotebookKernelProvider, INotebookKernelInfo2, TransientMetadata, NotebookDataDto, TransientOptions
1414
} from 'vs/workbench/contrib/notebook/common/notebookCommon';
1515
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
1616
import { CancellationToken } from 'vs/base/common/cancellation';
@@ -24,7 +24,7 @@ export const INotebookService = createDecorator<INotebookService>('notebookServi
2424
export interface IMainNotebookController {
2525
supportBackup: boolean;
2626
options: { transientOutputs: boolean; transientMetadata: TransientMetadata; };
27-
createNotebook(textModel: NotebookTextModel, editorId?: string, backupId?: string): Promise<void>;
27+
resolveNotebookDocument(viewType: string, uri: URI, backupId?: string): Promise<{ data: NotebookDataDto, transientOptions: TransientOptions }>;
2828
reloadNotebook(mainthreadTextModel: NotebookTextModel): Promise<void>;
2929
resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise<void>;
3030
onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void;

src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/v
1818
import { CellViewModel, IModelDecorationsChangeAccessor, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel';
1919
import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel';
2020
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
21-
import { CellKind, CellUri, INotebookEditorModel, IProcessedOutput, NotebookCellMetadata, IInsetRenderOutput, ICellRange, INotebookKernelInfo2 } from 'vs/workbench/contrib/notebook/common/notebookCommon';
21+
import { CellKind, CellUri, INotebookEditorModel, IProcessedOutput, NotebookCellMetadata, IInsetRenderOutput, ICellRange, INotebookKernelInfo2, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon';
2222
import { Webview } from 'vs/workbench/contrib/webview/browser/webview';
2323
import { ICompositeCodeEditor, IEditor } from 'vs/editor/common/editorCommon';
2424
import { NotImplementedError } from 'vs/base/common/errors';
@@ -397,16 +397,15 @@ export function withTestNotebook(instantiationService: TestInstantiationService,
397397

398398
const viewType = 'notebook';
399399
const editor = new TestNotebookEditor();
400-
const notebook = new NotebookTextModel(viewType, false, URI.parse('test'), undoRedoService, textModelService, modeService);
401-
notebook.initialize(cells.map(cell => {
400+
const notebook = new NotebookTextModel(viewType, false, URI.parse('test'), cells.map(cell => {
402401
return {
403402
source: cell[0],
404403
language: cell[1],
405404
cellKind: cell[2],
406405
outputs: cell[3],
407406
metadata: cell[4]
408407
};
409-
}));
408+
}), [], notebookDocumentMetadataDefaults, { transientMetadata: {}, transientOutputs: false }, undoRedoService, textModelService, modeService);
410409
const model = new NotebookEditorTestModel(notebook);
411410
const eventDispatcher = new NotebookEventDispatcher();
412411
const viewModel = new NotebookViewModel(viewType, model.notebook, eventDispatcher, null, instantiationService, blukEditService, undoRedoService);

0 commit comments

Comments
 (0)