-
Notifications
You must be signed in to change notification settings - Fork 1.3k
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
Use NullabilityInfoContext to determine dictionary value nullability #3041
Use NullabilityInfoContext to determine dictionary value nullability #3041
Conversation
Codecov ReportAttention: Patch coverage is
❗ Your organization needs to install the Codecov GitHub app to enable full functionality. Additional details and impacted files@@ Coverage Diff @@
## master #3041 +/- ##
==========================================
- Coverage 90.59% 90.46% -0.13%
==========================================
Files 74 74
Lines 2988 2980 -8
Branches 478 470 -8
==========================================
- Hits 2707 2696 -11
- Misses 281 284 +3
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
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.
Thanks for the PR! Just a few questions but otherwise this looks great.
src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/MemberInfoExtensions.cs
Outdated
Show resolved
Hide resolved
...Swashbuckle.AspNetCore.SwaggerGen.Test/SchemaGenerator/JsonSerializerSchemaGeneratorTests.cs
Outdated
Show resolved
Hide resolved
test/Swashbuckle.AspNetCore.TestSupport/Fixtures/TypeWithNullableContext.cs
Show resolved
Hide resolved
Thanks for fixing this - the fix is now available in NuGet as version 6.7.2. |
Add-on to domaindrivendev#3043 (should be no conflict) Very similar to my previous PR: domaindrivendev#3041 In his PR, @VladimirTyrin surgically fixes a specific problem for all platforms. I suggest we use the new and fancy NET6+ toys when available, to avoid nullable logic completely in the future. I tested it with the same added test as in @VladimirTyrin's original PR.
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [Swashbuckle.AspNetCore](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore) | `6.7.1` -> `6.7.2` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Swashbuckle.AspNetCore/6.7.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Swashbuckle.AspNetCore/6.7.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Swashbuckle.AspNetCore/6.7.1/6.7.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Swashbuckle.AspNetCore/6.7.1/6.7.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>domaindrivendev/Swashbuckle.AspNetCore (Swashbuckle.AspNetCore)</summary> ### [`v6.7.2`](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v6.7.2) #### What's Changed - Use NullabilityInfoContext to determine dictionary value nullability by [@​patrikwlund](https://togithub.com/patrikwlund) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3041](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3041) **Full Changelog**: domaindrivendev/Swashbuckle.AspNetCore@v6.7.1...v6.7.2 </details> --- ### Configuration 📅 **Schedule**: Branch creation - "after 10pm every weekday,every weekend,before 5am every weekday" in timezone Europe/Berlin, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View the [repository job log](https://developer.mend.io/github/orso-co/Orso.Arpa.Api). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguMjYuMSIsInRhcmdldEJyYW5jaCI6ImRldmVsb3AiLCJsYWJlbHMiOltdfQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [Swashbuckle.AspNetCore](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore) | `6.6.2` -> `6.7.3` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Swashbuckle.AspNetCore/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Swashbuckle.AspNetCore/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Swashbuckle.AspNetCore/6.6.2/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Swashbuckle.AspNetCore/6.6.2/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [Swashbuckle.AspNetCore.Annotations](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore) | `6.6.2` -> `6.7.3` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Swashbuckle.AspNetCore.Annotations/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Swashbuckle.AspNetCore.Annotations/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Swashbuckle.AspNetCore.Annotations/6.6.2/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Swashbuckle.AspNetCore.Annotations/6.6.2/6.7.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>domaindrivendev/Swashbuckle.AspNetCore (Swashbuckle.AspNetCore)</summary> ### [`v6.7.3`](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v6.7.3) ##### What's Changed - Fix nested types nullable context check by [@​VladimirTyrin](https://togithub.com/VladimirTyrin) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3043](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3043) - Use NullabilityInfoContext to determine if member is nullable by [@​patrikwlund](https://togithub.com/patrikwlund) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3046](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3046) ##### New Contributors - [@​VladimirTyrin](https://togithub.com/VladimirTyrin) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3043](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3043) **Full Changelog**: domaindrivendev/Swashbuckle.AspNetCore@v6.7.2...v6.7.3 ### [`v6.7.2`](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v6.7.2) #### What's Changed - Use NullabilityInfoContext to determine dictionary value nullability by [@​patrikwlund](https://togithub.com/patrikwlund) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3041](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3041) **Full Changelog**: domaindrivendev/Swashbuckle.AspNetCore@v6.7.1...v6.7.2 ### [`v6.7.1`](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v6.7.1) #### What's Changed - docs: Update README.md by [@​WeihanLi](https://togithub.com/WeihanLi) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3002](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3002) - Support `[DataMember]` `IsRequired` in `NewtonsoftDataContractResolver` by [@​ouvreboite](https://togithub.com/ouvreboite) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2644](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2644) - Add API analysers by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3003](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3003) - Update README by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3004](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3004) - docs: fix example code formatting by [@​WeihanLi](https://togithub.com/WeihanLi) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3010](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3010) - Fixes nullability problems with dictionaries by [@​ozziepeeps](https://togithub.com/ozziepeeps) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3023](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3023) - Fix handling of nullable structs by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3015](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3015) - Fix missing form parameter XML documentation by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3020](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/3020) #### New Contributors - [@​ouvreboite](https://togithub.com/ouvreboite) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2644](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2644) **Full Changelog**: domaindrivendev/Swashbuckle.AspNetCore@v6.7.0...v6.7.1 ### [`v6.7.0`](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/releases/tag/v6.7.0) #### What's Changed - Allow Swagger UI CSS and JS paths to be configurable by [@​mag1art](https://togithub.com/mag1art) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2908](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2908) - Add `IncludeXmlCommentsForAssembly()` convience overload by [@​leotsarev](https://togithub.com/leotsarev) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2909](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2909) - Add snapshot tests using Verify by [@​keahpeters](https://togithub.com/keahpeters) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2929](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2929) - Add posibility to ignore properties in `[FromForm]` with `[SwaggerIgnore]` by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2928](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2928) - Adding check for existing directory and creating if doesn't exist by [@​matt-lethargic](https://togithub.com/matt-lethargic) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2927](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2927) - Default null value on nullable types caused errors by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2941](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2941) - Add additional Verify tests by [@​keahpeters](https://togithub.com/keahpeters) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2950](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2950) - Only apply a SchemaFilter to create the description on SwaggerUI by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2943](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2943) - Add support for async filters by [@​mauve](https://togithub.com/mauve) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2938](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2938) - Fix package validation by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2926](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2926) - Adding support for .NET 8 Model State attributes by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2958](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2958) - Only set Exclusive Range when they are by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2960](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2960) - `[AsParameters]` throwing error on cast when showing the description with `EnableAnnotations()` by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2962](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2962) - Fix `RequestBodyFilterAnnotation` and `MultipleFromForm` for Minimal APIs by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2963](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2963) - Swagger UI refactoring by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2942](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2942) - Add help wanted badge by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2911](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2911) - Move inline css and js to external files for SwaggerUI and ReDoc by [@​junior-santana](https://togithub.com/junior-santana) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2965](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2965) - Missing properties section when generating `IFomFile`/`IFormFileCollection` by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2972](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2972) - Missing Encoding and RequiredProperties when `IFormFile` with OpenAPI by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2979](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2979) - Use `ApiParameter.Type` by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2980](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2980) - Document arrays of generic parameters with XML comments and support overload methods by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2982](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2982) - Take into account \[JsonRequired] for System.Text.Json by [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2988](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2988) - Configure non-nullable types as required by [@​AntiGuideAkquinet](https://togithub.com/AntiGuideAkquinet) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2803](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2803) - Use `HttpMethods.IsGet()` by [@​martincostello](https://togithub.com/martincostello) in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2971](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2971) #### New Contributors - [@​mag1art](https://togithub.com/mag1art) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2908](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2908) - [@​jgarciadelanoceda](https://togithub.com/jgarciadelanoceda) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2928](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2928) - [@​matt-lethargic](https://togithub.com/matt-lethargic) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2927](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2927) - [@​mauve](https://togithub.com/mauve) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2938](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2938) - [@​junior-santana](https://togithub.com/junior-santana) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2965](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2965) - [@​AntiGuideAkquinet](https://togithub.com/AntiGuideAkquinet) made their first contribution in [https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2803](https://togithub.com/domaindrivendev/Swashbuckle.AspNetCore/pull/2803) **Full Changelog**: domaindrivendev/Swashbuckle.AspNetCore@v6.6.2...v6.7.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - "after 9pm,before 6am" in timezone Europe/Zurich, Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/smartive/cas-fee-adv-mumble-api). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40NDAuNyIsInVwZGF0ZWRJblZlciI6IjM4LjU2LjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbImRlcGVuZGVuY2llcyJdfQ==--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
A follow-up of #3022 (issue) and #3023 (PR).
The #3023 PR broke the behavior for many of our
IReadOnlyDictionary<string, string>
(and similar) members.The reason is that the logic for reading and interpreting
NullableAttribute
andNullableContextAttribute
flags is too simplified and is incorrect for several cases. It just happens to pass the current test cases because of the layout of the test type and its members.Too simplified
For example, it ignores the optimization of the flags array into a single byte if they are all the same value. An optimized
Dictionary<string, string>
has a single[1]
flag, not two or three flags as the current logic expects.It also does a lot of assumptions related to reference vs value types. An IDictionary itself can be a value type, as can the key, both of which would affect the length of the flag array. It should be checking the number of value types and the number of flags together.
It also doesn't seem to fully respect the
NullableContextAttribute
that's placed on the type containing the member. And the tests did not account for differences in the context value, as the testing type always only has a single flag. So the other flag value is not tested.My suggested change
For NET 6 and onwards we should rely on the official
NullabilityInfoContext
to tell us what is and isn't nullable. For earlier versions we can still have custom logic, which we can try to improve on if we want to put in the effort. But it will require a lot of effort to make it fully compliant and flexible.The tests I added do not pass with the custom flag logic, but they do pass with the
NullabilityInfoContext
code.The tests could be more flexible or enumerated in other more dynamic ways if you would like, to get the number of lines down, but I tried to follow the existing pattern of laying them all out in-line.