lean4-htt/tests/lean/interactive/codeActions.lean
Marc Huisinga dfd3d18530
test: improve language server test coverage (#10574)
This PR significantly improves the test coverage of the language server,
providing at least a single basic test for every request that is used by
the client. It also implements infrastructure for testing all of these
requests, e.g. the ability to run interactive tests in a project context
and refactors the interactive test runner to be more maintainable.
Finally, it also fixes a small bug with the recently implemented unknown
identifier code actions for auto-implicits (#10442) that was discovered
in testing, where the "import all unambiguous unknown identifiers" code
action didn't work correctly on auto-implicit identifiers.
2025-09-30 11:15:03 +00:00

64 lines
1.5 KiB
Text

import Lean.Server.CodeActions
open Lean.Server
@[code_action_provider] def foo : Lean.Server.CodeActionProvider := fun _ snap => do
let doc ← RequestM.readDoc
let some range := snap.stx.getRange?
| return #[]
return #[{
eager := {
title := "foo"
kind? := "quickfix"
edit? := some <| .ofTextEdit doc.versionedIdentifier {
newText := "foo"
range := doc.meta.text.utf8RangeToLspRange range
}
}
}]
syntax (name := barCmd) "#bar" : command
macro_rules
| `(#bar) => `(#eval 0)
@[command_code_action barCmd] def bar : Lean.CodeAction.CommandCodeAction := fun _ _ _ i => do
let doc ← RequestM.readDoc
let some (.ofCommandInfo ci) := i.findInfo? (· matches .ofCommandInfo ..)
| return #[]
let some range := ci.stx.getRange?
| return #[]
return #[{
eager := {
title := "bar"
kind? := "quickfix"
edit? := some <| .ofTextEdit doc.versionedIdentifier {
newText := "#eval 0"
range := doc.meta.text.utf8RangeToLspRange range
}
}
}]
@[hole_code_action] def foobar : Lean.CodeAction.HoleCodeAction := fun _ _ _ hole => do
let doc ← RequestM.readDoc
let some range := hole.stx.getRange?
| return #[]
return #[{
eager := {
title := "foobar"
kind? := "quickfix"
edit? := some <| .ofTextEdit doc.versionedIdentifier {
newText := "\"foobar\""
range := doc.meta.text.utf8RangeToLspRange range
}
}
}]
def f : Nat := 0
--^ codeAction
#bar
--^ codeAction
example : Nat := _
--^ codeAction