@@ -20,7 +20,7 @@ import { IWorkspaceService } from '../../../common/application/types';
2020import { CancellationError } from '../../../common/cancellation' ;
2121import { traceWarning } from '../../../common/logger' ;
2222import { IFileSystem , TemporaryFile } from '../../../common/platform/types' ;
23- import { createDeferred , Deferred , sleep } from '../../../common/utils/async' ;
23+ import { createDeferred , Deferred , waitForPromise } from '../../../common/utils/async' ;
2424import { Identifiers , Settings } from '../../constants' ;
2525import { IInteractiveWindowListener , IInteractiveWindowProvider , IJupyterExecution } from '../../types' ;
2626import {
@@ -43,8 +43,8 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
4343
4444 private documentPromise : Deferred < IntellisenseDocument > | undefined ;
4545 private temporaryFile : TemporaryFile | undefined ;
46- private postEmitter : EventEmitter < { message : string ; payload : any } > = new EventEmitter < { message : string ; payload : any } > ( ) ;
47- private cancellationSources : Map < string , CancellationTokenSource > = new Map < string , CancellationTokenSource > ( ) ;
46+ private postEmitter : EventEmitter < { message : string ; payload : any } > = new EventEmitter < { message : string ; payload : any } > ( ) ;
47+ private cancellationSources : Map < string , CancellationTokenSource > = new Map < string , CancellationTokenSource > ( ) ;
4848
4949 constructor (
5050 @unmanaged ( ) private workspaceService : IWorkspaceService ,
@@ -60,7 +60,7 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
6060 }
6161 }
6262
63- public get postMessage ( ) : Event < { message : string ; payload : any } > {
63+ public get postMessage ( ) : Event < { message : string ; payload : any } > {
6464 return this . postEmitter . event ;
6565 }
6666
@@ -116,7 +116,7 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
116116 }
117117 }
118118
119- protected getDocument ( resource ?: Uri ) : Promise < IntellisenseDocument > {
119+ protected getDocument ( resource ?: Uri ) : Promise < IntellisenseDocument > {
120120 if ( ! this . documentPromise ) {
121121 this . documentPromise = createDeferred < IntellisenseDocument > ( ) ;
122122
@@ -142,17 +142,17 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
142142 }
143143
144144 protected abstract get isActive ( ) : boolean ;
145- protected abstract provideCompletionItems ( position : monacoEditor . Position , context : monacoEditor . languages . CompletionContext , cellId : string , token : CancellationToken ) : Promise < monacoEditor . languages . CompletionList > ;
146- protected abstract provideHover ( position : monacoEditor . Position , cellId : string , token : CancellationToken ) : Promise < monacoEditor . languages . Hover > ;
147- protected abstract provideSignatureHelp ( position : monacoEditor . Position , context : monacoEditor . languages . SignatureHelpContext , cellId : string , token : CancellationToken ) : Promise < monacoEditor . languages . SignatureHelp > ;
148- protected abstract handleChanges ( originalFile : string | undefined , document : IntellisenseDocument , changes : TextDocumentContentChangeEvent [ ] ) : Promise < void > ;
145+ protected abstract provideCompletionItems ( position : monacoEditor . Position , context : monacoEditor . languages . CompletionContext , cellId : string , token : CancellationToken ) : Promise < monacoEditor . languages . CompletionList > ;
146+ protected abstract provideHover ( position : monacoEditor . Position , cellId : string , token : CancellationToken ) : Promise < monacoEditor . languages . Hover > ;
147+ protected abstract provideSignatureHelp ( position : monacoEditor . Position , context : monacoEditor . languages . SignatureHelpContext , cellId : string , token : CancellationToken ) : Promise < monacoEditor . languages . SignatureHelp > ;
148+ protected abstract handleChanges ( originalFile : string | undefined , document : IntellisenseDocument , changes : TextDocumentContentChangeEvent [ ] ) : Promise < void > ;
149149
150- private dispatchMessage < M extends IInteractiveWindowMapping , T extends keyof M > ( _message : T , payload : any , handler : ( args : M [ T ] ) => void ) {
150+ private dispatchMessage < M extends IInteractiveWindowMapping , T extends keyof M > ( _message : T , payload : any , handler : ( args : M [ T ] ) => void ) {
151151 const args = payload as M [ T ] ;
152152 handler . bind ( this ) ( args ) ;
153153 }
154154
155- private postResponse < M extends IInteractiveWindowMapping , T extends keyof M > ( type : T , payload ?: M [ T ] ) : void {
155+ private postResponse < M extends IInteractiveWindowMapping , T extends keyof M > ( type : T , payload ?: M [ T ] ) : void {
156156 const response = payload as any ;
157157 if ( response && response . id ) {
158158 const cancelSource = this . cancellationSources . get ( response . id ) ;
@@ -161,7 +161,7 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
161161 this . cancellationSources . delete ( response . id ) ;
162162 }
163163 }
164- this . postEmitter . fire ( { message : type . toString ( ) , payload} ) ;
164+ this . postEmitter . fire ( { message : type . toString ( ) , payload } ) ;
165165 }
166166
167167 private handleCancel ( request : ICancelIntellisenseRequest ) {
@@ -181,11 +181,11 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
181181 // Combine all of the results together.
182182 this . postTimedResponse (
183183 [ this . provideCompletionItems ( request . position , request . context , request . cellId , cancelSource . token ) ,
184- this . provideJupyterCompletionItems ( request . position , request . context , cancelSource . token ) ] ,
184+ this . provideJupyterCompletionItems ( request . position , request . context , cancelSource . token ) ] ,
185185 InteractiveWindowMessages . ProvideCompletionItemsResponse ,
186186 ( c ) => {
187187 const list = this . combineCompletions ( c ) ;
188- return { list, requestId : request . requestId } ;
188+ return { list, requestId : request . requestId } ;
189189 }
190190 ) ;
191191 }
@@ -198,20 +198,20 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
198198 InteractiveWindowMessages . ProvideHoverResponse ,
199199 ( h ) => {
200200 if ( h && h [ 0 ] ) {
201- return { hover : h [ 0 ] ! , requestId : request . requestId } ;
201+ return { hover : h [ 0 ] ! , requestId : request . requestId } ;
202202 } else {
203203 return { hover : { contents : [ ] } , requestId : request . requestId } ;
204204 }
205205 } ) ;
206206 }
207207
208- private async provideJupyterCompletionItems ( position : monacoEditor . Position , _context : monacoEditor . languages . CompletionContext , cancelToken : CancellationToken ) : Promise < monacoEditor . languages . CompletionList > {
208+ private async provideJupyterCompletionItems ( position : monacoEditor . Position , _context : monacoEditor . languages . CompletionContext , cancelToken : CancellationToken ) : Promise < monacoEditor . languages . CompletionList > {
209209 try {
210210 const activeServer = await this . jupyterExecution . getServer ( await this . interactiveWindowProvider . getNotebookOptions ( ) ) ;
211211 const document = await this . getDocument ( ) ;
212212 if ( activeServer && document ) {
213213 const code = document . getEditCellContent ( ) ;
214- const lines = code . splitLines ( { trim : false , removeEmptyEntries : false } ) ;
214+ const lines = code . splitLines ( { trim : false , removeEmptyEntries : false } ) ;
215215 const offsetInCode = lines . reduce ( ( a : number , c : string , i : number ) => {
216216 if ( i < position . lineNumber - 1 ) {
217217 return a + c . length + 1 ;
@@ -226,7 +226,7 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
226226 const baseOffset = document . getEditCellOffset ( ) ;
227227 const basePosition = document . positionAt ( baseOffset ) ;
228228 const startPosition = document . positionAt ( jupyterResults . cursor . start + baseOffset ) ;
229- const endPosition = document . positionAt ( jupyterResults . cursor . end + baseOffset ) ;
229+ const endPosition = document . positionAt ( jupyterResults . cursor . end + baseOffset ) ;
230230 const range : monacoEditor . IRange = {
231231 startLineNumber : startPosition . line + 1 - basePosition . line , // monaco is 1 based
232232 startColumn : startPosition . character + 1 ,
@@ -254,27 +254,18 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
254254
255255 private postTimedResponse < R , M extends IInteractiveWindowMapping , T extends keyof M > ( promises : Promise < R > [ ] , message : T , formatResponse : ( val : ( R | null ) [ ] ) => M [ T ] ) {
256256 // Time all of the promises to make sure they don't take too long
257- const timed = promises . map ( p => Promise . race ( [ p , sleep ( Settings . IntellisenseTimeout ) ] ) ) ;
257+ const timed = promises . map ( p => waitForPromise ( p , Settings . IntellisenseTimeout ) ) ;
258258
259259 // Wait for all of of the timings.
260260 const all = Promise . all ( timed ) ;
261261 all . then ( r => {
262-
263- // Check all of the results. If they timed out, turn into
264- // a null so formatResponse can post the empty result.
265- const nulled = r . map ( v => {
266- if ( v === Settings . IntellisenseTimeout ) {
267- return null ;
268- }
269- return v as R ;
270- } ) ;
271- this . postResponse ( message , formatResponse ( nulled ) ) ;
262+ this . postResponse ( message , formatResponse ( r ) ) ;
272263 } ) . catch ( _e => {
273264 this . postResponse ( message , formatResponse ( [ null ] ) ) ;
274265 } ) ;
275266 }
276267
277- private combineCompletions ( list : ( monacoEditor . languages . CompletionList | null ) [ ] ) : monacoEditor . languages . CompletionList {
268+ private combineCompletions ( list : ( monacoEditor . languages . CompletionList | null ) [ ] ) : monacoEditor . languages . CompletionList {
278269 // Note to self. We're eliminating duplicates ourselves. The alternative would be to
279270 // have more than one intellisense provider at the monaco editor level and return jupyter
280271 // results independently. Maybe we switch to this when jupyter resides on the react side.
@@ -303,9 +294,9 @@ export abstract class BaseIntellisenseProvider implements IInteractiveWindowList
303294 InteractiveWindowMessages . ProvideSignatureHelpResponse ,
304295 ( s ) => {
305296 if ( s && s [ 0 ] ) {
306- return { signatureHelp : s [ 0 ] ! , requestId : request . requestId } ;
297+ return { signatureHelp : s [ 0 ] ! , requestId : request . requestId } ;
307298 } else {
308- return { signatureHelp : { signatures : [ ] , activeParameter : 0 , activeSignature : 0 } , requestId : request . requestId } ;
299+ return { signatureHelp : { signatures : [ ] , activeParameter : 0 , activeSignature : 0 } , requestId : request . requestId } ;
309300 }
310301 } ) ;
311302 }
0 commit comments