refactor: move resolveGlobalName to Lean namespace
This commit is contained in:
parent
bed1f30b2b
commit
fa338c1885
4 changed files with 38 additions and 41 deletions
|
|
@ -7,40 +7,4 @@ import Lean.Environment
|
|||
|
||||
namespace Lean
|
||||
|
||||
/-!
|
||||
We use aliases to implement the `export <id> (<id>+)` command.
|
||||
An `export A (x)` in the namespace `B` produces an alias `B.x ~> A.x`. -/
|
||||
|
||||
abbrev AliasState := SMap Name (List Name)
|
||||
abbrev AliasEntry := Name × Name
|
||||
|
||||
def addAliasEntry (s : AliasState) (e : AliasEntry) : AliasState :=
|
||||
match s.find? e.1 with
|
||||
| none => s.insert e.1 [e.2]
|
||||
| some es => if es.elem e.2 then s else s.insert e.1 (e.2 :: es)
|
||||
|
||||
def mkAliasExtension : IO (SimplePersistentEnvExtension AliasEntry AliasState) :=
|
||||
registerSimplePersistentEnvExtension {
|
||||
name := `aliasesExt,
|
||||
addEntryFn := addAliasEntry,
|
||||
addImportedFn := fun es => (mkStateFromImportedEntries addAliasEntry {} es).switch
|
||||
}
|
||||
|
||||
@[init mkAliasExtension]
|
||||
constant aliasExtension : SimplePersistentEnvExtension AliasEntry AliasState := arbitrary _
|
||||
|
||||
/- Add alias `a` for `e` -/
|
||||
@[export lean_add_alias]
|
||||
def addAlias (env : Environment) (a : Name) (e : Name) : Environment :=
|
||||
aliasExtension.addEntry env (a, e)
|
||||
|
||||
def getAliases (env : Environment) (a : Name) : List Name :=
|
||||
match (aliasExtension.getState env).find? a with
|
||||
| none => []
|
||||
| some es => es
|
||||
|
||||
-- slower, but only used in the pretty printer
|
||||
def getRevAliases (env : Environment) (e : Name) : List Name :=
|
||||
(aliasExtension.getState env).fold (fun as a es => if List.contains es e then a :: as else as) []
|
||||
|
||||
end Lean
|
||||
|
|
|
|||
|
|
@ -397,7 +397,7 @@ def resolveNamespace (id : Name) : CommandElabM Name := do
|
|||
env ← getEnv;
|
||||
currNamespace ← getCurrNamespace;
|
||||
openDecls ← getOpenDecls;
|
||||
match Elab.resolveNamespace env currNamespace openDecls id with
|
||||
match Lean.resolveNamespace env currNamespace openDecls id with
|
||||
| some ns => pure ns
|
||||
| none => throwError ("unknown namespace '" ++ id ++ "'")
|
||||
|
||||
|
|
|
|||
|
|
@ -6,10 +6,44 @@ Authors: Leonardo de Moura, Sebastian Ullrich
|
|||
import Lean.Data.OpenDecl
|
||||
import Lean.Hygiene
|
||||
import Lean.Modifiers
|
||||
import Lean.Elab.Alias
|
||||
|
||||
namespace Lean
|
||||
namespace Elab
|
||||
|
||||
/-!
|
||||
We use aliases to implement the `export <id> (<id>+)` command.
|
||||
An `export A (x)` in the namespace `B` produces an alias `B.x ~> A.x`. -/
|
||||
|
||||
abbrev AliasState := SMap Name (List Name)
|
||||
abbrev AliasEntry := Name × Name
|
||||
|
||||
def addAliasEntry (s : AliasState) (e : AliasEntry) : AliasState :=
|
||||
match s.find? e.1 with
|
||||
| none => s.insert e.1 [e.2]
|
||||
| some es => if es.elem e.2 then s else s.insert e.1 (e.2 :: es)
|
||||
|
||||
def mkAliasExtension : IO (SimplePersistentEnvExtension AliasEntry AliasState) :=
|
||||
registerSimplePersistentEnvExtension {
|
||||
name := `aliasesExt,
|
||||
addEntryFn := addAliasEntry,
|
||||
addImportedFn := fun es => (mkStateFromImportedEntries addAliasEntry {} es).switch
|
||||
}
|
||||
|
||||
@[init mkAliasExtension]
|
||||
constant aliasExtension : SimplePersistentEnvExtension AliasEntry AliasState := arbitrary _
|
||||
|
||||
/- Add alias `a` for `e` -/
|
||||
@[export lean_add_alias]
|
||||
def addAlias (env : Environment) (a : Name) (e : Name) : Environment :=
|
||||
aliasExtension.addEntry env (a, e)
|
||||
|
||||
def getAliases (env : Environment) (a : Name) : List Name :=
|
||||
match (aliasExtension.getState env).find? a with
|
||||
| none => []
|
||||
| some es => es
|
||||
|
||||
-- slower, but only used in the pretty printer
|
||||
def getRevAliases (env : Environment) (e : Name) : List Name :=
|
||||
(aliasExtension.getState env).fold (fun as a es => if List.contains es e then a :: as else as) []
|
||||
|
||||
/- Global name resolution -/
|
||||
|
||||
|
|
@ -114,5 +148,4 @@ else match resolveNamespaceUsingScope env id ns with
|
|||
| some n => some n
|
||||
| none => none
|
||||
|
||||
end Elab
|
||||
end Lean
|
||||
|
|
|
|||
|
|
@ -1268,7 +1268,7 @@ def resolveGlobalName (n : Name) : TermElabM (List (Name × List String)) := do
|
|||
env ← getEnv;
|
||||
currNamespace ← getCurrNamespace;
|
||||
openDecls ← getOpenDecls;
|
||||
pure (Lean.Elab.resolveGlobalName env currNamespace openDecls n)
|
||||
pure (Lean.resolveGlobalName env currNamespace openDecls n)
|
||||
|
||||
/- Similar to `resolveGlobalName`, but discard any candidate whose `fieldList` is not empty. -/
|
||||
def resolveGlobalConst (n : Name) : TermElabM (List Name) := do
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue