refactor: Factor out `FrontendM` driver

This commit is contained in:
Leni Aniva 2024-09-08 13:44:46 -07:00
parent 27e4e45418
commit 860344f9c5
Signed by: aniva
GPG Key ID: 4D9B1C8D10EA4C50
2 changed files with 12 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/- Adapted from https://github.com/semorrison/lean-training-data -/
import Lean.Elab.Import import Lean.Elab.Import
import Lean.Elab.Command import Lean.Elab.Command
import Lean.Elab.InfoTree import Lean.Elab.InfoTree

View File

@ -29,6 +29,9 @@ end Lean.PersistentArray
namespace Pantograph.Compile namespace Pantograph.Compile
abbrev FrontendM := Elab.Frontend.FrontendM
structure CompilationStep where structure CompilationStep where
fileName : String fileName : String
fileMap : FileMap fileMap : FileMap
@ -44,7 +47,7 @@ structure CompilationStep where
Process one command, returning a `CompilationStep` and Process one command, returning a `CompilationStep` and
`done : Bool`, indicating whether this was the last command. `done : Bool`, indicating whether this was the last command.
-/ -/
def processOneCommand: Elab.Frontend.FrontendM (CompilationStep × Bool) := do def processOneCommand: FrontendM (CompilationStep × Bool) := do
let s := (← get).commandState let s := (← get).commandState
let before := s.env let before := s.env
let done ← Elab.Frontend.processCommand let done ← Elab.Frontend.processCommand
@ -57,30 +60,33 @@ def processOneCommand: Elab.Frontend.FrontendM (CompilationStep × Bool) := do
let ⟨_, fileName, fileMap⟩ := (← read).inputCtx let ⟨_, fileName, fileMap⟩ := (← read).inputCtx
return ({ fileName, fileMap, src, stx, before, after, msgs, trees }, done) return ({ fileName, fileMap, src, stx, before, after, msgs, trees }, done)
partial def processFile : Elab.Frontend.FrontendM (List CompilationStep) := do partial def collectCompilationSteps : FrontendM (List CompilationStep) := do
let (cmd, done) ← processOneCommand let (cmd, done) ← processOneCommand
if done then if done then
return [cmd] return [cmd]
else else
return cmd :: (← processFile) return cmd :: (← collectCompilationSteps)
def findSourcePath (module : Name) : IO System.FilePath := do def findSourcePath (module : Name) : IO System.FilePath := do
return System.FilePath.mk ((← findOLean module).toString.replace ".lake/build/lib/" "") |>.withExtension "lean" return System.FilePath.mk ((← findOLean module).toString.replace ".lake/build/lib/" "") |>.withExtension "lean"
def processSource (module : Name) (opts : Options := {}) : IO (List CompilationStep) := unsafe do def runFrontendMInFile { α } (module : Name) (opts : Options := {}) (m : FrontendM α): IO α := unsafe do
let file ← IO.FS.readFile (← findSourcePath module) let file ← IO.FS.readFile (← findSourcePath module)
let inputCtx := Parser.mkInputContext file module.toString let inputCtx := Parser.mkInputContext file module.toString
let (header, parserState, messages) ← Parser.parseHeader inputCtx let (header, parserState, messages) ← Parser.parseHeader inputCtx
let (env, messages) ← Elab.processHeader header opts messages inputCtx let (env, messages) ← Elab.processHeader header opts messages inputCtx
let commandState := Elab.Command.mkState env messages opts let commandState := Elab.Command.mkState env messages opts
processFile.run { inputCtx } m.run { inputCtx }
|>.run' { |>.run' {
commandState := { commandState with infoState.enabled := true }, commandState := { commandState with infoState.enabled := true },
parserState, parserState,
cmdPos := parserState.pos cmdPos := parserState.pos
} }
def processSource (module : Name) (opts : Options := {}) : IO (List CompilationStep) :=
runFrontendMInFile module opts collectCompilationSteps
end Pantograph.Compile end Pantograph.Compile