Add notebook extension support for .NET Interactive. (#18334)

* Also updated kernel dropdown to only include SQL aliased kernels when using SQL notebook provider.
This commit is contained in:
Cory Rivera
2022-02-25 11:58:59 -08:00
committed by GitHub
parent 02341088eb
commit ffdefd3b52
41 changed files with 649 additions and 278 deletions

View File

@@ -12,7 +12,12 @@
<div #editor class="editor"></div>
</div>
</div>
<collapse-component *ngIf="cellModel.cellType === 'code' && cellModel.source && cellModel.source.length > 1" [cellModel]="cellModel" [activeCellId]="activeCellId"></collapse-component>
<div style="display: flex; flex-flow: row; justify-content: flex-end;">
<collapse-component *ngIf="cellModel.cellType === 'code' && cellModel.source && cellModel.source.length > 1" [cellModel]="cellModel" [activeCellId]="activeCellId"></collapse-component>
<div #cellLanguage class="cellLanguage" *ngIf="cellModel.cellType === 'code' && cellModel.language">
{{cellModel.displayLanguage}}
</div>
</div>
<div #parameter class="parameter" *ngIf="cellModel.cellType === 'code' && cellModel.isParameter">
<span>{{parametersText}}</span>
</div>

View File

@@ -48,6 +48,7 @@ const DEFAULT_OR_LOCAL_CONTEXT_ID = '-1';
export class CodeComponent extends CellView implements OnInit, OnChanges {
@ViewChild('toolbar', { read: ElementRef }) private toolbarElement: ElementRef;
@ViewChild('editor', { read: ElementRef }) private codeElement: ElementRef;
@ViewChild('cellLanguage', { read: ElementRef }) private languageElement: ElementRef;
public get cellModel(): ICellModel {
return this._cellModel;
@@ -265,6 +266,12 @@ export class CodeComponent extends CellView implements OnInit, OnChanges {
this.setFocusAndScroll();
}
}));
this._register(this.cellModel.onLanguageChanged(language => {
let nativeElement = <HTMLElement>this.languageElement.nativeElement;
nativeElement.innerText = this.cellModel.displayLanguage;
this.updateLanguageMode();
this._changeRef.detectChanges();
}));
this._register(this.cellModel.onCollapseStateChanged(isCollapsed => {
this.onCellCollapse(isCollapsed);
}));
@@ -379,8 +386,6 @@ export class CodeComponent extends CellView implements OnInit, OnChanges {
this.cellModel.setOverrideLanguage(magic.language);
this.updateLanguageMode();
}
} else {
this.cellModel.setOverrideLanguage(undefined);
}
}
} catch (err) {

View File

@@ -98,6 +98,10 @@ code-component .carbon-taskbar .codicon.hideIcon.execCountHundred {
margin-left: -6px;
}
code-component collapse-component {
flex-grow: 1;
}
code-component .hide-component-button {
height: 16px;
width: 100%;
@@ -106,6 +110,15 @@ code-component .hide-component-button {
background-repeat: no-repeat;
background-position: center;
background-color: transparent;
margin-top: 4px;
margin-bottom: 4px;
}
code-component .cellLanguage {
padding: 2px 15px;
display: inline-block;
text-align: center;
font-size: 16px;
}
code-component .parameter {

View File

@@ -40,6 +40,7 @@ import { LocalContentManager } from 'sql/workbench/services/notebook/common/loca
import { Registry } from 'vs/platform/registry/common/platform';
import { Extensions as LanguageAssociationExtensions, ILanguageAssociationRegistry } from 'sql/workbench/services/languageAssociation/common/languageAssociation';
import { NotebookLanguage } from 'sql/workbench/common/constants';
import { DotnetInteractiveLabel, DotnetInteractiveJupyterLabelPrefix, DotnetInteractiveJupyterLanguagePrefix, DotnetInteractiveLanguagePrefix } from 'sql/workbench/api/common/notebooks/notebookUtils';
export type ModeViewSaveHandler = (handle: number) => Thenable<boolean>;
const languageAssociationRegistry = Registry.as<ILanguageAssociationRegistry>(LanguageAssociationExtensions.LanguageAssociations);
@@ -351,7 +352,8 @@ export abstract class NotebookInput extends EditorInput implements INotebookInpu
connectionProviderIds: kernel.connectionProviderIds,
name: kernel.name,
displayName: kernel.displayName,
notebookProvider: kernel.notebookProvider
notebookProvider: kernel.notebookProvider,
supportedLanguages: kernel.supportedLanguages
});
});
}
@@ -540,6 +542,26 @@ export class NotebookEditorContentLoader implements IContentLoader {
async loadContent(): Promise<azdata.nb.INotebookContents> {
let notebookEditorModel = await this.notebookInput.resolve();
return this.contentManager.deserializeNotebook(notebookEditorModel.contentString);
let notebookContents = await this.contentManager.deserializeNotebook(notebookEditorModel.contentString);
// Special case .NET Interactive kernel spec to handle inconsistencies between notebook providers and jupyter kernel specs
if (notebookContents.metadata?.kernelspec?.display_name?.startsWith(DotnetInteractiveJupyterLabelPrefix)) {
notebookContents.metadata.kernelspec.oldDisplayName = notebookContents.metadata.kernelspec.display_name;
notebookContents.metadata.kernelspec.display_name = DotnetInteractiveLabel;
let kernelName = notebookContents.metadata.kernelspec.name;
let baseLanguageName = kernelName.replace(DotnetInteractiveJupyterLanguagePrefix, '');
if (baseLanguageName === 'powershell') {
baseLanguageName = 'pwsh';
}
let languageName = `${DotnetInteractiveLanguagePrefix}${baseLanguageName}`;
notebookContents.metadata.kernelspec.oldLanguage = notebookContents.metadata.kernelspec.language;
notebookContents.metadata.kernelspec.language = languageName;
notebookContents.metadata.language_info.oldName = notebookContents.metadata.language_info.name;
notebookContents.metadata.language_info.name = languageName;
}
return notebookContents;
}
}

View File

@@ -410,7 +410,9 @@ registerComponentType({
mimeTypes: [
'text/plain',
'application/vnd.jupyter.stdout',
'application/vnd.jupyter.stderr'
'application/vnd.jupyter.stderr',
'application/vnd.code.notebook.stdout',
'application/vnd.code.notebook.stderr'
],
rank: 120,
safe: true,
@@ -418,6 +420,19 @@ registerComponentType({
selector: MimeRendererComponent.SELECTOR
});
/**
* A mime renderer component for VS Code Notebook error data.
*/
registerComponentType({
mimeTypes: [
'application/vnd.code.notebook.error'
],
rank: 121,
safe: true,
ctor: MimeRendererComponent,
selector: MimeRendererComponent.SELECTOR
});
/**
* A placeholder component for deprecated rendered JavaScript.
*/