37 lines
1.0 KiB
Plaintext
37 lines
1.0 KiB
Plaintext
/- A tool for analysing Lean source code. -/
|
|
import Pantograph.Frontend
|
|
|
|
open Lean
|
|
|
|
namespace Pantograph
|
|
|
|
def fail (s : String) : IO UInt32 := do
|
|
IO.eprintln s
|
|
return 2
|
|
|
|
def dissect (args: List String): IO UInt32 := do
|
|
let fileName :: _args := args | fail s!"Must supply a file name"
|
|
let file ← IO.FS.readFile fileName
|
|
let (context, state) ← do Frontend.createContextStateFromFile file fileName (env? := .none) {}
|
|
let frontendM: Elab.Frontend.FrontendM _ :=
|
|
Frontend.mapCompilationSteps λ step => do
|
|
IO.println s!"🐈 {step.stx.getKind.toString}"
|
|
for (tree, i) in step.trees.zipIdx do
|
|
IO.println s!"🌲[{i}] {← tree.toString}"
|
|
let (_, _) ← frontendM.run context |>.run state
|
|
return 0
|
|
|
|
end Pantograph
|
|
|
|
open Pantograph
|
|
|
|
def help : IO UInt32 := do
|
|
IO.println "Usage: tomograph dissect FILE_NAME"
|
|
return 1
|
|
|
|
def main (args : List String) : IO UInt32 := do
|
|
let command :: args := args | help
|
|
match command with
|
|
| "dissect" => dissect args
|
|
| _ => fail s!"Unknown command {command}"
|