39 lines
1.0 KiB
Python
39 lines
1.0 KiB
Python
from typing import Optional
|
|
|
|
from src.interpreter.environment import Environment
|
|
from src.interpreter.interpreter import Interpreter
|
|
|
|
|
|
class Completer:
|
|
def __init__(self, interpreter: Interpreter):
|
|
self.interpreter: Interpreter = interpreter
|
|
self.options: list[str] = []
|
|
self.matches: list[str] = []
|
|
|
|
def complete(self, text: str, state: int) -> Optional[str]:
|
|
if state == 0:
|
|
self.update_matches(text)
|
|
try:
|
|
return self.matches[state]
|
|
except IndexError:
|
|
return None
|
|
|
|
def update_matches(self, text: str):
|
|
self.options = []
|
|
|
|
env: Optional[Environment] = self.interpreter.env
|
|
while env is not None:
|
|
self.options.extend(env.values.keys())
|
|
env = env.enclosing
|
|
|
|
self.options = sorted(self.options)
|
|
|
|
if not text:
|
|
self.matches = self.options
|
|
else:
|
|
self.matches = [
|
|
opt
|
|
for opt in self.options
|
|
if opt.startswith(text)
|
|
]
|