Fix coverage instrumentation changing constructor execution order #355
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
When Rooibos code coverage was enabled, the generated instrumented code changed the constructor execution order between base and derived classes. In the instrumented output, coverage tracking calls were inserted before
super()calls, whereassuper()should execute first to maintain standard class construction semantics.Before this fix:
This could potentially change initialization behavior and timing, violating the expected constructor call sequence.
Solution
Modified the
CodeCoverageProcessorto detectsuper()calls and handle them specially:super()call expression statementsuper()calls, coverage tracking is inserted after the call instead of before itsuper()executes first, followed by coverage trackingAfter this fix:
Implementation Details
isSuperCallStatement()method to identifysuper()calls in the ASTconvertSuperCallToCoverageStatement()method that usesarraySplice(owner, key + 1, 0, parsed)instead ofarraySplice(owner, key, 0, parsed)to insert coverage tracking after the statementExpressionStatementhandler in the AST walker to use special handling forsuper()callsTesting
Added comprehensive tests covering:
super()callsAll existing tests continue to pass, confirming no regressions were introduced.
Impact
This fix ensures that code instrumentation preserves the original constructor call sequence and semantics, addressing the issue where coverage mode could change the initialization order of class hierarchies.
Original prompt
Fixes #354
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.