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>
127 lines
4.4 KiB
Text
127 lines
4.4 KiB
Text
{"version": 1,
|
|
"uri": "file:///interactiveTraces.lean",
|
|
"diagnostics":
|
|
[{"source": "Lean 4",
|
|
"severity": 3,
|
|
"range":
|
|
{"start": {"line": 19, "character": 0}, "end": {"line": 19, "character": 5}},
|
|
"message": "(trace)",
|
|
"fullRange":
|
|
{"start": {"line": 19, "character": 0},
|
|
"end": {"line": 19, "character": 5}}}]}
|
|
{"lineRange": {"start": 0, "end": 21}}
|
|
[{"source": "Lean 4",
|
|
"severity": 3,
|
|
"range":
|
|
{"start": {"line": 19, "character": 0}, "end": {"line": 19, "character": 5}},
|
|
"message":
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg":
|
|
{"append":
|
|
[{"tag": [{"expr": {"text": "✅️"}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": " "}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": "root"}}, {"text": ""}]}]},
|
|
"indent": 0,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children":
|
|
{"strict":
|
|
[{"tag":
|
|
[{"trace":
|
|
{"msg":
|
|
{"append":
|
|
[{"tag": [{"expr": {"text": "✅️"}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": " "}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": "child1"}}, {"text": ""}]}]},
|
|
"indent": 2,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children":
|
|
{"strict":
|
|
[{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child11"}}, {"text": ""}]},
|
|
"indent": 4,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]},
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child12"}}, {"text": ""}]},
|
|
"indent": 4,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]},
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child13"}}, {"text": ""}]},
|
|
"indent": 4,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]}]}}},
|
|
{"text": ""}]},
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg":
|
|
{"append":
|
|
[{"tag": [{"expr": {"text": "✅️"}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": " "}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": "child2"}}, {"text": ""}]}]},
|
|
"indent": 2,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children":
|
|
{"strict":
|
|
[{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child21"}}, {"text": ""}]},
|
|
"indent": 4,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]},
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child22"}}, {"text": ""}]},
|
|
"indent": 4,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]}]}}},
|
|
{"text": ""}]},
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg":
|
|
{"append":
|
|
[{"tag": [{"expr": {"text": "✅️"}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": " "}}, {"text": ""}]},
|
|
{"tag": [{"expr": {"text": "child3"}}, {"text": ""}]}]},
|
|
"indent": 2,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children":
|
|
{"strict":
|
|
[{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child31"}}, {"text": ""}]},
|
|
"indent": 4,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]}]}}},
|
|
{"text": ""}]},
|
|
{"tag":
|
|
[{"trace":
|
|
{"msg": {"tag": [{"expr": {"text": "child4"}}, {"text": ""}]},
|
|
"indent": 2,
|
|
"collapsed": false,
|
|
"cls": "Meta.debug",
|
|
"children": {"strict": []}}},
|
|
{"text": ""}]}]}}},
|
|
{"text": ""}]},
|
|
"fullRange":
|
|
{"start": {"line": 19, "character": 0}, "end": {"line": 19, "character": 5}}}]
|