-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
STJ: Avoid duplicate initialization of required or init-only properties #97726
Merged
eiriktsarpalis
merged 12 commits into
dotnet:main
from
manandre:stj-duplicate-required-init
Feb 5, 2024
Merged
Changes from 3 commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
e95dee6
STJ: Avoid duplicate initialization of required or init-only properties
manandre 552e69e
Add more test combinations
manandre b970a0c
Move shadowed properties check
manandre 07c40bf
Update metadata flow accordingly
manandre af2c66a
Add init value for all properties
manandre 1901526
Add more shadowing test cases
manandre bdea6d1
Remove extra empty line
manandre 4e420c9
Move deduplication logic to property initializer parser.
eiriktsarpalis 40e1e2b
Merge branch 'main' into stj-duplicate-required-init
eiriktsarpalis 1a64f11
Revert DefaultJsonTypeInfoResolver changes
eiriktsarpalis 087c11c
Update src/libraries/System.Text.Json/tests/System.Text.Json.SourceGe…
eiriktsarpalis 81b605c
Update src/libraries/System.Text.Json/tests/System.Text.Json.SourceGe…
eiriktsarpalis File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's an equivalent implementation in the reflection resolver:
runtime/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Metadata/DefaultJsonTypeInfoResolver.Helpers.cs
Line 141 in 3a382f2
Should this be updated as well? Do we know the tests are not failing in that case as well?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, we should keep both implementations aligned. For reflection flow, the deduplication is done at one place for both get and set operations, whereas for the source generation flow the fast-path and initializers deduplication logic were split. With this PR it is handled at the same place for all flows.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Taking a closer look at the implementation -- this method ultimately calls into the
AddPropertyWithConflictResolution
method which handles conflict resolution (including shadowed properties):runtime/src/libraries/System.Text.Json/gen/JsonSourceGenerator.Parser.cs
Lines 1037 to 1039 in b94a82d
My impression is that the bug is caused by a missed case in that logic, so it seems to me that it's this particular logic that should be debugged.
If you don't know how to debug source generator code, the easiest way to do that is by adding a unit test in
System.Text.Json.SourceGeneration.Roslyn*.Unit.Tests
and debugging them.