Skip to content

Commit 4219986

Browse files
authored
Merge pull request #549 from krassowski/refactor-completion-item
Source-aware completions and more completer settings
2 parents ffdd497 + 4770565 commit 4219986

File tree

8 files changed

+434
-98
lines changed

8 files changed

+434
-98
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
- features:
66

77
- adds `%%bigquery` IPython cell magic support for BigQuery ([#553], thanks @julioyildo)
8+
- completions filtering can be set to case-insensitive in settings ([#549])
9+
- completions filtering can hide exact matches ([#549])
10+
- the extra information displayed next to the completion label now can include 'detail' (usually module/package of origin), and can be customized in settings ([#549])
811

912
- bug fixes:
1013

@@ -18,6 +21,7 @@
1821

1922
[#544]: https://github.com/krassowski/jupyterlab-lsp/pull/544
2023
[#547]: https://github.com/krassowski/jupyterlab-lsp/pull/547
24+
[#549]: https://github.com/krassowski/jupyterlab-lsp/pull/549
2125
[#553]: https://github.com/krassowski/jupyterlab-lsp/pull/553
2226
[#560]: https://github.com/krassowski/jupyterlab-lsp/pull/560
2327
[#562]: https://github.com/krassowski/jupyterlab-lsp/pull/562

packages/jupyterlab-lsp/schema/completion.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,25 @@
5858
"default": false,
5959
"description": "In case of ties when sorting completions, should the kernel completions receive higher priority than the language server completions?"
6060
},
61+
"caseSensitive": {
62+
"title": "Case-sensitive filtering",
63+
"default": true,
64+
"type": "boolean",
65+
"description": "Should completion filtering be case-sensitive?"
66+
},
67+
"includePerfectMatches": {
68+
"title": "Include perfect matches",
69+
"default": true,
70+
"type": "boolean",
71+
"description": "Should perfect matches be included in the completion suggestions list?"
72+
},
73+
"labelExtra": {
74+
"title": "Text to display next to completion label",
75+
"default": "auto",
76+
"type": "string",
77+
"enum": ["detail", "type", "source", "auto"],
78+
"description": "What to display next to the completion label, one of: 'detail', 'type', 'source', 'auto'. The default 'auto' will display whichever information is available."
79+
},
6180
"typesMap": {
6281
"title": "Mapping of custom kernel types to valid completion kind names",
6382
"description": "Mapping used for icon selection. The kernel types (keys) are case-insensitive. Accepted values are the names of CompletionItemKind and 'Kernel' literal. The defaults aim to provide good initial experience for Julia, Python and R kernels.",

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

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { IDocumentConnectionData } from '../../connection_manager';
1919
import { ILSPAdapterManager, ILSPLogConsole } from '../../tokens';
2020
import { NotebookAdapter } from '../../adapters/notebook/notebook';
2121
import { ILSPCompletionThemeManager } from '@krassowski/completion-theme/lib/types';
22-
import { LSPCompletionRenderer } from './renderer';
22+
import { ICompletionData, LSPCompletionRenderer } from './renderer';
2323
import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
2424
import { LSPCompleterModel } from './model';
2525
import { LazyCompletionItem } from './item';
@@ -105,19 +105,44 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
105105
console: console.scope('renderer')
106106
});
107107
this.renderer.activeChanged.connect(this.active_completion_changed, this);
108+
this.renderer.itemShown.connect(this.resolve_and_update, this);
108109
adapterManager.adapterChanged.connect(this.swap_adapter, this);
109110
settings.changed.connect(() => {
110111
completionThemeManager.set_theme(this.settings.composite.theme);
111112
completionThemeManager.set_icons_overrides(
112113
this.settings.composite.typesMap
113114
);
115+
if (this.current_completion_handler) {
116+
this.model.settings.caseSensitive = this.settings.composite.caseSensitive;
117+
this.model.settings.includePerfectMatches = this.settings.composite.includePerfectMatches;
118+
}
114119
});
115120
}
116121

122+
protected fetchDocumentation(item: LazyCompletionItem): void {
123+
if (!item) {
124+
return;
125+
}
126+
item
127+
.resolve()
128+
.then(resolvedCompletionItem => {
129+
this.set_doc_panel_placeholder(false);
130+
if (resolvedCompletionItem === null) {
131+
return;
132+
}
133+
this.refresh_doc_panel(item);
134+
})
135+
.catch(e => {
136+
this.set_doc_panel_placeholder(false);
137+
console.warn(e);
138+
});
139+
}
140+
117141
active_completion_changed(
118142
renderer: LSPCompletionRenderer,
119-
item: LazyCompletionItem
143+
active_completion: ICompletionData
120144
) {
145+
let { item } = active_completion;
121146
if (!item.supportsResolution()) {
122147
if (item.isDocumentationMarkdown) {
123148
// TODO: remove once https://github.com/jupyterlab/jupyterlab/pull/9663 is merged and released
@@ -128,7 +153,7 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
128153

129154
if (item.needsResolution()) {
130155
this.set_doc_panel_placeholder(true);
131-
item.fetchDocumentation();
156+
this.fetchDocumentation(item);
132157
} else if (item.isResolved()) {
133158
this.refresh_doc_panel(item);
134159
}
@@ -139,11 +164,46 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
139164

140165
if (index - 1 >= 0) {
141166
const previous = items[index - 1] as LazyCompletionItem;
142-
previous?.self?.fetchDocumentation();
167+
this.resolve_and_update_from_item(previous?.self);
143168
}
144169
if (index + 1 < items.length) {
145170
const next = items[index + 1] as LazyCompletionItem;
146-
next?.self?.fetchDocumentation();
171+
this.resolve_and_update_from_item(next?.self);
172+
}
173+
}
174+
175+
private resolve_and_update_from_item(item: LazyCompletionItem) {
176+
if (!item) {
177+
return;
178+
}
179+
this.resolve_and_update(this.renderer, {
180+
item: item,
181+
element: item.element
182+
});
183+
}
184+
185+
private resolve_and_update(
186+
renderer: LSPCompletionRenderer,
187+
active_completion: ICompletionData
188+
) {
189+
let { item, element } = active_completion;
190+
if (!item.supportsResolution()) {
191+
this.renderer.updateExtraInfo(item, element);
192+
return;
193+
}
194+
195+
if (item.isResolved()) {
196+
this.renderer.updateExtraInfo(item, element);
197+
} else {
198+
// supportsResolution as otherwise would short-circuit above
199+
item
200+
.resolve()
201+
.then(resolvedCompletionItem => {
202+
this.renderer.updateExtraInfo(item, element);
203+
})
204+
.catch(e => {
205+
this.console.warn(e);
206+
});
147207
}
148208
}
149209

@@ -195,7 +255,10 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
195255
) as CompletionHandler;
196256
let completer = this.completer;
197257
completer.addClass('lsp-completer');
198-
completer.model = new LSPCompleterModel();
258+
completer.model = new LSPCompleterModel({
259+
caseSensitive: this.settings.composite.caseSensitive,
260+
includePerfectMatches: this.settings.composite.includePerfectMatches
261+
});
199262
}
200263

201264
protected get completer() {

0 commit comments

Comments
 (0)