This PR adds basic auto-completion support for imports. Since it still lacks Lake support for accurate completion suggestions (cc @tydeu - we already know what needs to be done), it falls back to traversing the `LEAN_SRC_PATH` for available imports. Three kinds of import completion requests are supported: - Completion of the full `import` command. Triggered when requesting completions in an empty space within the header. - Known issue: It is possible to trigger this completion within a comment in the header. Fixing this would require architecture for parsing some kind of sub-syntax between individual commands. - Completion of the full module name after an incomplete `import` command. - Completion of a partial module name with a trailing dot. Since the set of imports is potentially expensive to compute, they are cached for 10 seconds after the last import auto-completion request. Closes #2655. ### Changes This PR also makes the following changes: - To support completions on the trailing dot, the `import` syntax was adjusted to provide partial syntax when a trailing dot is used. - `FileWorker.lean` was refactored lightly with some larger definitions being broken apart. - The `WorkerState` gained two new fields: - `currHeaderStx` tracks the current header syntax, as opposed to tracking only the initial header syntax in `initHeaderStx`. When the header syntax changes, a task is launched that restarts the file worker after a certain delay to avoid constant restarts while editing the header. During this time period, we may still want to serve import auto-completion requests, so we need to know the up-to-date header syntax. - `importCachingTask?` contains a task that computes the set of available imports. - `determineLakePath` has moved to a new file `Lean/Util/LakePath.lean` as it is now needed both in `ImportCompletion.lean` and `FileWorker.lean`. - `forEachModuleIn` from `Lake/Config/Blob.lean` has moved to `Lean/Util/Path.lean` as it is a generally useful utility function that was useful for traversing the `LEAN_SRC_PATH` as well. ### Tests Unfortunately, this PR lacks tests since the set of imports available in `tests/lean/interactive` will not be stable. In the future, I will add support for testing LSP requests in full project setups, which is when tests for import auto-completion will be added as well.
15 lines
513 B
Text
15 lines
513 B
Text
/-
|
|
Copyright (c) 2023 Lean FRO, LLC. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
|
|
Authors: Sebastian Ullrich
|
|
-/
|
|
|
|
def Lean.determineLakePath : IO System.FilePath := do
|
|
if let some lakePath ← IO.getEnv "LAKE" then
|
|
return System.FilePath.mk lakePath
|
|
|
|
let sysroot? ← IO.getEnv "LEAN_SYSROOT"
|
|
let lakePath ← match sysroot? with
|
|
| some sysroot => pure <| System.FilePath.mk sysroot / "bin" / "lake"
|
|
| none => pure <| (← IO.appDir) / "lake"
|