Skip to content

Commit

Permalink
feat: partial words import completion (leanprover#3602)
Browse files Browse the repository at this point in the history
This PR enables import auto-completion to complete partial words in
imports.

Other inconsistencies that I've found in import completion already seem
to be fixed by leanprover#3014. Since it will be merged soon, there is no need to
invest time to fix these issues on master.
  • Loading branch information
mhuisi authored and tydeu committed Mar 11, 2024
1 parent 0fdb4c5 commit 1c64a16
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions src/Lean/Server/ImportCompletion.lean
Original file line number Diff line number Diff line change
Expand Up @@ -58,26 +58,30 @@ def computePartialImportCompletions
(completionPos : String.Pos)
(availableImports : ImportTrie)
: Array Name := Id.run do
let some importStxToComplete := headerStx[1].getArgs.find? fun importStx => Id.run do
let some (completePrefix, incompleteSuffix) := headerStx[1].getArgs.findSome? fun importStx => do
-- `partialTrailingDotStx` ≙ `("." ident)?`
let partialTrailingDotStx := importStx[3]
if ! partialTrailingDotStx.hasArgs then
return false
let trailingDot := partialTrailingDotStx[0]
let some tailPos := trailingDot.getTailPos?
| return false
return tailPos == completionPos
let tailPos ← importStx[2].getTailPos?
guard <| tailPos == completionPos
let .str completePrefix incompleteSuffix := importStx[2].getId
| none
return (completePrefix, incompleteSuffix)
else
let trailingDot := partialTrailingDotStx[0]
let tailPos ← trailingDot.getTailPos?
guard <| tailPos == completionPos
return (importStx[2].getId, "")
| return #[]
let importPrefixToComplete := importStxToComplete[2].getId

let completions : Array Name :=
availableImports.matchingToArray importPrefixToComplete
|>.map fun matchingAvailableImport =>
matchingAvailableImport.replacePrefix importPrefixToComplete Name.anonymous
let completions := availableImports.matchingToArray completePrefix
|>.map (·.replacePrefix completePrefix .anonymous)
|>.filter (·.toString.startsWith incompleteSuffix)
|>.filter (! ·.isAnonymous)
|>.qsort Name.quickLt

let nonEmptyCompletions := completions.filter fun completion => !completion.isAnonymous
return completions

return nonEmptyCompletions.insertionSort (Name.cmp · · == Ordering.lt)

def isImportCompletionRequest (text : FileMap) (headerStx : Syntax) (params : CompletionParams) : Bool :=
let completionPos := text.lspPosToUtf8Pos params.position
Expand Down

0 comments on commit 1c64a16

Please sign in to comment.