Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Protect compiler directives during mutation #3116

Merged
merged 24 commits into from
Jan 3, 2025

Conversation

dupdob
Copy link
Member

@dupdob dupdob commented Nov 21, 2024

Ensure compiler directives (#if, #pragma....) are not mutated but kept around mutated syntax nodes.

This required small changes in every mutator, as they are not responsible for removing any directive.
I took this as an opportunity to improve the design.

Also, added generation of semantic model during mutation tests to ensure mutator related unit tests are relevant.
I may have fixed some minor issues on them.

Also added some top level statement in integration test as it was a quick win

FIxes #3081, #3102

@dupdob dupdob force-pushed the improve_mutation_of_directives branch from c6e5ac8 to 6826228 Compare November 21, 2024 17:32
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from f34711e to e9ba29d Compare November 22, 2024 10:30
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from e9ba29d to bfec606 Compare November 22, 2024 10:42
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from c3017ec to 80871b8 Compare November 22, 2024 13:09
@dupdob
Copy link
Member Author

dupdob commented Nov 22, 2024

I am happy to see this PR reduces the total number of lines, and it increases the number of mutations. This is probably related to the redesign of the pattern mutator that I modified so it no longer does some internal scan and reenabled orchestration of patterns in general

@dupdob dupdob marked this pull request as ready for review November 22, 2024 16:18
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from 4102df8 to f5bbfd9 Compare November 22, 2024 16:22
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from f5bbfd9 to df53cc3 Compare November 22, 2024 16:28
…_directives

# Conflicts:
#	integrationtest/Validation/ValidationProject/ValidateStrykerResults.cs
@rouke-broersma rouke-broersma changed the title Protect compiler directives during mutation feat: Protect compiler directives during mutation Dec 20, 2024
…_directives

# Conflicts:
#	integrationtest/Validation/ValidationProject/ValidateStrykerResults.cs
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from 01a58fe to 60a7a04 Compare December 26, 2024 16:13
@dupdob dupdob force-pushed the improve_mutation_of_directives branch from 6fad9f2 to ba24808 Compare December 26, 2024 20:41
Copy link
Contributor

@Liam-Rougoor Liam-Rougoor left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your PR, @dupdob ! It's looking pretty good.

One more question, just to verify my understanding: now, all mutators should remove almost all trivia, including directives. Then, the InstrumentationEngines re-add the removed trivia, correct?

Is this process designed like this to make sure that the trivia is only added once (to prevent duplicate directive trivia, for example)?

@dupdob
Copy link
Member Author

dupdob commented Jan 3, 2025

@Liam-Rougoor: short answer is yes.
Long answer is: I am not certain, it depends on what Roslyn handles as trivia and how it anchors is.
Discovering that directives were modeled as trivia was disconcerting, to say the least.

@rouke-broersma rouke-broersma merged commit 8a089ca into master Jan 3, 2025
10 checks passed
@rouke-broersma rouke-broersma deleted the improve_mutation_of_directives branch January 3, 2025 13:42
@dupdob
Copy link
Member Author

dupdob commented Jan 3, 2025

@richardwerkman and @rouke-broersma : an important point I forgot to raise explicitly: as per @Liam-Rougoor remarks, with this PR, mutators are no longer allowed to arbitrarily mutates sub nodes.
To be more precise: mutators are no longer allowed to force the OriginalNode property of the mutant. For now, this is enforced by the general mutation orchestration that does force the value of this property.

Impacted mutators (mainly Pattern related mutators) have been modified accordingly. It turns out this behavior was induced Stryker not properly walking pattern syntax nodes, forcing the mutators to do this on their own. Stryker now walks theses nodes properly. As such, these mutators no longer need to perform discovery on their own.

This requirement allows the general orchestration to modify the original node before it being submitted for mutation, such as stripping unnecessary trivia.

@rouke-broersma
Copy link
Member

Sounds like a good improvement, we will need to be vigilant to keep this in place.

@dupdob
Copy link
Member Author

dupdob commented Jan 3, 2025

sub node mutation fails currently, as in the mutation will fail to be injected and will raise an exception, alerting the developer he/she is violating something.
I feel this is a better design, but, as there is no trivia cleaning for now (or any other change to the original node), this is actually required. So the decision could be reversed; either way, I propose will keep it as is until we have a clear benefit to choose one or the other.

I tried for days to clean trivia beforehand, but I failed to achieve a correct orchestration while doing it, so I reverted my strategy (as presented in the slack, IIRC), but kept what I feel like a cleaner design, due to the separation of concerns between orchestration and mutation

@rouke-broersma
Copy link
Member

I don't see any reason to try to reverse this decision unless we notice that it causes other problems, as I agree that the clearer separation sounds like a good direction 👌.

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.

Stryker messes with compiler directives
4 participants