lean4-htt/tests/elab/extraModUses.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

328 lines
6.7 KiB
Text

module
import all Lean.ExtraModUses
public meta import Lean.Elab.Tactic.Basic
/-!
# Test for module dependencies described by ExtraModUses
-/
meta def resetExtraModUses : Lean.CoreM Unit := do
Lean.modifyEnv (Lean.PersistentEnvExtension.setState Lean.extraModUses · ⟨[], ∅⟩)
Lean.modifyEnv (Lean.PersistentEnvExtension.setState Lean.isExtraRevModUseExt · ⟨[], ()⟩)
meta def Lean.ExtraModUse.toImport (e : ExtraModUse) : Import :=
{ e with }
meta def showExtraModUses : Lean.CoreM Unit := do
Lean.logInfo m!"Entries: {toString <| (Lean.extraModUses.getEntries (← Lean.getEnv)).map (·.toImport)}\n\
Is rev mod use: {!(Lean.isExtraRevModUseExt.getEntries (← Lean.getEnv)).isEmpty}"
/-!
Test that the `resetExtraModUses` + `showExtraModUses` pair is working.
-/
#eval resetExtraModUses
/--
info: Entries: []
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Notation being used in a command is recorded (here `«term_+_»` from Init.Notation)
-/
#eval resetExtraModUses
example := 3 + 3
/--
info: Entries: [import Init.Notation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Declarations referenced using double-quoted names are recorded.
-/
#eval resetExtraModUses
def test1 := ``List.sum
/--
info: Entries: [import Init.Data.List.Basic]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
`recommended_spelling` records a dependency.
-/
#eval resetExtraModUses
recommended_spelling "id" for "id" in [id]
/--
info: Entries: [import Init.Core, import Init.Prelude]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
`syntax` records a dependency for the syntax category
(here Lean.Parser.Category.Term from Init.Notation).
-/
#eval resetExtraModUses
syntax "hi" : term
/--
info: Entries: [public import Init.Notation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Term macro expansions are tracked (here `«term_+_»` from Init.Notation)
-/
macro "macro1" : term => `(3 + 3)
#eval resetExtraModUses
def test2 := macro1
/--
info: Entries: [import Init.Notation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Tactic macro expansions are tracked (here `Lean.Parser.Tactic.tacticTrivial` from Init.Tactics)
-/
macro "macro2" : tactic => `(tactic| trivial)
#eval resetExtraModUses
public meta def test3 : True := by macro2
/--
info: Entries: [import Init.Tactics]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Tactic configuration structures are recorded.
-/
#eval resetExtraModUses
public def test4 : True := by simp +contextual
/--
info: Entries: [import Init.Tactics, meta import Init.MetaTypes]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
`omega` introduces a dependency on `Init.Omega`.
-/
#eval resetExtraModUses
public def test5 : Eq 1 1 := by omega
/--
info: Entries: [import Init.Tactics, import Init.Omega]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
References from `@[deprecated]` are tracked (here `Nat.add` from Init.Prelude)
-/
#eval resetExtraModUses
@[deprecated Nat.add "we decided to shorten the name" (since := "1010-10-10")]
def NaturalNumber.additionOperator := Nat.add
/--
info: Entries: [import Init.Notation, import Init.Prelude]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
References from `@[grind]` are tracked (here `List.append` from Init.Prelude)
-/
#eval resetExtraModUses
attribute [grind =] List.append
/--
info: Entries: [import Init.Grind.Attr, public import Init.Prelude]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Local attribute applications are tracked as private.
-/
#eval resetExtraModUses
attribute [local grind =] List.append
/--
info: Entries: [import Init.Grind.Attr, import Init.Prelude]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Coercion instances are recorded as dependencies.
-/
#eval resetExtraModUses
public def test6 : Option Bool := false
/--
info: Entries: [import Init.Data.Option.Coe, import Init.Coe]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Simp theorems (especially defeq ones) are tracked (here `Nat.pow_succ` from Init.Data.Nat.Basic)
-/
#eval resetExtraModUses
def test7 : 2 ^ 8 = 256 := by simp [Nat.pow_succ]
/--
info: Entries: [import Init.Tactics, import Init.Data.Nat.Lemmas, import Init.Data.Nat.Basic, import Init.SimpLemmas, import Init.Notation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
`register_error_explanation` creates a dependency on `Lean.ErrorExplanation`.
-/
#eval resetExtraModUses
/-- This error never occurs. If you still get it, something went wrong, sorry -/
register_error_explanation lean.never {
summary := "Not an error"
sinceVersion := "never"
}
/--
info: Entries: [meta import Lean.ErrorExplanation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
The syntax node kind in `syntax` declarations get recorded as a `meta` dependency.
-/
#eval resetExtraModUses
syntax "test_me " Lean.Parser.Term.ident : term
/--
info: Entries: [public meta import Lean.Parser.Term, public import Init.Notation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
The categories in `syntax` declarations get recorded as a `meta` dependency.
-/
#eval resetExtraModUses
syntax "test_me " rcasesPat : term
/--
info: Entries: [public import Init.RCases, public import Init.Notation]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
The quotation parser gets recorded as a `meta` dependency.
-/
#eval resetExtraModUses
def test8 : Lean.MacroM Lean.Syntax := `(Lean.Parser.Command.declaration| def a := 5)
/--
info: Entries: [import Init.Notation, import Init.Coe, meta import Lean.Parser.Command]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Elaboration attributes add dependency on the syntax node kind
(here `Lean.Parser.Tactic.done` from Init.Tactics).
-/
public meta def myElab : Lean.Elab.Tactic.Tactic := fun _ => pure ()
#eval resetExtraModUses
attribute [tactic Lean.Parser.Tactic.done] myElab
/--
info: Entries: [public import Init.Tactics]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
Similarly with formatters...
-/
public meta def myFormatter : Lean.PrettyPrinter.Formatter := fun _ => pure ()
#eval resetExtraModUses
attribute [formatter Lean.Parser.Tactic.done] myFormatter
/--
info: Entries: [public import Init.Tactics]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses
/-!
... and parenthesizers
-/
public meta def myParenthesizer : Lean.PrettyPrinter.Parenthesizer := fun _ => pure ()
#eval resetExtraModUses
attribute [parenthesizer Lean.Parser.Tactic.done] myParenthesizer
/--
info: Entries: [public import Init.Tactics]
Is rev mod use: false
-/
#guard_msgs in #eval showExtraModUses