# Fix Analyzer Bug

> Use when fixing a Roslynator analyzer false positive or false negative, RCS####, RR####, or CS####/RCF#### regression, incorrect diagnostic reporting, or bug report citing a specific rule id — not when adding new rules.

- Skill: `dotnet/fix-analyzer-bug` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add dotnet/fix-analyzer-bug`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dotnet/fix-analyzer-bug/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: .NET (Microsoft) (https://skillmd.com/u/dotnet)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/dotnet/fix-analyzer-bug

---


# Fix Analyzer Bug

## Overview

Reproduce in an existing test file, minimal code fix, changelog entry. Highest-frequency contributor task.

## When to Use

- Analyzer reports when it should not (false positive)
- Analyzer misses case it should report (false negative)
- Code fix produces wrong transformation
- Issue title includes `RCS####`, `RR####`, `CS####`, or `RCF####`

**Not for:** new rules (`add-analyzer`, `add-refactoring`, `add-compiler-diagnostic-fix`), deprecation (`deprecate-analyzer-or-refactoring`).

For test patterns use in-repo verifiers — not public NuGet testing docs.

## Quick Reference

| Prefix | Code | Tests | Verifier |
|--------|------|-------|----------|
| RCS1 | `Analyzers/CSharp/Analysis/` | `Tests/Analyzers.Tests/` | `AbstractCSharpDiagnosticVerifier` |
| RCS0 | `Formatting.Analyzers/CSharp/` | `Tests/Formatting.Analyzers.Tests/` | `AbstractCSharpDiagnosticVerifier` |
| RCS9 | `CodeAnalysis.Analyzers/CSharp/` | `Tests/CodeAnalysis.Analyzers.Tests/` | `AbstractCSharpDiagnosticVerifier` |
| RR | `Refactorings/CSharp/Refactorings/` | `Tests/Refactorings.Tests/` | `AbstractCSharpRefactoringVerifier` |
| CS / RCF | `CodeFixes/CSharp/CodeFixes/` | `Tests/CodeFixes.Tests/` | `AbstractCSharpCompilerDiagnosticFixVerifier` |

Search `DiagnosticIdentifiers.X` / `DiagnosticRules.X` / `CompilerDiagnosticIdentifiers.*` in generated files. Roslynator analyzer code fixes live in matching `.CodeFixes` projects.

## Implementation

Add `[Fact]` to existing `*Tests.cs` — new file only if none exists.

| Case | Method |
|------|--------|
| False positive | `VerifyNoDiagnosticAsync` |
| False negative | `VerifyDiagnosticAsync` with `[|...|]` |
| Analyzer/refactoring fix regression | `VerifyDiagnosticAndFixAsync` |
| Compiler fix regression | `VerifyFixAsync` (no `[|...|]` markers) |

Config-dependent: `options: Options.AddConfigOption(...)`.

Verify (adjust project and filter):

```bash
cd src && dotnet build Roslynator.sln
cd src && dotnet test Tests/Analyzers.Tests --no-build --filter "FullyQualifiedName~RCS####"
cd src && dotnet test Tests/CodeFixes.Tests --no-build --filter "FullyQualifiedName~CS####"
cd src && dotnet format Roslynator.sln --no-restore --verify-no-changes --severity info
```

Changelog examples: [references/changelog-examples.md](references/changelog-examples.md).

## Pull request

When the fix targets a GitHub issue, the PR body **must** include a closing keyword on its own line (same pattern as recent analyzer fix PRs):

```markdown
Fixes #NNNN
```

Use `Fixes #NNNN` or `Closes #NNNN`. A markdown link such as `[#1812](https://github.com/dotnet/roslynator/issues/1812)` does **not** create a GitHub issue reference and will not auto-close the issue.

In `CHANGELOG.md`, end the entry with `([PR](https://github.com/dotnet/roslynator/pull/NNNN))` (see [references/changelog-examples.md](references/changelog-examples.md)). Do not use an issue link there.

Place `Fixes #NNNN` after the Summary bullets and before the Test plan, for example:

```markdown
## Summary
- …

Fixes #1812

## Test plan
- …
```

## Common Mistakes

| Mistake | Fix |
|---------|-----|
| Copy test pattern from `analyzers-testing.md` | In-repo `AbstractCSharpDiagnosticVerifier` + `DiagnosticRules.X` |
| Copy from `compiler-diagnostic-fixes-testing.md` | In-repo `AbstractCSharpCompilerDiagnosticFixVerifier` + `CompilerDiagnosticIdentifiers.*` |
| New test file per case | Extend existing `RCS####...Tests.cs` or `CS####...Tests.cs` |
| Change `Analyzers.xml` for logic bugs | Metadata only for docs/severity defaults |
| `[|...|]` in compiler fix tests | Compiler diagnostic location is implicit |
| Full test suite | Filter by rule id is enough |
| Skip test | CONTRIBUTING.md requires tests for bug fixes |
| Changelog ends with issue link (`[#NNNN](.../issues/...)`) | End with `([PR](https://github.com/dotnet/roslynator/pull/NNNN))` |
| Markdown-only issue link in PR body | Use `Fixes #NNNN` so GitHub links and auto-closes the issue |

