From e1038059c2348350d14e8f9c4b1c4c0946aa1fa8 Mon Sep 17 00:00:00 2001 From: dimgigov Date: Sun, 7 Jun 2026 16:08:51 +0300 Subject: [PATCH] fix(cli): change user merge from LIFO to FIFO order, add per-file decl counts - Cli_BuildProject now appends declarations (preserving original file order) instead of prepending (which reversed order) - Added per-file declaration count debug output - This makes merge order match Nim bootstrap behavior --- src/cli.bux | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/cli.bux b/src/cli.bux index 232125b..033d2f5 100644 --- a/src/cli.bux +++ b/src/cli.bux @@ -554,26 +554,53 @@ func Cli_BuildProject(projectDir: String) -> int { } // Merge declarations from this module into userMerged var decl: *Decl = mod.firstItem; + var fileDeclCount: int = 0; while decl != null as *Decl { let next: *Decl = decl.childDecl2; decl.childDecl2 = null as *Decl; // Flatten module declarations if decl.kind == dkModule { var inner: *Decl = decl.childDecl1; + // Find last item to append (preserve original order) + var last: *Decl = userMerged.firstItem; + if last != null as *Decl { + while last.childDecl2 != null as *Decl { + last = last.childDecl2; + } + } while inner != null as *Decl { let innerNext: *Decl = inner.childDecl2; - inner.childDecl2 = userMerged.firstItem; - userMerged.firstItem = inner; + inner.childDecl2 = null as *Decl; + if userMerged.firstItem == null as *Decl { + userMerged.firstItem = inner; + last = inner; + } else { + last.childDecl2 = inner; + last = inner; + } userMerged.itemCount = userMerged.itemCount + 1; + fileDeclCount = fileDeclCount + 1; inner = innerNext; } } else { - decl.childDecl2 = userMerged.firstItem; - userMerged.firstItem = decl; + decl.childDecl2 = null as *Decl; + var last2: *Decl = userMerged.firstItem; + if last2 != null as *Decl { + while last2.childDecl2 != null as *Decl { + last2 = last2.childDecl2; + } + last2.childDecl2 = decl; + } else { + userMerged.firstItem = decl; + } userMerged.itemCount = userMerged.itemCount + 1; + fileDeclCount = fileDeclCount + 1; } decl = next; } + Print(" -> "); + PrintInt(fileDeclCount as int64); + PrintLine(" decls merged"); i = i + 1; }