53 lines
2 KiB
Text
53 lines
2 KiB
Text
/-
|
|
Copyright (c) 2021 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Authors: Leonardo de Moura
|
|
-/
|
|
module
|
|
|
|
prelude
|
|
public import Lean.Data.DeclarationRange
|
|
public import Lean.MonadEnv
|
|
|
|
public section
|
|
|
|
/-!
|
|
# Environment extension for declaration ranges
|
|
-/
|
|
|
|
namespace Lean
|
|
|
|
builtin_initialize builtinDeclRanges : IO.Ref (NameMap DeclarationRanges) ← IO.mkRef {}
|
|
builtin_initialize declRangeExt : MapDeclarationExtension DeclarationRanges ←
|
|
mkMapDeclarationExtension (exportEntriesFn := fun _ s level =>
|
|
if level < .server then
|
|
#[]
|
|
else s.toArray)
|
|
|
|
def addBuiltinDeclarationRanges (declName : Name) (declRanges : DeclarationRanges) : IO Unit :=
|
|
builtinDeclRanges.modify (·.insert declName declRanges)
|
|
|
|
def addDeclarationRanges [Monad m] [MonadEnv m] (declName : Name) (declRanges : DeclarationRanges) : m Unit := do
|
|
if declName.isAnonymous then
|
|
-- This can happen on elaboration of partial syntax and would panic in `modifyState` otherwise
|
|
return
|
|
modifyEnv fun env => declRangeExt.insert env declName declRanges
|
|
|
|
def findDeclarationRangesCore? [Monad m] [MonadEnv m] (declName : Name) : m (Option DeclarationRanges) :=
|
|
-- In the case of private definitions imported via `import all`, looking in `.olean.server` is not
|
|
-- sufficient, so we look in the actual environment as well via `exported` (TODO: rethink
|
|
-- parameter naming).
|
|
return declRangeExt.find? (level := .exported) (← getEnv) declName <|>
|
|
declRangeExt.find? (level := .server) (← getEnv) declName
|
|
|
|
def findDeclarationRanges? [Monad m] [MonadEnv m] [MonadLiftT BaseIO m] (declName : Name) : m (Option DeclarationRanges) := do
|
|
let env ← getEnv
|
|
let ranges ← if isAuxRecursor env declName || isNoConfusion env declName || (← isRec declName) then
|
|
findDeclarationRangesCore? declName.getPrefix
|
|
else
|
|
findDeclarationRangesCore? declName
|
|
match ranges with
|
|
| none => return (← builtinDeclRanges.get (m := BaseIO)).find? declName
|
|
| some _ => return ranges
|
|
|
|
end Lean
|