lean4-htt/src/Lean/Compiler
Kim Morrison 5f3ca3ac3d
feat: unify name demangling with single Lean implementation (#12539)
This PR replaces three independent name demangling implementations
(Lean, C++, Python) with a single source of truth in
`Lean.Compiler.NameDemangling`. The new module handles the full
pipeline: prefix parsing (`l_`, `lp_`, `_init_`, `initialize_`,
`lean_apply_N`, `_lean_main`), postprocessing (suffix flags, private
name stripping, hygienic suffix stripping, specialization contexts),
backtrace line parsing, and C exports via `@[export]`.

The C++ runtime backtrace handler now calls the Lean-exported functions
instead of its own 792-line reimplementation. This is safe because
`print_backtrace` is only called from `lean_panic_impl` (soft panics),
not `lean_internal_panic`.

The Python profiler demangler (`script/profiler/lean_demangle.py`) is
replaced with a thin subprocess wrapper around a Lean CLI tool,
preserving the `demangle_lean_name` API so downstream scripts work
unchanged.

**New files:**
- `src/Lean/Compiler/NameDemangling.lean` — single source of truth (483
lines)
- `tests/lean/run/demangling.lean` — comprehensive tests (281 lines)
- `script/profiler/lean_demangle_cli.lean` — `c++filt`-style CLI tool

**Deleted files:**
- `src/runtime/demangle.cpp` (792 lines)
- `src/runtime/demangle.h` (26 lines)
- `script/profiler/test_demangle.py` (670 lines)

Net: −1,381 lines of duplicated C++/Python code.

🤖 Prepared with Claude Code

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 12:29:35 +00:00
..
IR feat: extract simple array literals as static initializers (#12724) 2026-02-27 18:42:21 +00:00
LCNF feat: make the borrow inference explain itself (#12810) 2026-03-05 14:18:13 +00:00
BorrowedAnnotation.lean refactor: module-ize Lean (#9330) 2025-07-25 12:02:51 +00:00
ClosedTermCache.lean fix: closed term cache (#12024) 2026-01-16 12:41:54 +00:00
CSimpAttr.lean feat: shake: track [csimp] uses (#12351) 2026-02-07 14:27:00 +00:00
ExportAttr.lean chore: rename Substring to Substring.Raw (#11154) 2025-11-16 09:30:04 +00:00
ExternAttr.lean chore: rename String.ValidPos to String.Pos (#11240) 2025-11-24 16:40:21 +00:00
FFI.lean refactor: use String.split instead of String.splitOn or String.splitToList (#11250) 2025-11-19 09:35:19 +00:00
ImplementedByAttr.lean perf: put the compiler off the critical path (#12335) 2026-02-05 20:39:11 +00:00
InitAttr.lean perf: separate meta and non-meta initializers (#12016) 2026-02-26 08:05:19 +00:00
InlineAttrs.lean refactor: use isRecursiveDefinition when validating macro_inline (#12106) 2026-01-22 16:31:34 +00:00
IR.lean refactor: port simple ground expr extraction from IR to LCNF (#12705) 2026-02-26 15:10:01 +00:00
LCNF.lean chore: remove the LCNF testing framework (#12207) 2026-01-28 10:09:30 +00:00
Main.lean refactor: module-ize Lean (#9330) 2025-07-25 12:02:51 +00:00
MetaAttr.lean chore: shake: fix handling of meta structure etc (#11701) 2025-12-16 16:28:39 +00:00
ModPkgExt.lean fix: symbol name for native boxed declarations in the interpreter (#12095) 2026-01-21 20:38:29 +00:00
NameDemangling.lean feat: unify name demangling with single Lean implementation (#12539) 2026-03-06 12:29:35 +00:00
NameMangling.lean perf: separate meta and non-meta initializers (#12016) 2026-02-26 08:05:19 +00:00
NeverExtractAttr.lean chore: remove redundant imports in core (#10750) 2025-10-16 20:27:46 +00:00
NoncomputableAttr.lean fix: mark failed compilations as noncomputable (#12625) 2026-02-23 09:18:21 +00:00
Old.lean refactor: use String.Slice in String.take and variants (#11180) 2025-11-18 16:13:48 +00:00
Options.lean feat: make the borrow inference explain itself (#12810) 2026-03-05 14:18:13 +00:00
Specialize.lean chore: shake core (#12276) 2026-02-05 09:10:32 +00:00