lean4-htt/src/Lean/Server/Completion/CompletionResolution.lean
Markus Himmel 81ea922025
chore: rename String.Pos to String.Pos.Raw (#10624)
This PR renames `String.Pos` to `String.Pos.Raw`.

After an abbreviated deprecation cycle, we will then rename
`String.ValidPos` to `String.Pos`.
2025-10-01 07:45:24 +00:00

104 lines
3.3 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2024 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Leonardo de Moura, Marc Huisinga
-/
module
prelude
public import Lean.Data.Lsp
public import Lean.Server.Completion.CompletionInfoSelection
public import Lean.Linter.Deprecated
public section
namespace Lean.Lsp
private partial def consumeImplicitPrefix (e : Expr) (k : Expr → MetaM α) : MetaM α := do
match e with
| Expr.forallE n d b c =>
-- We do not consume instance implicit arguments because the user probably wants be aware of this dependency
if c == .implicit then
Meta.withLocalDecl n c d fun arg =>
consumeImplicitPrefix (b.instantiate1 arg) k
else
k e
| _ => k e
/--
Fills the `CompletionItem.detail?` field of `item` using the pretty-printed type identified by `id`.
-/
def CompletionItem.resolve
(item : CompletionItem)
(id : CompletionIdentifier)
: MetaM CompletionItem := do
let env ← getEnv
let lctx ← getLCtx
let mut item := item
if item.detail?.isNone then
let type? := match id with
| .const declName =>
env.find? declName |>.map ConstantInfo.type
| .fvar id =>
lctx.find? id |>.map LocalDecl.type
let detail? ← type?.mapM fun type =>
consumeImplicitPrefix type fun typeWithoutImplicits =>
return toString (← Meta.ppExpr typeWithoutImplicits)
item := { item with detail? := detail? }
if item.documentation?.isNone then
let docStringPrefix? := Id.run do
let .const declName := id
| none
let some param := Linter.deprecatedAttr.getParam? env declName
| none
let docstringPrefix :=
if let some text := param.text? then
text
else if let some newName := param.newName? then
s!"`{declName}` has been deprecated, use `{newName}` instead."
else
s!"`{declName}` has been deprecated."
some docstringPrefix
let docString? ← do
let .const declName := id
| pure none
findDocString? env declName
let doc? := do
let docValue ←
match docStringPrefix?, docString? with
| none, none => none
| some docStringPrefix, none => docStringPrefix
| none, docString => docString
| some docStringPrefix, some docString => s!"{docStringPrefix}\n\n{docString}"
pure { value := docValue , kind := MarkupKind.markdown : MarkupContent }
item := { item with documentation? := doc? }
return item
end Lean.Lsp
namespace Lean.Server.Completion
open Lean.Lsp
open Elab
/--
Fills the `CompletionItem.detail?` field of `item` using the pretty-printed type identified by `id`
in the context found at `hoverPos` in `infoTree`.
-/
def resolveCompletionItem?
(fileMap : FileMap)
(hoverPos : String.Pos.Raw)
(cmdStx : Syntax)
(infoTree : InfoTree)
(item : CompletionItem)
(id : CompletionIdentifier)
(completionInfoPos : Nat)
: IO CompletionItem := do
let (completionInfos, _) := findCompletionInfosAt fileMap hoverPos cmdStx infoTree
let some i := completionInfos[completionInfoPos]?
| return item
i.ctx.runMetaM i.info.lctx (item.resolve id)
end Lean.Server.Completion