Skip to content

Commit 99c6f91

Browse files
authored
Remove hardcoding of languages (#12341)
For #10496 Removed hardcode language to Python (derive from nb metadata if available) Removed some code/comments related to upstream VSC issues.
1 parent 86bd356 commit 99c6f91

File tree

4 files changed

+93
-35
lines changed

4 files changed

+93
-35
lines changed

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

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
NotebookCellOutputsChangeEvent,
1717
NotebookCellsChangeEvent
1818
} from '../../../common/application/types';
19-
import { MARKDOWN_LANGUAGE, PYTHON_LANGUAGE } from '../../../common/constants';
19+
import { MARKDOWN_LANGUAGE } from '../../../common/constants';
2020
import { traceError } from '../../../logging';
2121
import { INotebookModel } from '../../types';
2222
import { findMappedNotebookCellModel } from './cellMappers';
@@ -74,16 +74,6 @@ function clearCellOutput(change: NotebookCellOutputsChangeEvent, model: INoteboo
7474

7575
function changeCellLanguage(change: NotebookCellLanguageChangeEvent, model: INotebookModel) {
7676
const cellModel = findMappedNotebookCellModel(change.cell, model.cells);
77-
78-
// VSC fires event if changing cell language from markdown to markdown.
79-
// https://github.com/microsoft/vscode/issues/98836
80-
if (
81-
(change.language === PYTHON_LANGUAGE && cellModel.data.cell_type === 'code') ||
82-
(change.language === MARKDOWN_LANGUAGE && cellModel.data.cell_type === 'markdown')
83-
) {
84-
return;
85-
}
86-
8777
const cellData = createCellFrom(cellModel.data, change.language === MARKDOWN_LANGUAGE ? 'markdown' : 'code');
8878
// tslint:disable-next-line: no-any
8979
change.cell.outputs = createVSCCellOutputsFromOutputs(cellData.outputs as any);
@@ -97,19 +87,6 @@ function changeCellLanguage(change: NotebookCellLanguageChangeEvent, model: INot
9787
}
9888

9989
function handleChangesToCells(change: NotebookCellsChangeEvent, model: INotebookModel) {
100-
// For some reason VSC fires a change even when opening a document.
101-
// Ignore this https://github.com/microsoft/vscode/issues/98841
102-
if (
103-
change.changes.length === 1 &&
104-
change.changes[0].deletedCount === 0 &&
105-
change.changes[0].start === 0 &&
106-
change.changes[0].items.length === model.cells.length &&
107-
change.document.cells.length === model.cells.length
108-
) {
109-
// This is an event fired when a document is opened, we can safely ignore this.
110-
return;
111-
}
112-
11390
if (isCellMoveChange(change)) {
11491
handleCellMove(change, model);
11592
} else if (isCellDelete(change)) {

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
'use strict';
55

66
import { nbformat } from '@jupyterlab/coreutils';
7-
import * as assert from 'assert';
87
import * as uuid from 'uuid/v4';
98
import type {
109
CellDisplayOutput,
@@ -43,13 +42,14 @@ interface IBaseCellVSCodeMetadata {
4342
*/
4443
export function notebookModelToVSCNotebookData(model: INotebookModel): NotebookData {
4544
const cells = model.cells
46-
.map(createVSCNotebookCellDataFromCell)
45+
.map(createVSCNotebookCellDataFromCell.bind(undefined, model))
4746
.filter((item) => !!item)
4847
.map((item) => item!);
4948

49+
const defaultLangauge = getDefaultCodeLanguage(model);
5050
return {
5151
cells,
52-
languages: [PYTHON_LANGUAGE],
52+
languages: [defaultLangauge],
5353
metadata: {
5454
cellEditable: true,
5555
cellRunnable: true,
@@ -86,10 +86,7 @@ export function createCellFromVSCNotebookCell(vscCell: NotebookCell, model: INot
8686
state: CellState.init
8787
};
8888
}
89-
assert.equal(vscCell.language, PYTHON_LANGUAGE, 'Cannot create a non Python cell');
9089
return {
91-
// tslint:disable-next-line: no-suspicious-comment
92-
// TODO: #12068 Translate output into nbformat.IOutput.
9390
data: createCodeCell([vscCell.document.getText()], []),
9491
file: model.file.toString(),
9592
id: uuid(),
@@ -130,15 +127,22 @@ export function updateVSCNotebookCellMetadata(cellMetadata: NotebookCellMetadata
130127
});
131128
}
132129

133-
export function createVSCNotebookCellDataFromCell(cell: ICell): NotebookCellData | undefined {
130+
export function getDefaultCodeLanguage(model: INotebookModel) {
131+
return model.metadata?.language_info?.name &&
132+
model.metadata?.language_info?.name.toLowerCase() !== PYTHON_LANGUAGE.toLowerCase()
133+
? model.metadata?.language_info?.name
134+
: PYTHON_LANGUAGE;
135+
}
136+
137+
export function createVSCNotebookCellDataFromCell(model: INotebookModel, cell: ICell): NotebookCellData | undefined {
134138
if (cell.data.cell_type !== 'code' && cell.data.cell_type !== 'markdown') {
135139
traceError(`Conversion of Cell into VS Code NotebookCell not supported ${cell.data.cell_type}`);
136140
return;
137141
}
138142

139143
// tslint:disable-next-line: no-any
140144
const outputs = createVSCCellOutputsFromOutputs(cell.data.outputs as any);
141-
145+
const defaultCodeLanguage = getDefaultCodeLanguage(model);
142146
// If we have an execution count & no errors, then success state.
143147
// If we have an execution count & errors, then error state.
144148
// Else idle state.
@@ -160,7 +164,7 @@ export function createVSCNotebookCellDataFromCell(cell: ICell): NotebookCellData
160164
const notebookCellData: NotebookCellData = {
161165
cellKind:
162166
cell.data.cell_type === 'code' ? vscodeNotebookEnums.CellKind.Code : vscodeNotebookEnums.CellKind.Markdown,
163-
language: cell.data.cell_type === 'code' ? PYTHON_LANGUAGE : MARKDOWN_LANGUAGE,
167+
language: cell.data.cell_type === 'code' ? defaultCodeLanguage : MARKDOWN_LANGUAGE,
164168
metadata: {
165169
editable: true,
166170
executionOrder: typeof cell.data.execution_count === 'number' ? cell.data.execution_count : undefined,

src/client/datascience/notebook/notebookEditor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import { CellKind, ConfigurationTarget, Event, EventEmitter, Uri, WebviewPanel } from 'vscode';
77
import type { NotebookDocument } from 'vscode-proposed';
88
import { IApplicationShell, ICommandManager, IVSCodeNotebook } from '../../common/application/types';
9-
import { PYTHON_LANGUAGE } from '../../common/constants';
109
import { IConfigurationService } from '../../common/types';
1110
import { DataScience } from '../../common/utils/localize';
1211
import { noop } from '../../common/utils/misc';
@@ -22,6 +21,7 @@ import {
2221
InterruptResult,
2322
IStatusProvider
2423
} from '../types';
24+
import { getDefaultCodeLanguage } from './helpers/helpers';
2525
import { INotebookExecutionService } from './types';
2626

2727
export class NotebookEditor implements INotebookEditor {
@@ -112,9 +112,10 @@ export class NotebookEditor implements INotebookEditor {
112112
if (!this.vscodeNotebook.activeNotebookEditor) {
113113
return;
114114
}
115+
const defaultLanguage = getDefaultCodeLanguage(this.model);
115116
this.vscodeNotebook.activeNotebookEditor.edit((editor) => {
116117
const totalLength = this.document.cells.length;
117-
editor.insert(this.document.cells.length, '', PYTHON_LANGUAGE, CellKind.Code, [], undefined);
118+
editor.insert(this.document.cells.length, '', defaultLanguage, CellKind.Code, [], undefined);
118119
for (let i = totalLength - 1; i >= 0; i = i - 1) {
119120
editor.delete(i);
120121
}

src/test/datascience/notebook/contentProvider.unit.test.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,82 @@ suite('Data Science - NativeNotebook ContentProvider', () => {
9494
}
9595
]);
9696
});
97+
98+
test('Return notebook with csharp language', async () => {
99+
const model: Partial<INotebookModel> = {
100+
metadata: {
101+
language_info: {
102+
name: 'csharp'
103+
},
104+
orig_nbformat: 5
105+
},
106+
cells: [
107+
{
108+
data: {
109+
cell_type: 'code',
110+
execution_count: 10,
111+
hasExecutionOrder: true,
112+
outputs: [],
113+
source: 'Console.WriteLine("1")',
114+
metadata: {}
115+
},
116+
file: 'a.ipynb',
117+
id: 'MyCellId1',
118+
line: 0,
119+
state: CellState.init
120+
},
121+
{
122+
data: {
123+
cell_type: 'markdown',
124+
hasExecutionOrder: false,
125+
source: '# HEAD',
126+
metadata: {}
127+
},
128+
file: 'a.ipynb',
129+
id: 'MyCellId2',
130+
line: 0,
131+
state: CellState.init
132+
}
133+
]
134+
};
135+
when(storageProvider.load(anything())).thenResolve((model as unknown) as INotebookModel);
136+
137+
const notebook = await contentProvider.openNotebook(fileUri);
138+
139+
assert.isOk(notebook);
140+
assert.deepEqual(notebook.languages, ['csharp']);
141+
// ignore metadata we add.
142+
notebook.cells.forEach((cell) => delete cell.metadata.custom);
143+
144+
assert.deepEqual(notebook.cells, [
145+
{
146+
cellKind: (vscodeNotebookEnums as any).CellKind.Code,
147+
language: 'csharp',
148+
outputs: [],
149+
source: 'Console.WriteLine("1")',
150+
metadata: {
151+
editable: true,
152+
executionOrder: 10,
153+
hasExecutionOrder: true,
154+
runState: (vscodeNotebookEnums as any).NotebookCellRunState.Success,
155+
runnable: true
156+
}
157+
},
158+
{
159+
cellKind: (vscodeNotebookEnums as any).CellKind.Markdown,
160+
language: MARKDOWN_LANGUAGE,
161+
outputs: [],
162+
source: '# HEAD',
163+
metadata: {
164+
editable: true,
165+
executionOrder: undefined,
166+
hasExecutionOrder: false,
167+
runState: (vscodeNotebookEnums as any).NotebookCellRunState.Idle,
168+
runnable: false
169+
}
170+
}
171+
]);
172+
});
97173
test('Verify mime types and order', () => {
98174
// https://github.com/microsoft/vscode-python/issues/11880
99175
});

0 commit comments

Comments
 (0)