Skip to content

Commit ea45f0f

Browse files
committed
Add ILSPCodeExtractorsManager token
1 parent 4b1c47a commit ea45f0f

File tree

8 files changed

+90
-7
lines changed

8 files changed

+90
-7
lines changed

packages/jupyterlab-lsp/src/adapters/adapter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ export abstract class WidgetAdapter<T extends IDocumentWidget> {
124124
this.widget.disposed.connect(this.dispose, this);
125125
}
126126

127+
protected get foreign_code_extractors() {
128+
return this.extension.foreign_code_extractors;
129+
}
130+
127131
on_connection_closed(
128132
manager: DocumentConnectionManager,
129133
{ virtual_document }: IDocumentConnectionData

packages/jupyterlab-lsp/src/adapters/notebook/notebook.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { WidgetAdapter } from '../adapter';
22
import { Notebook, NotebookPanel } from '@jupyterlab/notebook';
33
import { until_ready } from '../../utils';
44
import { language_specific_overrides } from '../../magics/defaults';
5-
import { foreign_code_extractors } from '../../extractors/defaults';
65
import { Cell } from '@jupyterlab/cells';
76
import * as nbformat from '@jupyterlab/nbformat';
87
import ILanguageInfoMetadata = nbformat.ILanguageInfoMetadata;
@@ -162,7 +161,7 @@ export class NotebookAdapter extends WidgetAdapter<NotebookPanel> {
162161
language: this.language,
163162
path: this.document_path,
164163
overrides_registry: language_specific_overrides,
165-
foreign_code_extractors: foreign_code_extractors,
164+
foreign_code_extractors: this.foreign_code_extractors,
166165
file_extension: this.language_file_extension,
167166
// notebooks are continuous, each cell is dependent on the previous one
168167
standalone: false,

packages/jupyterlab-lsp/src/editor_integration/testutils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ import { ServiceManager } from '@jupyterlab/services';
4444
import { FeatureManager, ILSPExtension } from '../index';
4545
import { JupyterFrontEnd } from '@jupyterlab/application';
4646
import { IFeatureSettings } from '../feature';
47+
import { IForeignCodeExtractorsRegistry } from "../extractors/types";
48+
import { foreign_code_extractors } from "../extractors/defaults";
4749

4850
export interface ITestEnvironment {
4951
document_options: VirtualDocument.IOptions;
@@ -88,6 +90,7 @@ export class MockExtension implements ILSPExtension {
8890
language_server_manager: LanguageServerManager;
8991
feature_manager: ILSPFeatureManager;
9092
editor_type_manager: ILSPVirtualEditorManager;
93+
foreign_code_extractors: IForeignCodeExtractorsRegistry;
9194

9295
constructor() {
9396
this.app = null;
@@ -102,6 +105,7 @@ export class MockExtension implements ILSPExtension {
102105
name: 'CodeMirrorEditor',
103106
supports: CodeMirrorEditor
104107
});
108+
this.foreign_code_extractors = foreign_code_extractors;
105109
}
106110
}
107111

packages/jupyterlab-lsp/src/extractors/defaults.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {
55
rpy2_args_pattern,
66
RPY2_MAX_ARGS
77
} from '../magics/rpy2';
8+
import { JupyterFrontEndPlugin } from "@jupyterlab/application";
9+
import { ILSPCodeExtractorsManager, PLUGIN_ID } from "../tokens";
810

911
function rpy2_code_extractor(match: string, ...args: string[]) {
1012
let r = extract_r_args(args, -3);
@@ -123,3 +125,16 @@ export let foreign_code_extractors: IForeignCodeExtractorsRegistry = {
123125
})
124126
]
125127
};
128+
129+
export const DEFAULT_CODE_EXTRACTORS: JupyterFrontEndPlugin<void> = {
130+
id: PLUGIN_ID + ':default-extractors',
131+
requires: [ILSPCodeExtractorsManager],
132+
activate: (app, extractors_manager: ILSPCodeExtractorsManager) => {
133+
for (let language of Object.keys(foreign_code_extractors)) {
134+
for (let extractor of foreign_code_extractors[language]) {
135+
extractors_manager.register(extractor, language);
136+
}
137+
}
138+
},
139+
autoStart: true
140+
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { JupyterFrontEndPlugin } from "@jupyterlab/application";
2+
import { ILSPCodeExtractorsManager } from "../tokens";
3+
import { IForeignCodeExtractor, IForeignCodeExtractorsRegistry } from "./types";
4+
5+
export class CodeExtractorsManager implements ILSPCodeExtractorsManager {
6+
registry: IForeignCodeExtractorsRegistry;
7+
8+
constructor() {
9+
this.registry = {};
10+
}
11+
12+
register(extractor: IForeignCodeExtractor, host_language: string): void {
13+
if (!this.registry.hasOwnProperty(host_language)) {
14+
this.registry[host_language] = [];
15+
}
16+
this.registry[host_language].push(extractor)
17+
}
18+
19+
}
20+
21+
export const CODE_EXTRACTORS_MANAGER: JupyterFrontEndPlugin<ILSPCodeExtractorsManager> = {
22+
id: ILSPCodeExtractorsManager.name,
23+
requires: [],
24+
activate: (app) => {
25+
return new CodeExtractorsManager();
26+
},
27+
provides: ILSPCodeExtractorsManager,
28+
autoStart: true
29+
};

packages/jupyterlab-lsp/src/extractors/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export interface IExtractedCode {
4040
*/
4141
export interface IForeignCodeExtractor {
4242
/**
43-
* The foreign language.
43+
* The foreign language. TODO what is language, what is host language, ILanguageInfo
4444
*/
4545
language: string;
4646

packages/jupyterlab-lsp/src/index.ts

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { IStatusBar } from '@jupyterlab/statusbar';
1313
import { LSPStatus } from './components/statusbar';
1414
import { DocumentConnectionManager } from './connection_manager';
1515
import {
16-
ILSPAdapterManager,
16+
ILSPAdapterManager, ILSPCodeExtractorsManager,
1717
ILSPFeatureManager,
1818
ILSPVirtualEditorManager,
1919
PLUGIN_ID,
@@ -35,6 +35,8 @@ import { LabIcon } from '@jupyterlab/ui-components';
3535
import codeCheckSvg from '../style/icons/code-check.svg';
3636
import { DIAGNOSTICS_PLUGIN } from './features/diagnostics';
3737
import { COMPLETION_PLUGIN } from './features/completion';
38+
import { CODE_EXTRACTORS_MANAGER } from "./extractors/manger";
39+
import { IForeignCodeExtractorsRegistry } from "./extractors/types";
3840

3941
export const codeCheckIcon = new LabIcon({
4042
name: 'lsp:codeCheck',
@@ -98,6 +100,7 @@ export interface ILSPExtension {
98100
language_server_manager: LanguageServerManager;
99101
feature_manager: ILSPFeatureManager;
100102
editor_type_manager: ILSPVirtualEditorManager;
103+
foreign_code_extractors: IForeignCodeExtractorsRegistry;
101104
}
102105

103106
export class LSPExtension implements ILSPExtension {
@@ -113,7 +116,8 @@ export class LSPExtension implements ILSPExtension {
113116
paths: IPaths,
114117
status_bar: IStatusBar,
115118
adapterManager: ILSPAdapterManager,
116-
public editor_type_manager: ILSPVirtualEditorManager
119+
public editor_type_manager: ILSPVirtualEditorManager,
120+
private code_extractors_manager: ILSPCodeExtractorsManager
117121
) {
118122
this.language_server_manager = new LanguageServerManager({});
119123
this.connection_manager = new DocumentConnectionManager({
@@ -165,6 +169,10 @@ export class LSPExtension implements ILSPExtension {
165169
});
166170
}
167171

172+
get foreign_code_extractors () {
173+
return this.code_extractors_manager.registry;
174+
}
175+
168176
private updateOptions(settings: ISettingRegistry.ISettings) {
169177
const options = settings.composite;
170178

@@ -186,7 +194,8 @@ const plugin: JupyterFrontEndPlugin<ILSPFeatureManager> = {
186194
IPaths,
187195
IStatusBar,
188196
ILSPAdapterManager,
189-
ILSPVirtualEditorManager
197+
ILSPVirtualEditorManager,
198+
ILSPCodeExtractorsManager
190199
],
191200
activate: (app, ...args) => {
192201
let extension = new LSPExtension(
@@ -198,7 +207,8 @@ const plugin: JupyterFrontEndPlugin<ILSPFeatureManager> = {
198207
IPaths,
199208
IStatusBar,
200209
ILSPAdapterManager,
201-
ILSPVirtualEditorManager
210+
ILSPVirtualEditorManager,
211+
ILSPCodeExtractorsManager
202212
])
203213
);
204214
return extension.feature_manager;
@@ -218,6 +228,7 @@ const default_features: JupyterFrontEndPlugin<void>[] = [
218228
];
219229

220230
const plugins: JupyterFrontEndPlugin<any>[] = [
231+
CODE_EXTRACTORS_MANAGER,
221232
WIDGET_ADAPTER_MANAGER,
222233
NOTEBOOK_ADAPTER,
223234
FILE_EDITOR_ADAPTER,

packages/jupyterlab-lsp/src/tokens.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
IContextMenuOptions
1818
} from './command_manager';
1919
import IEditor = CodeEditor.IEditor;
20+
import { IForeignCodeExtractor, IForeignCodeExtractorsRegistry } from "./extractors/types";
2021

2122
export type TLanguageServerId = string;
2223
export type TLanguageId = string;
@@ -157,6 +158,22 @@ export interface ILSPVirtualEditorManager {
157158
): IVirtualEditorType<any>;
158159
}
159160

161+
162+
/**
163+
* Manages code transclusion plugins.
164+
*/
165+
export interface ILSPCodeExtractorsManager {
166+
/**
167+
* Global registry of the foreign code extractors.
168+
*/
169+
registry: IForeignCodeExtractorsRegistry;
170+
171+
/**
172+
* Register the extraction rules to be applied in documents with language `host_language`.
173+
*/
174+
register(extractor: IForeignCodeExtractor, host_language: string): void
175+
}
176+
160177
export const PLUGIN_ID = '@krassowski/jupyterlab-lsp';
161178

162179
export const ILSPFeatureManager = new Token<ILSPFeatureManager>(
@@ -170,3 +187,7 @@ export const ILSPAdapterManager = new Token<ILSPAdapterManager>(
170187
export const ILSPVirtualEditorManager = new Token<ILSPVirtualEditorManager>(
171188
PLUGIN_ID + ':ILSPVirtualEditorManager'
172189
);
190+
191+
export const ILSPCodeExtractorsManager = new Token<ILSPCodeExtractorsManager>(
192+
PLUGIN_ID + ':ILSPCodeExtractorsManager'
193+
);

0 commit comments

Comments
 (0)