chore: move Level.lean to new frontend

This commit is contained in:
Leonardo de Moura 2020-10-09 14:57:14 -07:00
parent a621256b10
commit ec5aa511a4
2 changed files with 36 additions and 34 deletions

View file

@ -6,10 +6,9 @@ Authors: Leonardo de Moura
import Lean.Meta.LevelDefEq
import Lean.Elab.Exception
import Lean.Elab.Log
new_frontend
namespace Lean
namespace Elab
namespace Level
namespace Lean.Elab.Level
structure Context :=
(ref : Syntax)
@ -22,64 +21,59 @@ structure State :=
abbrev LevelElabM := ReaderT Context (EStateM Exception State)
instance : Ref LevelElabM :=
{ getRef := do ctx ← read; pure ctx.ref,
withRef := fun α ref x => adaptReader (fun (ctx : Context) => { ctx with ref := ref }) x }
{ getRef := do return (← read).ref,
withRef := fun ref x => adaptReader (fun ctx => { ctx with ref := ref }) x }
instance : AddMessageContext LevelElabM :=
{ addMessageContext := fun msg => pure msg }
{ addMessageContext := fun msg => pure msg }
instance : MonadNameGenerator LevelElabM :=
{ getNGen := do s ← get; pure s.ngen,
{ getNGen := do return (← get).ngen,
setNGen := fun ngen => modify fun s => { s with ngen := ngen } }
def mkFreshLevelMVar : LevelElabM Level := do
mvarId ← mkFreshId;
modify $ fun s => { s with mctx := s.mctx.addLevelMVarDecl mvarId };
pure $ mkLevelMVar mvarId
let mvarId ← mkFreshId
modify fun s => { s with mctx := s.mctx.addLevelMVarDecl mvarId }
return mkLevelMVar mvarId
partial def elabLevel : Syntax → LevelElabM Level
| stx => withRef stx do
let kind := stx.getKind;
let kind := stx.getKind
if kind == `Lean.Parser.Level.paren then
elabLevel (stx.getArg 1)
else if kind == `Lean.Parser.Level.max then do
let args := (stx.getArg 1).getArgs;
lvl ← elabLevel args.back;
else if kind == `Lean.Parser.Level.max then
let args := (stx.getArg 1).getArgs
let lvl ← elabLevel args.back
args.foldrRangeM 0 (args.size - 1)
(fun stx lvl => do
arg ← elabLevel stx;
let arg ← elabLevel stx
pure (mkLevelMax lvl arg))
lvl
else if kind == `Lean.Parser.Level.imax then do
let args := (stx.getArg 1).getArgs;
lvl ← elabLevel args.back;
else if kind == `Lean.Parser.Level.imax then
let args := (stx.getArg 1).getArgs
let lvl ← elabLevel args.back
args.foldrRangeM 0 (args.size - 1)
(fun stx lvl => do
arg ← elabLevel stx;
let arg ← elabLevel stx
pure (mkLevelIMax lvl arg))
lvl
else if kind == `Lean.Parser.Level.hole then do
else if kind == `Lean.Parser.Level.hole then
mkFreshLevelMVar
else if kind == numLitKind then do
else if kind == numLitKind then
match stx.isNatLit? with
| some val => pure (Level.ofNat val)
| none => throwIllFormedSyntax
else if kind == identKind then do
let paramName := stx.getId;
ctx ← read;
unless (ctx.levelNames.contains paramName) $ throwError ("unknown universe level " ++ paramName);
pure $ mkLevelParam paramName
else if kind == `Lean.Parser.Level.addLit then do
lvl ← elabLevel (stx.getArg 0);
else if kind == identKind then
let paramName := stx.getId
unless ((← read).levelNames.contains paramName) do
throwError ("unknown universe level " ++ paramName)
return mkLevelParam paramName
else if kind == `Lean.Parser.Level.addLit then
let lvl ← elabLevel (stx.getArg 0)
match (stx.getArg 2).isNatLit? with
| some val => pure (lvl.addOffset val)
| none => throwIllFormedSyntax
else
throwError "unexpected universe level syntax kind"
end Level
export Level (LevelElabM)
end Elab
end Lean
end Lean.Elab.Level

View file

@ -20,8 +20,16 @@ import Lean.Elab.Attributes
namespace Lean
namespace Elab
namespace Level -- Hack: namespaces created with new frontend cannot be seen by old one
end Level
open Level (LevelElabM) -- Hack: exports created by new frontend cannot be seen by old old
namespace Term
/-
Set isDefEq configuration for the elaborator.
Note that we enable all approximations but `quasiPatternApprox`