Browse Source

Refactor the kernel completion logic

Steven Silvester 9 years ago
parent
commit
2ad1c8d762
2 changed files with 46 additions and 27 deletions
  1. 5 27
      src/console/widget.ts
  2. 41 0
      src/notebook/completion/model.ts

+ 5 - 27
src/console/widget.ts

@@ -509,32 +509,11 @@ class ConsoleWidget extends Widget {
    * Handle a completion requested signal from an editor.
    */
   protected onCompletionRequest(editor: CellEditorWidget, change: ICompletionRequest): void {
-    let contents = {
-      // Only send the current line of code for completion.
-      code: change.currentValue.split('\n')[change.line],
-      cursor_pos: change.ch
-    };
-    let pendingComplete = ++this._pendingComplete;
-    let model = this._completion.model;
-    this._session.kernel.complete(contents).then(value => {
-      // If model has been disposed, bail.
-      if (model.isDisposed) {
-        return;
-      }
-      // If a newer completion requesy has created a pending request, bail.
-      if (pendingComplete !== this._pendingComplete) {
-        return;
-      }
-      // Completion request failures or negative results fail silently.
-      if (value.status !== 'ok') {
-        return;
-      }
-      // Update the model.
-      model.options = value.matches;
-      model.cursor = { start: value.cursor_start, end: value.cursor_end };
-    }).then(() => {
-      model.original = change;
-    });
+    let kernel = this._session.kernel;
+    if (!kernel) {
+      return;
+    }
+    this._completion.model.makeKernelRequest(change, kernel);
   }
 
   /**
@@ -576,7 +555,6 @@ class ConsoleWidget extends Widget {
   private _tooltip: ConsoleTooltip = null;
   private _history: IConsoleHistory = null;
   private _session: INotebookSession = null;
-  private _pendingComplete = 0;
   private _pendingInspect = 0;
 }
 

+ 41 - 0
src/notebook/completion/model.ts

@@ -1,6 +1,10 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
+import {
+  IKernel
+} from 'jupyter-js-services';
+
 import {
   IDisposable
 } from 'phosphor-disposable';
@@ -123,6 +127,11 @@ interface ICompletionModel extends IDisposable {
    */
   original: ICompletionRequest;
 
+  /**
+   * Handle a completion request using a kernel.
+   */
+  makeKernelRequest(request: ICompletionRequest, kernel: IKernel): void;
+
   /**
    * Create a resolved patch between the original state and a patch string.
    */
@@ -233,6 +242,37 @@ class CompletionModel implements ICompletionModel {
     this.stateChanged.emit(void 0);
   }
 
+  /**
+   * Make a request using a kernel.
+   */
+  makeKernelRequest(request: ICompletionRequest, kernel: IKernel): void {
+    let contents = {
+      // Only send the current line of code for completion.
+      code: request.currentValue.split('\n')[request.line],
+      cursor_pos: request.ch
+    };
+    let pendingComplete = ++this._pendingComplete;
+    kernel.complete(contents).then(value => {
+      // If we have been disposed, bail.
+      if (this.isDisposed) {
+        return;
+      }
+      // If a newer completion request has created a pending request, bail.
+      if (pendingComplete !== this._pendingComplete) {
+        return;
+      }
+      // Completion request failures or negative results fail silently.
+      if (value.status !== 'ok') {
+        return;
+      }
+      // Update the state.
+      this.options = value.matches;
+      this.cursor = { start: value.cursor_start, end: value.cursor_end };
+    }).then(() => {
+      this.original = request;
+    });
+  }
+
   /**
    * Create a resolved patch between the original state and a patch string.
    *
@@ -325,6 +365,7 @@ class CompletionModel implements ICompletionModel {
   private _current: ITextChange = null;
   private _query = '';
   private _cursor: { start: number, end: number } = null;
+  private _pendingComplete = 0;
 }