Remove languages property from NotebookData and NotebookDocument

This commit is contained in:
Johannes Rieken 2021-02-11 14:21:40 +01:00
parent 474e769014
commit ccc28e3726
15 changed files with 22 additions and 91 deletions

View file

@ -1468,7 +1468,13 @@ suite('regression', () => {
assert.strictEqual(vscode.window.activeNotebookEditor !== undefined, true, 'notebook first');
assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.document.getText(), 'var abc = 0;');
assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.language, 'typescript');
// todo@jrieken enforce a kernel (how) and test that its language is picked
// assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.language, 'typescript');
// no kernel -> no default language
assert.strictEqual(vscode.window.activeNotebookEditor!.kernel, undefined);
assert.strictEqual(vscode.window.activeNotebookEditor!.selection?.language, 'plaintext');
await vscode.commands.executeCommand('vscode.openWith', resource, 'default');
assert.strictEqual(vscode.window.activeTextEditor?.document.uri.path, resource.path);

View file

@ -23,7 +23,6 @@ export function smokeTestActivate(context: vscode.ExtensionContext): any {
context.subscriptions.push(vscode.notebook.registerNotebookContentProvider('notebookSmokeTest', {
openNotebook: async (_resource: vscode.Uri) => {
const dto: vscode.NotebookData = {
languages: ['typescript'],
metadata: {},
cells: [
{

View file

@ -10,17 +10,15 @@ export function activate(context: vscode.ExtensionContext): any {
smokeTestActivate(context);
context.subscriptions.push(vscode.notebook.registerNotebookContentProvider('notebookCoreTest', {
openNotebook: async (_resource: vscode.Uri) => {
openNotebook: async (_resource: vscode.Uri): Promise<vscode.NotebookData> => {
if (/.*empty\-.*\.vsctestnb$/.test(_resource.path)) {
return {
languages: ['typescript'],
metadata: {},
cells: []
};
}
const dto: vscode.NotebookData = {
languages: ['typescript'],
metadata: {
custom: { testMetadata: false }
},
@ -36,7 +34,6 @@ export function activate(context: vscode.ExtensionContext): any {
}
]
};
return dto;
},
resolveNotebook: async (_document: vscode.NotebookDocument) => {
@ -60,6 +57,7 @@ export function activate(context: vscode.ExtensionContext): any {
id: 'mainKernel',
label: 'Notebook Test Kernel',
isPreferred: true,
supportedLanguages: ['typescript'],
executeAllCells: async (_document: vscode.NotebookDocument) => {
const edit = new vscode.WorkspaceEdit();
@ -98,6 +96,7 @@ export function activate(context: vscode.ExtensionContext): any {
id: 'secondaryKernel',
label: 'Notebook Secondary Test Kernel',
isPreferred: false,
supportedLanguages: ['typescript'],
executeAllCells: async (_document: vscode.NotebookDocument) => {
const edit = new vscode.WorkspaceEdit();
edit.replaceNotebookCellOutput(_document.uri, 0, [new vscode.NotebookCellOutput([

View file

@ -1080,11 +1080,6 @@ declare module 'vscode' {
* When false, insecure outputs like HTML, JavaScript, SVG will not be rendered.
*/
trusted?: boolean;
/**
* Languages the document supports
*/
languages?: string[];
}
export interface NotebookDocumentContentOptions {
@ -1110,10 +1105,6 @@ declare module 'vscode' {
readonly isUntitled: boolean;
readonly cells: ReadonlyArray<NotebookCell>;
readonly contentOptions: NotebookDocumentContentOptions;
// todo@API
// - move to kernel -> control runnable state of a cell
// - remove from this type
languages: string[];
readonly metadata: NotebookDocumentMetadata;
}
@ -1258,7 +1249,6 @@ declare module 'vscode' {
export interface NotebookData {
readonly cells: NotebookCellData[];
readonly languages: string[];
readonly metadata: NotebookDocumentMetadata;
}
@ -1583,6 +1573,7 @@ declare module 'vscode' {
isPreferred?: boolean;
preloads?: Uri[];
// TODO@API control runnable state of cell
/**
* languages supported by kernel
* - first is preferred

View file

@ -460,7 +460,6 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
viewOptions: options.viewOptions,
reloadNotebook: async (mainthreadTextModel: NotebookTextModel) => {
const data = await this._proxy.$resolveNotebookData(viewType, mainthreadTextModel.uri);
mainthreadTextModel.updateLanguages(data.languages);
mainthreadTextModel.metadata = data.metadata;
mainthreadTextModel.transientOptions = contentOptions;
@ -587,12 +586,6 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo
entry?.emitter.fire(uriComponents ? URI.revive(uriComponents) : undefined);
}
async $updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise<void> {
this.logService.debug('MainThreadNotebooks#updateNotebookLanguages', resource.path, languages);
const textModel = this._notebookService.getNotebookTextModel(URI.from(resource));
textModel?.updateLanguages(languages);
}
async $postMessage(editorId: string, forRendererId: string | undefined, value: any): Promise<boolean> {
const editor = this._notebookService.getNotebookEditor(editorId) as INotebookEditor | undefined;
if (editor?.isNotebookEditor) {

View file

@ -789,7 +789,6 @@ export interface MainThreadNotebookShape extends IDisposable {
$unregisterNotebookKernelProvider(handle: number): Promise<void>;
$onNotebookKernelChange(handle: number, uri: UriComponents | undefined): void;
$tryApplyEdits(viewType: string, resource: UriComponents, modelVersionId: number, edits: ICellEditOperation[]): Promise<boolean>;
$updateNotebookLanguages(viewType: string, resource: UriComponents, languages: string[]): Promise<void>;
$postMessage(editorId: string, forRendererId: string | undefined, value: any): Promise<boolean>;
$setStatusBarEntry(id: number, statusBarEntry: INotebookCellStatusBarEntryDto): Promise<void>;
$tryOpenDocument(uriComponents: UriComponents, viewType?: string): Promise<URI>;

View file

@ -454,7 +454,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
...notebookDocumentMetadataDefaults,
...data.metadata
},
languages: data.languages,
cells: data.cells.map(typeConverters.NotebookCellData.from),
};
}
@ -707,7 +706,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
}
const that = this;
const document = new ExtHostNotebookDocument(this._proxy, this._documentsAndEditors, {
const document = new ExtHostNotebookDocument(this._documentsAndEditors, {
emitModelChange(event: vscode.NotebookCellsChangeEvent): void {
that._onDidChangeNotebookCells.fire(event);
},

View file

@ -10,7 +10,7 @@ import { Schemas } from 'vs/base/common/network';
import { joinPath } from 'vs/base/common/resources';
import { ISplice } from 'vs/base/common/sequence';
import { URI } from 'vs/base/common/uri';
import { CellKind, INotebookDocumentPropertiesChangeData, MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol';
import { CellKind, INotebookDocumentPropertiesChangeData } from 'vs/workbench/api/common/extHost.protocol';
import { ExtHostDocumentsAndEditors, IExtHostModelAddedData } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
import * as extHostTypeConverters from 'vs/workbench/api/common/extHostTypeConverters';
import { IMainCellDto, IOutputDto, NotebookCellMetadata, NotebookCellsChangedEventDto, NotebookCellsChangeType, NotebookCellsSplice2, notebookDocumentMetadataDefaults } from 'vs/workbench/contrib/notebook/common/notebookCommon';
@ -144,10 +144,8 @@ export class ExtHostNotebookDocument extends Disposable {
private _backupCounter = 1;
private _backup?: vscode.NotebookDocumentBackup;
private _disposed = false;
private _languages: string[] = [];
constructor(
private readonly _proxy: MainThreadNotebookShape,
private readonly _documentsAndEditors: ExtHostDocumentsAndEditors,
private readonly _emitter: INotebookEventEmitter,
private readonly _viewType: string,
@ -177,8 +175,6 @@ export class ExtHostNotebookDocument extends Disposable {
get isDirty() { return that._isDirty; },
get isUntitled() { return that.uri.scheme === Schemas.untitled; },
get cells(): ReadonlyArray<vscode.NotebookCell> { return that._cells.map(cell => cell.cell); },
get languages() { return that._languages; },
set languages(value: string[]) { that._trySetLanguages(value); },
get metadata() { return that._metadata; },
set metadata(_value: Required<vscode.NotebookDocumentMetadata>) { throw new Error('Use WorkspaceEdit to update metadata.'); },
get contentOptions() { return that._contentOptions; }
@ -187,11 +183,6 @@ export class ExtHostNotebookDocument extends Disposable {
return this._notebook;
}
private _trySetLanguages(newLanguages: string[]) {
this._languages = newLanguages;
this._proxy.$updateNotebookLanguages(this._viewType, this.uri, this._languages);
}
getNewBackupUri(): URI {
if (!this._storagePath) {
throw new Error('Backup requires a valid storage path');

View file

@ -735,13 +735,13 @@ export class NotebookService extends Disposable implements INotebookService, ICu
const dataDto = await provider.controller.resolveNotebookDocument(viewType, uri, backupId);
let cells = dataDto.data.cells.length ? dataDto.data.cells : (uri.scheme === Schemas.untitled ? [{
cellKind: CellKind.Code,
language: dataDto.data.languages.length ? dataDto.data.languages[0] : '',
language: 'plaintext', //TODO@jrieken unsure what this is
outputs: [],
metadata: undefined,
source: ''
}] : []);
notebookModel = this._instantiationService.createInstance(NotebookTextModel, viewType, provider.controller.supportBackup, uri, cells, dataDto.data.languages, dataDto.data.metadata, dataDto.transientOptions);
notebookModel = this._instantiationService.createInstance(NotebookTextModel, viewType, provider.controller.supportBackup, uri, cells, dataDto.data.metadata, dataDto.transientOptions);
}
// new notebook model created

View file

@ -12,7 +12,6 @@ import { ITextSnapshot } from 'vs/editor/common/model';
import { IUndoRedoService, UndoRedoElementType, IUndoRedoElement, IResourceUndoRedoElement, UndoRedoGroup, IWorkspaceUndoRedoElement } from 'vs/platform/undoRedo/common/undoRedo';
import { MoveCellEdit, SpliceCellsEdit, CellMetadataEdit } from 'vs/workbench/contrib/notebook/common/model/cellEdit';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { IModeService } from 'vs/editor/common/services/modeService';
import { ISequence, LcsDiff } from 'vs/base/common/diff/diff';
import { hash } from 'vs/base/common/hash';
import { NotebookCellOutputTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellOutputTextModel';
@ -27,7 +26,7 @@ export class NotebookTextModelSnapshot implements ITextSnapshot {
if (this._index === -1) {
this._index++;
return `{ "metadata": ${JSON.stringify(this._model.metadata)}, "languages": ${JSON.stringify(this._model.languages)}, "cells": [`;
return `{ "metadata": ${JSON.stringify(this._model.metadata)}, "cells": [`;
}
if (this._index < this._model.cells.length) {
@ -213,21 +212,6 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
private _mapping: Map<number, NotebookCellTextModel> = new Map();
private _cellListeners: Map<number, IDisposable> = new Map();
private _cells: NotebookCellTextModel[] = [];
private _languages: string[] = [];
private _allLanguages: boolean = false;
get languages() {
return this._languages;
}
/** @deprecated */
private get _resolvedLanguages() {
if (this._allLanguages) {
return this._modeService.getRegisteredModes();
}
return this._languages;
}
metadata: NotebookDocumentMetadata = notebookDocumentMetadataDefaults;
transientOptions: TransientOptions = { transientMetadata: {}, transientOutputs: false };
@ -248,17 +232,14 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
readonly supportBackup: boolean,
readonly uri: URI,
cells: ICellDto2[],
languages: string[],
metadata: NotebookDocumentMetadata,
options: TransientOptions,
@IUndoRedoService private _undoService: IUndoRedoService,
@ITextModelService private _modelService: ITextModelService,
@IModeService private readonly _modeService: IModeService,
) {
super();
this.transientOptions = options;
this.metadata = metadata;
this.updateLanguages(metadata.languages && metadata.languages.length ? metadata.languages : languages);
this._initialize(cells);
this._eventEmitter = new DelayedEmitter(
@ -452,17 +433,6 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
this._versionId = this._versionId + 1;
}
updateLanguages(languages: string[]) {
const allLanguages = languages.find(lan => lan === '*');
this._allLanguages = allLanguages !== undefined;
this._languages = languages;
const resolvedLanguages = this._resolvedLanguages;
if (resolvedLanguages.length && this._cells.length) {
this._cells[0].language = resolvedLanguages[0];
}
}
private _isDocumentMetadataChangeTransient(a: NotebookDocumentMetadata, b: NotebookDocumentMetadata) {
const keys = new Set([...Object.keys(a || {}), ...Object.keys(b || {})]);
for (let key of keys) {
@ -478,10 +448,6 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
const oldMetadata = this.metadata;
this.metadata = metadata;
if (this.metadata.languages && this.metadata.languages.length) {
this.updateLanguages(this.metadata.languages);
}
if (computeUndoRedo) {
const that = this;
this._operationManager.pushEditOperation(new class implements IResourceUndoRedoElement {

View file

@ -67,7 +67,6 @@ export const notebookDocumentMetadataDefaults: Required<NotebookDocumentMetadata
displayOrder: NOTEBOOK_DISPLAY_ORDER,
custom: {},
runState: NotebookRunState.Idle,
languages: [],
trusted: true
};
@ -80,7 +79,6 @@ export interface NotebookDocumentMetadata {
displayOrder?: (string | glob.IRelativePattern)[];
custom?: { [key: string]: unknown };
runState?: NotebookRunState;
languages: string[];
trusted: boolean;
}
@ -190,8 +188,6 @@ export interface INotebookTextModel {
readonly uri: URI;
readonly versionId: number;
/** @deprecated */
languages: string[];
readonly cells: readonly ICell[];
onWillDispose(listener: () => void): IDisposable;
}
@ -375,7 +371,6 @@ export type ICellEditOperation = ICellReplaceEdit | ICellOutputEdit | ICellMetad
export interface NotebookDataDto {
readonly cells: ICellDto2[];
readonly languages: string[];
readonly metadata: NotebookDocumentMetadata;
}

View file

@ -88,7 +88,6 @@ class MirrorNotebookDocument {
constructor(
readonly uri: URI,
public cells: MirrorCell[],
public languages: string[],
public metadata: NotebookDocumentMetadata,
) {
}
@ -175,7 +174,7 @@ export class NotebookEditorSimpleWorker implements IRequestHandler, IDisposable
dto.cellKind,
dto.outputs,
dto.metadata
)), data.languages, data.metadata);
)), data.metadata);
}
public acceptModelChanged(strURL: string, event: NotebookCellsChangedEventDto) {
@ -266,4 +265,3 @@ export class NotebookEditorSimpleWorker implements IRequestHandler, IDisposable
export function create(host: EditorWorkerHost): IRequestHandler {
return new NotebookEditorSimpleWorker();
}

View file

@ -107,7 +107,6 @@ export class NotebookEditorModelManager extends Disposable {
outputs: cell.outputs.map(op => ({ outputId: op.outputId, outputs: op.outputs })),
metadata: cell.metadata
})),
languages: model.languages,
metadata: model.metadata
}
);

View file

@ -15,17 +15,15 @@ import { NotebookEventDispatcher } from 'vs/workbench/contrib/notebook/browser/v
import { TrackedRangeStickiness } from 'vs/editor/common/model';
import { reduceCellRanges } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { IModeService } from 'vs/editor/common/services/modeService';
suite('NotebookViewModel', () => {
const instantiationService = setupInstantiationService();
const textModelService = instantiationService.get(ITextModelService);
const blukEditService = instantiationService.get(IBulkEditService);
const undoRedoService = instantiationService.get(IUndoRedoService);
const modeService = instantiationService.get(IModeService);
test('ctor', function () {
const notebook = new NotebookTextModel('notebook', false, URI.parse('test'), [], [], notebookDocumentMetadataDefaults, { transientMetadata: {}, transientOutputs: false }, undoRedoService, textModelService, modeService);
const notebook = new NotebookTextModel('notebook', false, URI.parse('test'), [], notebookDocumentMetadataDefaults, { transientMetadata: {}, transientOutputs: false }, undoRedoService, textModelService);
const model = new NotebookEditorTestModel(notebook);
const eventDispatcher = new NotebookEventDispatcher();
const viewModel = new NotebookViewModel('notebook', model.notebook, eventDispatcher, null, instantiationService, blukEditService, undoRedoService);
@ -156,7 +154,7 @@ suite('NotebookViewModel', () => {
['var e = 5;', 'javascript', CellKind.Code, [], { editable: false, runnable: false }],
],
(editor, viewModel) => {
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: true, cellEditable: true, cellHasExecutionOrder: true, trusted: true, languages: [] };
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: true, cellEditable: true, cellHasExecutionOrder: true, trusted: true };
const defaults = { hasExecutionOrder: true };
@ -190,7 +188,7 @@ suite('NotebookViewModel', () => {
...defaults
});
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: true, cellHasExecutionOrder: true, trusted: true, languages: [] };
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: true, cellHasExecutionOrder: true, trusted: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), <NotebookCellMetadata>{
editable: true,
@ -222,7 +220,7 @@ suite('NotebookViewModel', () => {
...defaults
});
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: false, cellHasExecutionOrder: true, trusted: true, languages: [] };
viewModel.notebookDocument.metadata = { editable: true, runnable: true, cellRunnable: false, cellEditable: false, cellHasExecutionOrder: true, trusted: true };
assert.deepEqual(viewModel.viewCells[0].getEvaluatedMetadata(viewModel.metadata), <NotebookCellMetadata>{
editable: false,

View file

@ -34,7 +34,6 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService';
import { ScrollEvent } from 'vs/base/common/scrollable';
import { IModeService } from 'vs/editor/common/services/modeService';
import { IFileStatWithMetadata } from 'vs/platform/files/common/files';
export class TestCell extends NotebookCellTextModel {
@ -423,7 +422,6 @@ export function setupInstantiationService() {
export function withTestNotebook(instantiationService: TestInstantiationService, blukEditService: IBulkEditService, undoRedoService: IUndoRedoService, cells: [string, string, CellKind, IOutputDto[], NotebookCellMetadata][], callback: (editor: TestNotebookEditor, viewModel: NotebookViewModel, textModel: NotebookTextModel) => void) {
const textModelService = instantiationService.get(ITextModelService);
const modeService = instantiationService.get(IModeService);
const viewType = 'notebook';
const editor = new TestNotebookEditor();
@ -435,7 +433,7 @@ export function withTestNotebook(instantiationService: TestInstantiationService,
outputs: cell[3],
metadata: cell[4]
};
}), [], notebookDocumentMetadataDefaults, { transientMetadata: {}, transientOutputs: false }, undoRedoService, textModelService, modeService);
}), notebookDocumentMetadataDefaults, { transientMetadata: {}, transientOutputs: false }, undoRedoService, textModelService);
const model = new NotebookEditorTestModel(notebook);
const eventDispatcher = new NotebookEventDispatcher();
const viewModel = new NotebookViewModel(viewType, model.notebook, eventDispatcher, null, instantiationService, blukEditService, undoRedoService);