lean4-htt/src/Lean/Util
Kim Morrison e01cbf2b8f
feat: add structured TraceResult to TraceData (#12698)
This PR adds a `result? : Option TraceResult` field to `TraceData` and
populates it in `withTraceNode` and `withTraceNodeBefore`, so that
metaprograms walking trace trees can determine success/failure
structurally instead of string-matching on emoji.

`TraceResult` has three cases: `.success` (checkEmoji), `.failure`
(crossEmoji), and `.error` (bombEmoji, exception thrown). An
`ExceptToTraceResult` typeclass converts `Except` results to
`TraceResult` directly, with instances for `Bool` and `Option`.
`TraceResult.toEmoji` converts back to emoji for display. This replaces
the previous `ExceptToEmoji` typeclass — `TraceResult` is now the
primary representation rather than being derived from emoji strings.

`withTraceNodeBefore` (used by `isDefEq`) uses
`ExceptToTraceResult.toTraceResult` directly, correctly handling `Bool`
(`.ok false` = failure) and `Option` (`.ok none` = failure), with
`Except.error` mapping to `.error`.

For `withTraceNode`, `result?` defaults to `none`. Callers can pass
`mkResult?` to provide structured results; when set, the corresponding
emoji is auto-prepended to the message.

Motivated by mathlib's `#defeq_abuse` diagnostic tactic
(https://github.com/leanprover-community/mathlib4/pull/35750) which
currently string-matches on emoji to determine trace node outcomes. See
https://leanprover.zulipchat.com/#narrow/channel/113488-general/topic/backward.2EisDefEq.2ErespectTransparency

🤖 Prepared with Claude Code

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 02:42:57 +00:00
..
CollectAxioms.lean
CollectFVars.lean
CollectLevelMVars.lean
CollectLevelParams.lean
CollectLooseBVars.lean
CollectMVars.lean
Diff.lean chore: shake core (#12276) 2026-02-05 09:10:32 +00:00
FindExpr.lean
FindLevelMVar.lean
FindMVar.lean
FoldConsts.lean
ForEachExpr.lean
ForEachExprWhere.lean
FVarSubset.lean
HasConstCache.lean
Heartbeats.lean
InstantiateLevelParams.lean
LakePath.lean chore: turn on new do elaborator in Core (#12656) 2026-03-09 12:38:33 +00:00
LeanOptions.lean perf: Options.hasTrace (#12001) 2026-01-16 09:03:40 +00:00
MonadBacktrack.lean chore: turn on new do elaborator in Core (#12656) 2026-03-09 12:38:33 +00:00
MonadCache.lean
NumApps.lean
NumObjs.lean
OccursCheck.lean
ParamMinimizer.lean chore: shake core (#12276) 2026-02-05 09:10:32 +00:00
Path.lean chore: turn on new do elaborator in Core (#12656) 2026-03-09 12:38:33 +00:00
PPExt.lean chore: shake core (#12276) 2026-02-05 09:10:32 +00:00
Profile.lean chore: do not set unused Option.Decl.group (#11307) 2025-11-21 16:44:38 +00:00
Profiler.lean chore: shake core (#12276) 2026-02-05 09:10:32 +00:00
PtrSet.lean
RecDepth.lean
Recognizers.lean
ReplaceExpr.lean
ReplaceLevel.lean
Reprove.lean chore: shake core (#12276) 2026-02-05 09:10:32 +00:00
SafeExponentiation.lean
SCC.lean
ShareCommon.lean
Sorry.lean
SortExprs.lean
TestExtern.lean perf: put the compiler off the critical path (#12335) 2026-02-05 20:39:11 +00:00
Trace.lean feat: add structured TraceResult to TraceData (#12698) 2026-03-10 02:42:57 +00:00