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
This commit is contained in:
2026-06-07 16:08:51 +03:00
parent 1f0baefa5a
commit e1038059c2
+31 -4
View File
@@ -554,26 +554,53 @@ func Cli_BuildProject(projectDir: String) -> int {
} }
// Merge declarations from this module into userMerged // Merge declarations from this module into userMerged
var decl: *Decl = mod.firstItem; var decl: *Decl = mod.firstItem;
var fileDeclCount: int = 0;
while decl != null as *Decl { while decl != null as *Decl {
let next: *Decl = decl.childDecl2; let next: *Decl = decl.childDecl2;
decl.childDecl2 = null as *Decl; decl.childDecl2 = null as *Decl;
// Flatten module declarations // Flatten module declarations
if decl.kind == dkModule { if decl.kind == dkModule {
var inner: *Decl = decl.childDecl1; 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 { while inner != null as *Decl {
let innerNext: *Decl = inner.childDecl2; let innerNext: *Decl = inner.childDecl2;
inner.childDecl2 = userMerged.firstItem; inner.childDecl2 = null as *Decl;
userMerged.firstItem = inner; if userMerged.firstItem == null as *Decl {
userMerged.firstItem = inner;
last = inner;
} else {
last.childDecl2 = inner;
last = inner;
}
userMerged.itemCount = userMerged.itemCount + 1; userMerged.itemCount = userMerged.itemCount + 1;
fileDeclCount = fileDeclCount + 1;
inner = innerNext; inner = innerNext;
} }
} else { } else {
decl.childDecl2 = userMerged.firstItem; decl.childDecl2 = null as *Decl;
userMerged.firstItem = 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; userMerged.itemCount = userMerged.itemCount + 1;
fileDeclCount = fileDeclCount + 1;
} }
decl = next; decl = next;
} }
Print(" -> ");
PrintInt(fileDeclCount as int64);
PrintLine(" decls merged");
i = i + 1; i = i + 1;
} }