Skip to content

Fix MA0050 code fixer producing an extension local function (CS1106) - #1348

Merged
meziantou merged 1 commit into
mainfrom
feature/meziantou-analyzer-1325-f2b488
Aug 26, 2026
Merged

Fix MA0050 code fixer producing an extension local function (CS1106)#1348
meziantou merged 1 commit into
mainfrom
feature/meziantou-analyzer-1325-f2b488

Conversation

@meziantou

Copy link
Copy Markdown
Owner

Fixes #1325

What changed

ValidateArgumentsCorrectlyFixer.CopyParametersWithoutDefaultValues stripped default values but kept every parameter modifier when building the generated local function's parameter list — including this.

The analyzer accepts extension methods: its only parameter guard is Parameters.All(p => p.RefKind == RefKind.None), and an extension receiver has RefKind.None. So applying the fix to an extension iterator method generated a local function declared as an extension method, which does not compile:

error CS1106: Extension method must be defined in a non-generic static class

The method now also removes the this modifier, and was renamed CreateLocalFunctionParameterList since it no longer only strips defaults.

Why params and scoped are left alone

The issue suggested defensively stripping params and scoped as well. I did not:

  • params is legal on a local function, and the forwarding call passes the array through directly, so keeping it is both valid and semantics-preserving.
  • Stripping scoped would be a regression rather than a defense — passing a scoped argument to a non-scoped parameter is a ref-safety error. (Moot in practice, since iterator methods cannot have ref struct parameters.)

Only this is actually invalid on a local function, so only this is removed.

Test

Added ReportDiagnostic_ExtensionMethod using the repro from the issue — there was no extension-method fixture in the existing tests.

I verified the test actually guards the regression: with the fixer reverted it fails (the harness compiles the fixer output, so CS1106 surfaces), and it passes with the fix in place.

Verification

  • All 17 tests of ValidateArgumentsCorrectlyAnalyzerTests pass on every supported Roslyn version (4.8, 4.14, 5.0, 5.6, 5.9).
  • dotnet run --project src/DocumentationGenerator exits 0 with no markdown changes, as expected for a code-fixer-only change.

ValidateArgumentsCorrectlyFixer copied every parameter modifier into the
generated local function, including "this". As the analyzer accepts
extension methods (an extension receiver has RefKind.None), applying the
fix to an extension iterator method produced a local function declared as
an extension method, which does not compile (CS1106).

Remove the "this" modifier when building the local function parameter
list. "params" and "scoped" are kept: both are valid on a local function,
and dropping "scoped" would break ref safety at the forwarding call.
@meziantou
meziantou enabled auto-merge (squash) August 26, 2026 19:26
@meziantou
meziantou merged commit 7930802 into main Aug 26, 2026
13 checks passed
@meziantou
meziantou deleted the feature/meziantou-analyzer-1325-f2b488 branch August 26, 2026 19:29
This was referenced Aug 27, 2026
IhateTrains pushed a commit to ParadoxGameConverters/ImperatorToCK3 that referenced this pull request Aug 27, 2026
Updated
[Meziantou.Analyzer](https://github.com/meziantou/Meziantou.Analyzer)
from 3.0.177 to 3.0.184.

<details>
<summary>Release notes</summary>

_Sourced from [Meziantou.Analyzer's
releases](https://github.com/meziantou/Meziantou.Analyzer/releases)._

## 3.0.184

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.184>

## What's Changed
* Compute the package version from the git tags instead of nuget.org by
@​meziantou in meziantou/Meziantou.Analyzer#1350


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.183...3.0.184

## 3.0.183

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.183>

## What's Changed
* Fix MA0026 crash on an unterminated block comment (#​1328) by
@​meziantou in meziantou/Meziantou.Analyzer#1346
* Fix MA0050 code fixer producing an extension local function (CS1106)
by @​meziantou in
meziantou/Meziantou.Analyzer#1348
* Fix MA0028 code fixer producing uncompilable code (#​1327) by
@​meziantou in meziantou/Meziantou.Analyzer#1347
* Fail the tests when an analyzer throws by @​meziantou in
meziantou/Meziantou.Analyzer#1349


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.182...3.0.183

## 3.0.182

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.182>

## What's Changed
* Fix MA0073 code fixer producing uncompilable code for low-precedence
operands by @​meziantou in
meziantou/Meziantou.Analyzer#1344
* Do not crash on an invalid regex in the .editorconfig (MA0003, MA0104)
by @​meziantou in
meziantou/Meziantou.Analyzer#1345


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.181...3.0.182

## 3.0.181

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.181>

## What's Changed
* Add a language attribute code fix and MA0218/MA0219 for XML comments
by @​meziantou in
meziantou/Meziantou.Analyzer#1320
* Compile the text produced by the fixer in the test harness by
@​meziantou in meziantou/Meziantou.Analyzer#1342
* Fix StackOverflow crash on cyclic local initializers
(MA0091/MA0092/MA0093) by @​meziantou in
meziantou/Meziantou.Analyzer#1341
* Avoid the Sqlite data-flow analysis on every MA0042 invocation by
@​meziantou in meziantou/Meziantou.Analyzer#1343


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.180...3.0.181

## 3.0.180

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.180>

## What's Changed
* Fix MAS0004 stopping at the first unrelated CA1507 diagnostic by
@​meziantou in meziantou/Meziantou.Analyzer#1340


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.179...3.0.180

## 3.0.179

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.179>

## What's Changed
* Fix bare `#pragma warning disable` in AvoidUsingRedundantElseAnalyzer
by @​meziantou in
meziantou/Meziantou.Analyzer#1339


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.178...3.0.179

## 3.0.178

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.178>

## What's Changed
* Fix MA0075 false positive on FormattableString.Invariant by
@​meziantou in meziantou/Meziantou.Analyzer#1322


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.177...3.0.178

Commits viewable in [compare
view](meziantou/Meziantou.Analyzer@3.0.177...3.0.184).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Meziantou.Analyzer&package-manager=nuget&previous-version=3.0.177&new-version=3.0.184)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Aug 27, 2026
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.

MA0050 code fixer copies the this modifier into the generated local function (CS1106)

1 participant