Skip to content

Commit 069521d

Browse files
authored
Re-enable jedi for code completion (#168)
1 parent 2e65b80 commit 069521d

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/interpreter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class Interpreter(InteractiveShell):
2323
def __init__(self, *args, **kwargs):
2424
super(Interpreter, self).__init__(*args, **kwargs)
2525
self.kernel = PyodideKernel(interpreter=self)
26-
self.Completer.use_jedi = False
26+
self.Completer.use_jedi = True
2727
self._last_traceback = None
2828
self._input = None
2929
self._getpass = None

packages/pyodide-kernel/py/pyodide-kernel/pyodide_kernel/kernel.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@
1313

1414
from .litetransform import LiteTransformerManager
1515

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+
1627

1728
class PyodideKernel(LoggingConfigurable):
1829
interpreter: "Interpreter" = Instance("pyodide_kernel.interpreter.Interpreter")
@@ -70,6 +81,9 @@ def is_complete(self, code):
7081
return results
7182

7283
def complete(self, code, cursor_pos):
84+
if _use_experimental_60_completion:
85+
return self._experimental_do_complete(code, cursor_pos)
86+
7387
if cursor_pos is None:
7488
cursor_pos = len(code)
7589
line, offset = line_at_cursor(code, cursor_pos)
@@ -115,3 +129,43 @@ async def run(self, code):
115129
results["traceback"] = last_traceback["traceback"]
116130

117131
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+
}

packages/pyodide-kernel/src/worker.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,15 @@ export class PyodideRemoteKernel {
9292
protected async initKernel(options: IPyodideWorkerKernel.IOptions): Promise<void> {
9393
const preloaded = (options.loadPyodideOptions || {}).packages || [];
9494

95-
const toLoad = ['ssl', 'sqlite3', 'ipykernel', 'comm', 'pyodide_kernel', 'ipython'];
95+
const toLoad = [
96+
'ssl',
97+
'sqlite3',
98+
'ipykernel',
99+
'comm',
100+
'pyodide_kernel',
101+
'jedi',
102+
'ipython',
103+
];
96104

97105
const scriptLines: string[] = [];
98106

0 commit comments

Comments
 (0)