Skip to content

Conversation

@CybotTM
Copy link
Contributor

@CybotTM CybotTM commented Jan 22, 2026

Summary

Refactors document entry comparisons to use file path instead of object identity.

Why This Change?

Several places in the codebase compare DocumentEntryNode instances using object identity (===). This works when the same instance is used throughout, but breaks when:

  • Entries are deserialized from cache (creates new instances)
  • Entries are recreated during processing
  • Future optimizations introduce instance pooling

Using file path comparison is more robust and semantically correct.

Changes

  • RenderContext: Compare by file path instead of object identity
  • GlobalMenuPass: Compare by file path instead of object identity
  • DocumentTreeIterator: Compare by file path instead of object identity
  • ToctreeValidationPass: Compare by file path instead of object identity

Performance Impact

See Performance Analysis Report for detailed benchmarks.


Related PRs

PR Description Status
#1287 Rendering caching layer Independent
#1288 RST parsing optimizations Independent
#1289 CLI container caching Independent
#1290 This PR - DocumentEntryNode identity refactoring
#1292 ProjectNode O(1) document lookup Independent

All PRs can be merged independently in any order.

…umentEntryNode

Replace object identity comparison (===) with file path comparison when
matching DocumentEntryNode instances. The file path is the natural unique
identifier for a document entry, making identity comparison fragile and
unnecessarily restrictive.

This change:
- Makes the code more robust to refactoring that may create new instances
- Aligns with how SectionEntryNode comparison already works (uses getId())
- Enables future optimizations that may cache or recreate entry objects

Changed locations:
- RenderContext::getDocumentNodeForEntry()
- GlobalMenuPass (root document lookup)
- DocumentTreeIterator::current()

No behavior change - documents are still matched by their file path,
which was always the intent.
- Cache root document entry for instant retrieval
- Use direct hash lookup in getDocumentEntry() with fallback for
  numerically-indexed arrays from setDocumentEntries()
- Invalidate cache in setDocumentEntries() and reset()

This optimization is enabled by the previous commit's refactoring
from object identity to file path comparison.
@CybotTM
Copy link
Contributor Author

CybotTM commented Jan 23, 2026

Closing in favor of a cleaner PR with distinct commits for: (1) preparatory refactor, (2) performance improvement, (3) test adaptation. See new PR for combined changes.

@CybotTM CybotTM closed this Jan 23, 2026
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