Skip to content

Fix SchComponent.Comment not persisting through SchDoc/SchLib writers - #48

Open
Andrei-Errapart wants to merge 1 commit into
issus:masterfrom
Andrei-Errapart:SchDocWriterBug
Open

Fix SchComponent.Comment not persisting through SchDoc/SchLib writers#48
Andrei-Errapart wants to merge 1 commit into
issus:masterfrom
Andrei-Errapart:SchDocWriterBug

Conversation

@Andrei-Errapart

@Andrei-Errapart Andrei-Errapart commented Aug 7, 2026

Copy link
Copy Markdown

Summary

SchComponent.Comment edits were silently dropped by both writers. SchDocReader populated Comment from DesignItemId instead of the child "Comment" parameter that SchLibReader correctly used, and neither writer ever pushed the property back into that parameter, so edits (and WithComment() on from-scratch components) had nowhere to go. SchDocWriter's byte-faithful replay path made this worse for loaded documents: it re-emits the exact bytes captured at read time whenever the primitive count is unchanged, swallowing even direct edits to the backing parameter's Value.

Changes

  • SchDocReader/SchLibReader now derive Comment from the child "Comment" parameter once children are attached, recording a CommentAsRead baseline (internal) so the writers can tell an explicit edit from an untouched load.
  • New SchLibWriter.SyncComponentComment pushes an edited Comment back into that parameter (creating one if absent); used by both writers.
  • SchDocWriter disables its byte-faithful fast path only when a Comment edit is actually detected, so untouched documents still round-trip byte-identical.
  • Regression tests in SchDocRoundTripTests/SchLibRoundTripTests covering mutate-after-load and from-scratch WithComment().

Test Plan

  • Existing tests pass (dotnet test) — full suite at this commit: 854 passed, 0 failed, 10 skipped (pre-existing data-dependent skips, unrelated to this change)
  • New tests added for new behavior — 4 new tests: SchDocRoundTripTests.WriteThenRead_ComponentComment_RoundTrips and WriteThenRead_RealFile_MutatedComment_Persists (real-file regression against the byte-replay path, using TestData/DAC.SchDoc), SchLibRoundTripTests.Component_Comment_RoundTrips and Component_MutatedComment_Persists

Checklist

  • Code follows existing style and conventions
  • Public API changes are documented with XML doc comments — no public API surface change: the two new members (SchComponent.CommentAsRead, SchLibWriter.SyncComponentComment) are internal, and both carry XML doc comments anyway
  • No breaking changes (or clearly identified below) — no signature changes. One behavioral change, which is the fix itself: for .SchDoc reads, SchComponent.Comment now reports the child "Comment" parameter's value instead of DesignItemId whenever that parameter exists (matching SchLibReader and what Altium itself displays/persists). Code that relied on the old, incorrect value would observe the difference.

SchDocReader populated Comment from DesignItemId instead of the child
"Comment" parameter SchLibReader correctly used, and neither writer
ever pushed the property back into that parameter, so edits (and
WithComment() on from-scratch components) were silently dropped.
SchDocWriter's byte-faithful replay path made this worse for loaded
documents: it re-emits the exact bytes captured at read time whenever
the primitive count is unchanged, swallowing even direct edits to the
backing parameter's Value.

- SchDocReader/SchLibReader now derive Comment from the child
  "Comment" parameter once children are attached, recording a
  CommentAsRead baseline.
- New SchLibWriter.SyncComponentComment pushes an edited Comment back
  into that parameter (creating one if absent), used by both writers.
- SchDocWriter disables its byte-faithful fast path only when a
  Comment edit is actually detected, so untouched documents still
  round-trip byte-identical.
- Add regression tests in SchDocRoundTripTests/SchLibRoundTripTests
  covering mutate-after-load and from-scratch WithComment.
@Andrei-Errapart

Copy link
Copy Markdown
Author

CI for this branch passed on my fork (same workflow, same base commit): https://github.com/Andrei-Errapart/AltiumSharp/actions/runs/32387331089

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant