/- 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 -/ prelude import Init.Prelude import Lean.Meta.WHNF partial def String.charactersIn (a b : String) : Bool := go ⟨0⟩ ⟨0⟩ where go (aPos bPos : String.Pos) : Bool := if ha : a.atEnd aPos then true else if hb : b.atEnd bPos then false else let ac := a.get' aPos ha let bc := b.get' bPos hb let bPos := b.next' bPos hb if ac == bc then let aPos := a.next' aPos ha go aPos bPos else go aPos bPos namespace Lean.Server.Completion open Elab inductive HoverInfo : Type where | after | inside (delta : Nat) structure ContextualizedCompletionInfo where hoverInfo : HoverInfo ctx : ContextInfo info : CompletionInfo partial def minimizeGlobalIdentifierInContext (currNamespace : Name) (openDecls : List OpenDecl) (id : Name) : Name := Id.run do let mut minimized := shortenIn id currNamespace for openDecl in openDecls do let candidate? := match openDecl with | .simple ns except => let candidate := shortenIn id ns if ! except.contains candidate then some candidate else none | .explicit alias declName => if declName == id then some alias else none if let some candidate := candidate? then if candidate.getNumParts < minimized.getNumParts then minimized := candidate return minimized where shortenIn (id : Name) (contextNamespace : Name) : Name := if contextNamespace matches .anonymous then id else if contextNamespace.isPrefixOf id then id.replacePrefix contextNamespace .anonymous else shortenIn id contextNamespace.getPrefix def unfoldDefinitionGuarded? (e : Expr) : MetaM (Option Expr) := try Lean.Meta.unfoldDefinition? e catch _ => pure none partial def getDotCompletionTypeNames (type : Expr) : MetaM (Array Name) := return (← visit type |>.run #[]).2 where visit (type : Expr) : StateRefT (Array Name) MetaM Unit := do let .const typeName _ := type.getAppFn | return () modify fun s => s.push typeName if isStructure (← getEnv) typeName then for parentName in (← getAllParentStructures typeName) do modify fun s => s.push parentName let some type ← unfoldDefinitionGuarded? type | return () visit type end Lean.Server.Completion