|
13 | 13 |
|
14 | 14 | from .litetransform import LiteTransformerManager
|
15 | 15 |
|
| 16 | +try: |
| 17 | + from IPython.core.completer import provisionalcompleter as _provisionalcompleter |
| 18 | + from IPython.core.completer import rectify_completions as _rectify_completions |
| 19 | + |
| 20 | + _use_experimental_60_completion = True |
| 21 | +except ImportError: |
| 22 | + _use_experimental_60_completion = False |
| 23 | + |
| 24 | + |
| 25 | +_EXPERIMENTAL_KEY_NAME = "_jupyter_types_experimental" |
| 26 | + |
16 | 27 |
|
17 | 28 | class PyodideKernel(LoggingConfigurable):
|
18 | 29 | interpreter: "Interpreter" = Instance("pyodide_kernel.interpreter.Interpreter")
|
@@ -70,6 +81,9 @@ def is_complete(self, code):
|
70 | 81 | return results
|
71 | 82 |
|
72 | 83 | def complete(self, code, cursor_pos):
|
| 84 | + if _use_experimental_60_completion: |
| 85 | + return self._experimental_do_complete(code, cursor_pos) |
| 86 | + |
73 | 87 | if cursor_pos is None:
|
74 | 88 | cursor_pos = len(code)
|
75 | 89 | line, offset = line_at_cursor(code, cursor_pos)
|
@@ -115,3 +129,43 @@ async def run(self, code):
|
115 | 129 | results["traceback"] = last_traceback["traceback"]
|
116 | 130 |
|
117 | 131 | return results
|
| 132 | + |
| 133 | + def _experimental_do_complete(self, code, cursor_pos): |
| 134 | + """ |
| 135 | + Experimental completions from IPython, using Jedi. |
| 136 | + """ |
| 137 | + if cursor_pos is None: |
| 138 | + cursor_pos = len(code) |
| 139 | + with _provisionalcompleter(): |
| 140 | + assert self.interpreter is not None |
| 141 | + raw_completions = self.interpreter.Completer.completions(code, cursor_pos) |
| 142 | + completions = list(_rectify_completions(code, raw_completions)) |
| 143 | + |
| 144 | + comps = [] |
| 145 | + for comp in completions: |
| 146 | + comps.append( |
| 147 | + dict( |
| 148 | + start=comp.start, |
| 149 | + end=comp.end, |
| 150 | + text=comp.text, |
| 151 | + type=comp.type, |
| 152 | + signature=comp.signature, |
| 153 | + ) |
| 154 | + ) |
| 155 | + |
| 156 | + if completions: |
| 157 | + s = completions[0].start |
| 158 | + e = completions[0].end |
| 159 | + matches = [c.text for c in completions] |
| 160 | + else: |
| 161 | + s = cursor_pos |
| 162 | + e = cursor_pos |
| 163 | + matches = [] |
| 164 | + |
| 165 | + return { |
| 166 | + "matches": matches, |
| 167 | + "cursor_end": e, |
| 168 | + "cursor_start": s, |
| 169 | + "metadata": {_EXPERIMENTAL_KEY_NAME: comps}, |
| 170 | + "status": "ok", |
| 171 | + } |
0 commit comments