-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Add CA2026 analyzer: Prefer JsonElement.Parse over JsonDocument.Parse().RootElement #51209
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
base: main
Are you sure you want to change the base?
Conversation
…ttern Co-authored-by: stephentoub <[email protected]>
@copilot, there are some build failures:
|
Co-authored-by: stephentoub <[email protected]>
Fixed in commit b4387d1. Ran |
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...odeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.Fixer.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Show resolved
Hide resolved
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.
Pull Request Overview
This PR implements a new Roslyn analyzer (CA2026) that detects patterns where developers access JsonDocument.Parse().RootElement
without proper disposal and suggests using JsonElement.Parse()
instead to avoid resource leaks. The analyzer includes both diagnostic detection and an automatic code fixer.
- Implements CA2026 analyzer to detect
JsonDocument.Parse().RootElement
patterns without disposal - Provides automatic code fix to replace with
JsonElement.Parse()
calls - Includes comprehensive unit tests covering various scenarios and edge cases
Reviewed Changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 1 comment.
Show a summary per file
File | Description |
---|---|
PreferJsonElementParseTests.cs | Comprehensive unit tests for both analyzer and code fixer functionality |
DiagnosticCategoryAndIdRanges.txt | Updates reliability rule range to include CA2026 |
Multiple .xlf files | Localization updates with new resource strings marked as "new" |
PreferJsonElementParse.cs | Main analyzer implementation detecting the problematic pattern |
PreferJsonElementParse.Fixer.cs | Code fixer that replaces JsonDocument.Parse().RootElement with JsonElement.Parse() |
MicrosoftNetCoreAnalyzersResources.resx | Resource strings for diagnostic messages |
AnalyzerReleases.Unshipped.md | Adds CA2026 to unshipped analyzer releases |
Microsoft.CodeAnalysis.NetAnalyzers.sarif | Auto-generated SARIF metadata for the new rule |
Microsoft.CodeAnalysis.NetAnalyzers.md | Auto-generated documentation for the new analyzer |
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
- Use WellKnownTypeNames for type strings - Replace open-coded loops with LINQ - Remove unnecessary disposal checks (if RootElement is accessed directly off Parse, JsonDocument is never disposed) - Delete unused ContainsOperation and IsImmediateUseWithoutDisposal methods - Only raise diagnostic when JsonElement.Parse has matching overload with same parameter types Co-authored-by: stephentoub <[email protected]>
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
- Move jsonElementParseOverloads collection up and use it to check if JsonElement.Parse exists - Replace LINQ-based parameter matching with loop to avoid lambda captures and enable early exit - Improves performance by eliminating unnecessary allocations Co-authored-by: stephentoub <[email protected]>
...odeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.Fixer.cs
Outdated
Show resolved
Hide resolved
...soft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParse.cs
Outdated
Show resolved
Hide resolved
...is.NetAnalyzers.UnitTests/Microsoft.NetCore.Analyzers/Runtime/PreferJsonElementParseTests.cs
Show resolved
Hide resolved
- Consolidate multiple if checks into single conditions in both analyzer and fixer - Add test for case where JsonElement.Parse has no matching overload - Add test for chained property access after RootElement - Add test to verify no diagnostic when RootElement accessed via variable - Add test for multiple parameters with matching overload - Add test for pattern in lambda expressions - All 13 tests now passing Co-authored-by: stephentoub <[email protected]>
Implementation completed for JsonDocument.Parse().RootElement analyzer:
Summary
Successfully implemented CA2026 analyzer and code fixer for detecting
JsonDocument.Parse().RootElement
patterns without disposal. The analyzer helps developers avoid resource leaks by suggesting the use ofJsonElement.Parse()
instead.Key features:
Test coverage includes:
Files changed:
PreferJsonElementParse.cs
PreferJsonElementParse.Fixer.cs
PreferJsonElementParseTests.cs
MicrosoftNetCoreAnalyzersResources.resx
DiagnosticCategoryAndIdRanges.txt
,AnalyzerReleases.Unshipped.md
,WellKnownTypeNames.cs
Microsoft.CodeAnalysis.NetAnalyzers.md
,Microsoft.CodeAnalysis.NetAnalyzers.sarif
Original prompt
This pull request was created as a result of the following prompt from Copilot chat.
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.