1
1
import { JupyterFrontEnd } from '@jupyterlab/application' ;
2
2
import { CodeEditor } from '@jupyterlab/codeeditor' ;
3
- import { CompletionHandler , ICompletionManager } from '@jupyterlab/completer' ;
3
+ import {
4
+ CompletionHandler ,
5
+ ICompletionManager ,
6
+ CompleterModel
7
+ } from '@jupyterlab/completer' ;
4
8
import { IDocumentWidget } from '@jupyterlab/docregistry' ;
5
9
import { NotebookPanel } from '@jupyterlab/notebook' ;
6
10
import { IRenderMimeRegistry } from '@jupyterlab/rendermime' ;
@@ -27,6 +31,7 @@ import { ICompletionData, LSPCompletionRenderer } from './renderer';
27
31
28
32
const DOC_PANEL_SELECTOR = '.jp-Completer-docpanel' ;
29
33
const DOC_PANEL_PLACEHOLDER_CLASS = 'lsp-completer-placeholder' ;
34
+ const LSP_COMPLETER_CLASS = 'lsp-completer' ;
30
35
31
36
export class CompletionCM extends CodeMirrorIntegration {
32
37
private _completionCharacters : string [ ] ;
@@ -88,6 +93,8 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
88
93
protected current_adapter : WidgetAdapter < IDocumentWidget > | null = null ;
89
94
protected renderer : LSPCompletionRenderer ;
90
95
private _latestActiveItem : LazyCompletionItem | null = null ;
96
+ private _signalConnected : boolean = false ;
97
+ private _disabled : boolean ;
91
98
92
99
constructor (
93
100
private app : JupyterFrontEnd ,
@@ -108,24 +115,40 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
108
115
} ) ;
109
116
this . renderer . activeChanged . connect ( this . active_completion_changed , this ) ;
110
117
this . renderer . itemShown . connect ( this . resolve_and_update , this ) ;
118
+ this . _signalConnected = false ;
119
+ this . _disabled = false ;
111
120
// TODO: figure out a better way to disable lab integration elements (postpone initialization?)
112
121
settings . ready
113
122
. then ( ( ) => {
123
+ this . _disabled = settings . composite . disable ;
114
124
if ( ! settings . composite . disable ) {
115
125
adapterManager . adapterChanged . connect ( this . swap_adapter , this ) ;
126
+ this . _signalConnected = true ;
116
127
}
117
128
} )
118
129
. catch ( console . warn ) ;
130
+
119
131
settings . changed . connect ( ( ) => {
120
- completionThemeManager . set_theme ( this . settings . composite . theme ) ;
121
- completionThemeManager . set_icons_overrides (
122
- this . settings . composite . typesMap
123
- ) ;
132
+ this . _disabled = settings . composite . disable ;
124
133
if ( ! settings . composite . disable ) {
125
134
document . body . dataset . lspCompleterLayout =
126
135
this . settings . composite . layout ;
136
+ completionThemeManager . set_theme ( this . settings . composite . theme ) ;
137
+ completionThemeManager . set_icons_overrides (
138
+ this . settings . composite . typesMap
139
+ ) ;
140
+ if ( ! this . _signalConnected ) {
141
+ adapterManager . adapterChanged . connect ( this . swap_adapter , this ) ;
142
+ this . _signalConnected = true ;
143
+ }
144
+ } else {
145
+ completionThemeManager . set_theme ( null ) ;
146
+ delete document . body . dataset . lspCompleterLayout ;
127
147
}
128
- if ( this . current_completion_handler ) {
148
+ if (
149
+ this . current_completion_handler &&
150
+ this . model instanceof LSPCompleterModel
151
+ ) {
129
152
this . model . settings . caseSensitive =
130
153
this . settings . composite . caseSensitive ;
131
154
this . model . settings . includePerfectMatches =
@@ -284,21 +307,26 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
284
307
this . renderer
285
308
) as CompletionHandler ;
286
309
let completer = this . completer ;
287
- completer . addClass ( 'lsp-completer' ) ;
288
- completer . model = new LSPCompleterModel ( {
289
- caseSensitive : this . settings . composite . caseSensitive ,
290
- includePerfectMatches : this . settings . composite . includePerfectMatches ,
291
- preFilterMatches : this . settings . composite . preFilterMatches
292
- } ) ;
310
+ if ( this . _disabled ) {
311
+ completer . removeClass ( LSP_COMPLETER_CLASS ) ;
312
+ completer . model = new CompleterModel ( ) ;
313
+ } else {
314
+ completer . addClass ( LSP_COMPLETER_CLASS ) ;
315
+ completer . model = new LSPCompleterModel ( {
316
+ caseSensitive : this . settings . composite . caseSensitive ,
317
+ includePerfectMatches : this . settings . composite . includePerfectMatches ,
318
+ preFilterMatches : this . settings . composite . preFilterMatches
319
+ } ) ;
320
+ }
293
321
}
294
322
295
323
protected get completer ( ) {
296
324
// TODO upstream: make completer public?
297
325
return this . current_completion_handler . completer ;
298
326
}
299
327
300
- protected get model ( ) : LSPCompleterModel {
301
- return this . completer . model as LSPCompleterModel ;
328
+ protected get model ( ) : LSPCompleterModel | CompleterModel {
329
+ return this . completer . model as LSPCompleterModel | CompleterModel ;
302
330
}
303
331
304
332
invoke_completer ( kind : ExtendedCompletionTriggerKind ) {
@@ -336,6 +364,9 @@ export class CompletionLabIntegration implements IFeatureLabIntegration {
336
364
private get current_items ( ) {
337
365
// TODO upstream: allow to get completionItems() without markup
338
366
// (note: not trivial as _markup() does filtering too)
367
+ if ( ! ( this . model instanceof LSPCompleterModel ) ) {
368
+ return [ ] ;
369
+ }
339
370
return this . model . completionItems ( ) ;
340
371
}
341
372
0 commit comments