lean4-htt/tests/elab/10687.lean
Garmelon 08eb78a5b2
chore: switch to new test/bench suite (#12590)
This PR sets up the new integrated test/bench suite. It then migrates
all benchmarks and some related tests to the new suite. There's also
some documentation and some linting.

For now, a lot of the old tests are left alone so this PR doesn't become
even larger than it already is. Eventually, all tests should be migrated
to the new suite though so there isn't a confusing mix of two systems.
2026-02-25 13:51:53 +00:00

48 lines
1.5 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Lean
/-! Macros in `mutual` should preserve remaining `mutual` items. -/
open Lean Elab Command Lean.PrettyPrinter
private def trace [Repr α] (name : String) (p : IO α) : IO α := do
IO.println s!"tracing: {name}"
p
syntax (name := traced) "#traced " declModifiers "def " ident optDeclSig " := " term : command
@[macro traced] def elabTracedDef : Macro := fun stx => do
match stx with
| `(command| #traced $mods:declModifiers def $name:ident $sig:optDeclSig := $body:term) => do
let nameStr := name.getId.toString
let name_ := mkIdent (name.getId.appendAfter "_")
let args := sig.raw[0].getArgs
let mut argNames := #[]
for arg in args do
argNames := argNames.push (mkIdent (arg[1][0].getId))
-- Generate the first definition: def foo_ : Type := body
let def1 := ← `(command| $mods:declModifiers def $name_ $sig:optDeclSig := $body)
-- Generate the second definition: def foo : Type := trace "foo" foo_
let traceCall := ← `(trace $(quote nameStr) ($name_ $[ $argNames:ident ]*))
let def2 := ← `(command| $mods:declModifiers def $name $sig:optDeclSig := $traceCall)
let res <- `($def1:command
$def2:command)
dbg_trace "{res.raw.prettyPrint}"
return res
| _ => Macro.throwUnsupported
#traced
def foo (x : IO Nat) : IO Nat := x
#eval foo (pure 5)
mutual
--#traced
private partial def baz (x : IO Nat) : IO Nat :=
bar (pure 7)
#traced -- this previously discarded `baz`
private partial def bar (x : IO Nat) : IO Nat :=
baz (pure 5)
end -- mutual