Skip to content

Commit 99f8263

Browse files
committed
Re-register native completion providers when LSP completion is disabled
1 parent 73ee344 commit 99f8263

File tree

3 files changed

+73
-34
lines changed

3 files changed

+73
-34
lines changed

atest/05_Features/Completion.robot

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ Works When Kernel Is Idle
3434
${content} = Get Cell Editor Content 1
3535
Should Contain ${content} TabError
3636

37+
Does Not Break Native Completions When Disabled
38+
Configure JupyterLab Plugin {"disabled": true} plugin id=${COMPLETION PLUGIN ID}
39+
Enter Cell Editor 1 line=2
40+
Trigger Completer
41+
Completer Should Suggest try
42+
Completer Should Not Suggest test
43+
3744
Filters Completions In Case Sensitive Mode
3845
[Documentation] Completions filtering is case-sensitive when caseSensitive is true
3946
Configure JupyterLab Plugin {"caseSensitive": true} plugin id=${COMPLETION PLUGIN ID}

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

Lines changed: 60 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ import {
33
JupyterFrontEnd,
44
JupyterFrontEndPlugin
55
} from '@jupyterlab/application';
6-
import { ICompletionProviderManager } from '@jupyterlab/completer';
6+
import {
7+
ICompletionProviderManager,
8+
ContextCompleterProvider,
9+
KernelCompleterProvider
10+
} from '@jupyterlab/completer';
711
import {
812
ILSPFeatureManager,
913
ILSPDocumentConnectionManager
@@ -24,6 +28,7 @@ import {
2428
EnhancedKernelCompleterProvider
2529
} from './overrides';
2630
import { CompletionProvider } from './provider';
31+
import { ICompletionFeature } from './tokens';
2732

2833
export const completionIcon = new LabIcon({
2934
name: 'lsp:completion',
@@ -94,42 +99,65 @@ export namespace CompletionFeature {
9499
export const id = PLUGIN_ID + ':completion';
95100
}
96101

97-
export const COMPLETION_PLUGIN: JupyterFrontEndPlugin<void> = {
98-
id: CompletionFeature.id,
99-
requires: [
100-
ILSPFeatureManager,
101-
ISettingRegistry,
102-
ICompletionProviderManager,
103-
ILSPCompletionThemeManager,
104-
IRenderMimeRegistry,
105-
ILSPDocumentConnectionManager
106-
],
102+
export const COMPLETION_PLUGIN: JupyterFrontEndPlugin<ICompletionFeature | null> =
103+
{
104+
id: CompletionFeature.id,
105+
requires: [
106+
ILSPFeatureManager,
107+
ISettingRegistry,
108+
ICompletionProviderManager,
109+
ILSPCompletionThemeManager,
110+
IRenderMimeRegistry,
111+
ILSPDocumentConnectionManager
112+
],
113+
autoStart: true,
114+
activate: async (
115+
app: JupyterFrontEnd,
116+
featureManager: ILSPFeatureManager,
117+
settingRegistry: ISettingRegistry,
118+
completionProviderManager: ICompletionProviderManager,
119+
iconsThemeManager: ILSPCompletionThemeManager,
120+
renderMimeRegistry: IRenderMimeRegistry,
121+
connectionManager: ILSPDocumentConnectionManager
122+
): Promise<ICompletionFeature | null> => {
123+
const settings = new FeatureSettings<LSPCompletionSettings>(
124+
settingRegistry,
125+
CompletionFeature.id
126+
);
127+
await settings.ready;
128+
if (settings.composite.disable) {
129+
return null;
130+
}
131+
const feature = new CompletionFeature({
132+
settings,
133+
connectionManager,
134+
renderMimeRegistry,
135+
iconsThemeManager,
136+
completionProviderManager
137+
});
138+
139+
featureManager.register(feature);
140+
return { id: CompletionFeature.id };
141+
}
142+
};
143+
144+
export const COMPLETION_FALLBACK_PLUGIN: JupyterFrontEndPlugin<void> = {
145+
id: CompletionFeature.id + '-fallback',
146+
description:
147+
'Plugin which restores the default completion provider when the LSP completion plugin is disabled',
148+
requires: [ICompletionProviderManager],
149+
optional: [ICompletionFeature],
107150
autoStart: true,
108151
activate: async (
109152
app: JupyterFrontEnd,
110-
featureManager: ILSPFeatureManager,
111-
settingRegistry: ISettingRegistry,
112153
completionProviderManager: ICompletionProviderManager,
113-
iconsThemeManager: ILSPCompletionThemeManager,
114-
renderMimeRegistry: IRenderMimeRegistry,
115-
connectionManager: ILSPDocumentConnectionManager
154+
completionFeature: ICompletionFeature | null
116155
) => {
117-
const settings = new FeatureSettings<LSPCompletionSettings>(
118-
settingRegistry,
119-
CompletionFeature.id
120-
);
121-
await settings.ready;
122-
if (settings.composite.disable) {
123-
return;
156+
if (completionFeature == null) {
157+
completionProviderManager.registerProvider(
158+
new ContextCompleterProvider()
159+
);
160+
completionProviderManager.registerProvider(new KernelCompleterProvider());
124161
}
125-
const feature = new CompletionFeature({
126-
settings,
127-
connectionManager,
128-
renderMimeRegistry,
129-
iconsThemeManager,
130-
completionProviderManager
131-
});
132-
133-
featureManager.register(feature);
134162
}
135163
};

packages/jupyterlab-lsp/src/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ import { LanguageServers } from './_plugin';
3333
import { FILEEDITOR_ADAPTER_PLUGIN } from './adapters/fileeditor';
3434
import { NOTEBOOK_ADAPTER_PLUGIN } from './adapters/notebook';
3535
import { StatusButtonExtension } from './components/statusbar';
36-
import { COMPLETION_PLUGIN } from './features/completion';
36+
import {
37+
COMPLETION_PLUGIN,
38+
COMPLETION_FALLBACK_PLUGIN
39+
} from './features/completion';
3740
import { DIAGNOSTICS_PLUGIN } from './features/diagnostics';
3841
import { HIGHLIGHTS_PLUGIN } from './features/highlights';
3942
import { HOVER_PLUGIN } from './features/hover';
@@ -250,7 +253,8 @@ const plugins: JupyterFrontEndPlugin<any>[] = [
250253
FILEEDITOR_ADAPTER_PLUGIN,
251254
plugin,
252255
...DEFAULT_TRANSCLUSIONS,
253-
...DEFAULT_FEATURES
256+
...DEFAULT_FEATURES,
257+
COMPLETION_FALLBACK_PLUGIN
254258
];
255259

256260
/**

0 commit comments

Comments
 (0)