lean4-htt/tests/lean/Reformat.lean
Kyle Miller b56ad5a7d2
fix: apply newlines before and after comments when formatting syntax (#8626)
This PR closes #3791, making sure that the Syntax formatter inserts
whitespace before and after comments in the leading and trailing text of
Syntax to avoid having comments comment out any following syntax, and to
avoid comments' lexical syntax from being interpreted as being part of
another syntax. If the text contains newlines before or after any
comments, they are formatted as hard newlines rather than soft newlines.
For example, `--` comments will have a hard newline after them. Note:
metaprograms generating Syntax with comments should be sure to include
newlines at the ends of `--` comments.
2025-06-26 19:23:35 +00:00

34 lines
1.2 KiB
Text
Raw 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.PrettyPrinter
/-! Parse and reformat file -/
open Lean
open Lean.Elab
open Lean.Elab.Term
open Std.Format open Std
unsafe def main (args : List String) : IO Unit := do
let (debug, fn) : Bool × String := match args with
| [f, "-d"] => (true, f)
| [f] => (false, f)
| _ => panic! "usage: file [-d]"
let env ← mkEmptyEnvironment
let stx ← Lean.Parser.testParseFile env fn
let act : CoreM Format := do
withOptions (fun opts =>
opts
-- Name sanitization clears inline comments attached to identifiers.
|>.set `pp.sanitizeNames false
|>.set `trace.PrettyPrinter.format debug) do
tryFinally (PrettyPrinter.ppModule stx) printTraces
let (f, _) ← act.toIO { fileName := "", fileMap := default } { env := env }
IO.print f
let stx' ← Lean.Parser.testParseModule env fn (toString f)
if stx' != stx then
let stx := stx.raw.getArg 1
let stx' := stx'.raw.getArg 1
stx.getArgs.size.forM fun i _ => do
if stx.getArg i != stx'.getArg i then
throw $ IO.userError s!"reparsing failed:\n{stx.getArg i}\n{stx'.getArg i}"
-- abbreviated Prelude.lean, which can be parsed without elaboration
#eval main ["Reformat/Input.lean"]