lean4-htt/tests/lean/run/grind_annotated.lean
Kim Morrison 6f4bee8421
perf: avoid re-exporting Std.Time from grind_annotated (#11372)
This PR makes the `Std.Time.Format` import in
`Lean.Elab.Tactic.Grind.Annotated` private rather than public,
preventing the entire `Std.Time` infrastructure (including timezone
databases) from being re-exported through `import Lean`.

The `grindAnnotatedExt` extension is kept private, with a new public
accessor function `isGrindAnnotatedModule` exposed for use by
`LibrarySuggestions.Basic`.

This should address the +2.5% instruction increase on `import Lean`
observed after merging #11332.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-26 04:05:08 +00:00

92 lines
3.2 KiB
Text

/-
Copyright (c) 2025 Lean FRO, LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Kim Morrison
-/
import Lean.Elab.Tactic.Grind
import Lean.LibrarySuggestions.Basic
/-!
# Tests for grind_annotated command
This file tests that:
1. The `grind_annotated` command correctly validates date formats
2. The `filterGrindAnnotated` wrapper correctly filters suggestions based on the caller
-/
open Lean Meta Elab Tactic LibrarySuggestions
/-! ## Date format validation -/
/--
error: Invalid date format: offset 0: condition not satisfied
Expected format: YYYY-MM-DD (e.g., "2025-01-15")
-/
#guard_msgs in
grind_annotated "invalid-date"
/-- info: Init.Data.List.Lemmas is grind-annotated: true -/
#guard_msgs in
#eval do
let env ← getEnv
-- Use the public API to check if a module is grind-annotated
-- First we need to get the module index for a theorem from Init.Data.List.Lemmas
match env.getModuleIdxFor? `List.eq_nil_of_length_eq_zero with
| none => logInfo "Could not find module"
| some modIdx =>
let isAnnotated := Lean.Elab.Tactic.Grind.isGrindAnnotatedModule env modIdx
logInfo m!"Init.Data.List.Lemmas is grind-annotated: {isAnnotated}"
/-! ## Filtering logic -/
/--
Create a hardcoded selector that returns a suggestion from `List.eq_nil_of_length_eq_zero`
in the grind-annotated Init.Data.List.Lemmas module.
-/
def testSelector : Selector := fun _ _ => do
return #[{
name := `List.eq_nil_of_length_eq_zero
score := 1.0
flag := none
}]
/-- info: All tests passed! -/
#guard_msgs in
example : True := by
run_tac do
let mvarId ← getMainGoal
let env ← getEnv
-- Debug: Check if List.eq_nil_of_length_eq_zero exists and get its module
let theoremName := `List.eq_nil_of_length_eq_zero
match env.getModuleIdxFor? theoremName with
| none => logInfo "Theorem has no module index"
| some modIdx =>
let _moduleName := env.header.moduleNames[modIdx.toNat]!
let _isAnnotated := Grind.isGrindAnnotatedModule env modIdx
pure ()
-- Test 1: Without filter, suggestion should be returned
let suggestions1 ← testSelector mvarId {}
unless suggestions1.size == 1 do
throwError "Test 1 failed: Expected 1 suggestion without filter, got {suggestions1.size}"
-- Test 2: With filterGrindAnnotated and caller := "grind", suggestion should be filtered out
let filteredSelector := testSelector.filterGrindAnnotated
let suggestions2 ← filteredSelector mvarId { caller := some "grind" }
unless suggestions2.size == 0 do
throwError "Test 2 failed: Expected 0 suggestions with grind caller, got {suggestions2.size}"
-- Test 3: With filterGrindAnnotated and caller := "simp", suggestion should be returned
let suggestions3 ← filteredSelector mvarId { caller := some "simp" }
unless suggestions3.size == 1 do
throwError "Test 3 failed: Expected 1 suggestion with simp caller, got {suggestions3.size}"
-- Test 4: With filterGrindAnnotated and no caller, suggestion should be returned
let suggestions4 ← filteredSelector mvarId { caller := none }
unless suggestions4.size == 1 do
throwError "Test 4 failed: Expected 1 suggestion with no caller, got {suggestions4.size}"
logInfo "All tests passed!"
trivial