Skip to content

Commit fc94baf

Browse files
committed
Move rendering to renderer
1 parent 0a04a77 commit fc94baf

File tree

3 files changed

+55
-33
lines changed

3 files changed

+55
-33
lines changed

packages/jupyterlab-lsp/src/features/completion/completion.ts

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { ILSPAdapterManager, ILSPLogConsole } from '../../tokens';
2020
import { NotebookAdapter } from '../../adapters/notebook/notebook';
2121
import { ILSPCompletionThemeManager } from '@krassowski/completion-theme/lib/types';
2222
import { LSPCompletionRenderer } from './renderer';
23-
import { IRenderMime, IRenderMimeRegistry } from '@jupyterlab/rendermime';
23+
import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
2424

2525
export class CompletionCM extends CodeMirrorIntegration {
2626
private _completionCharacters: string[];
@@ -80,7 +80,6 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
8080
protected current_completion_handler: CompletionHandler;
8181
protected current_adapter: WidgetAdapter<IDocumentWidget> = null;
8282
protected renderer: LSPCompletionRenderer;
83-
private markdown_renderer: IRenderMime.IRenderer;
8483

8584
constructor(
8685
private app: JupyterFrontEnd,
@@ -91,7 +90,14 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
9190
private console: ILSPLogConsole,
9291
private renderMimeRegistry: IRenderMimeRegistry
9392
) {
94-
this.renderer = new LSPCompletionRenderer({ integrator: this });
93+
const markdown_renderer = this.renderMimeRegistry.createRenderer(
94+
'text/markdown'
95+
);
96+
this.renderer = new LSPCompletionRenderer({
97+
integrator: this,
98+
markdownRenderer: markdown_renderer,
99+
console: console.scope('renderer')
100+
});
95101
this.renderer.activeChanged.connect(this.active_completion_changed, this);
96102
adapterManager.adapterChanged.connect(this.swap_adapter, this);
97103
settings.changed.connect(() => {
@@ -100,10 +106,6 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
100106
this.settings.composite.typesMap
101107
);
102108
});
103-
104-
this.markdown_renderer = this.renderMimeRegistry.createRenderer(
105-
'text/markdown'
106-
);
107109
}
108110

109111
active_completion_changed(
@@ -190,6 +192,7 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
190192
}
191193
this.set_completion_connector(adapter, editor_changed.editor);
192194
this.current_completion_handler.editor = editor_changed.editor;
195+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
193196
// @ts-ignore
194197
this.current_completion_handler.connector = this.current_completion_connector;
195198
}
@@ -202,7 +205,8 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
202205
// (note: not trivial as _markup() does filtering too)
203206
const items = completer.model.completionItems();
204207

205-
// TODO upstream: Completer will have getActiveItem()
208+
// TODO upstream: add getActiveItem() to Completer
209+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
206210
// @ts-ignore
207211
const index = completer._activeIndex;
208212
const active: CompletionHandler.ICompletionItem = items[index];
@@ -214,25 +218,14 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
214218
if (item.documentation) {
215219
let docPanel = completer.node.querySelector('.jp-Completer-docpanel');
216220

221+
// remove all children
222+
docPanel.textContent = '';
217223
// TODO upstream: renderer should take care of the documentation rendering
218224
// sent PR: https://github.com/jupyterlab/jupyterlab/pull/9663
219-
if (item.isDocumentationMarkdown) {
220-
this.markdown_renderer
221-
.renderModel({
222-
data: {
223-
'text/markdown': item.documentation
224-
},
225-
trusted: false,
226-
metadata: {},
227-
setData(options: IRenderMime.IMimeModel.ISetDataOptions) {}
228-
})
229-
.catch(this.console.warn);
230-
// remove all children
231-
docPanel.textContent = '';
232-
docPanel.appendChild(this.markdown_renderer.node);
233-
} else {
234-
docPanel.textContent = item.documentation;
235-
}
225+
226+
const node = this.renderer.createDocumentationNode(item);
227+
docPanel.appendChild(node);
228+
236229
docPanel.setAttribute('style', '');
237230
}
238231
}

packages/jupyterlab-lsp/src/features/completion/completion_handler.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,14 +123,17 @@ export class LazyCompletionItem implements CompletionHandler.ICompletionItem {
123123

124124
this._requested_resolution = true;
125125

126-
connection.getCompletionResolve(this.match).then(resolvedCompletionItem => {
127-
if (resolvedCompletionItem === null) {
128-
return;
129-
}
130-
this._setDocumentation(resolvedCompletionItem.documentation);
131-
this._resolved = true;
132-
this.connector.lab_integration.refresh_doc_panel(this);
133-
});
126+
connection
127+
.getCompletionResolve(this.match)
128+
.then(resolvedCompletionItem => {
129+
if (resolvedCompletionItem === null) {
130+
return;
131+
}
132+
this._setDocumentation(resolvedCompletionItem.documentation);
133+
this._resolved = true;
134+
this.connector.lab_integration.refresh_doc_panel(this);
135+
})
136+
.catch(console.warn);
134137
}
135138

136139
/**

packages/jupyterlab-lsp/src/features/completion/renderer.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { Completer } from '@jupyterlab/completer';
55
import { CompletionLabIntegration } from './completion';
66
import { Signal } from '@lumino/signaling';
77
import { LazyCompletionItem } from './completion_handler';
8+
import { IRenderMime } from '@jupyterlab/rendermime';
9+
import { ILSPLogConsole } from '../../tokens';
810

911
export class LSPCompletionRenderer
1012
extends Completer.Renderer
@@ -47,10 +49,34 @@ export class LSPCompletionRenderer
4749

4850
return li;
4951
}
52+
53+
createDocumentationNode(item: LazyCompletionItem): HTMLElement {
54+
if (item.isDocumentationMarkdown) {
55+
this.options.markdownRenderer
56+
.renderModel({
57+
data: {
58+
'text/markdown': item.documentation
59+
},
60+
trusted: false,
61+
metadata: {},
62+
setData(options: IRenderMime.IMimeModel.ISetDataOptions) {
63+
// empty
64+
}
65+
})
66+
.catch(this.options.console.warn);
67+
return this.options.markdownRenderer.node;
68+
} else {
69+
let node = new HTMLDivElement();
70+
node.textContent = item.documentation;
71+
return node;
72+
}
73+
}
5074
}
5175

5276
export namespace LSPCompletionRenderer {
5377
export interface IOptions {
5478
integrator: CompletionLabIntegration;
79+
markdownRenderer: IRenderMime.IRenderer;
80+
console: ILSPLogConsole;
5581
}
5682
}

0 commit comments

Comments
 (0)