meziantou / Meziantou.Analyzer

A Roslyn analyzer to enforce some good practices in C#.
MIT License
934 stars 48 forks source link

Most of the Blazor rules do not work against App on .net 8.0 #703

Closed lksr-demant closed 6 months ago

lksr-demant commented 6 months ago

Version of the Meziantou.Analyzer NuGet package

2.0.145

Rule Identifier

MA0115

Target Framework

net8.0

C# Language version

C#12

Description

Hi, I'm trying to setup Meziantou.Analyzer for Blazor project on .net 8.0. It seems that some of the rules (MA0115, MA0116, MA0122, MA0119, MA0120) do not work. When I check them against project on .net 7.0 at least MA0115 works fine.

PS: I downloaded your code on my machine and assure that it compiles and all UnitTests (also for MA0115) passes.

Reproduction Steps

Minimal code:

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">

  <PropertyGroup>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
    <StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Meziantou.Analyzer" Version="2.0.145">
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="8.0.2" />
  </ItemGroup>

</Project>

Other information

No response

meziantou commented 6 months ago
lksr-demant commented 6 months ago

Hi, at least MA0117 and MA0118 works fine image

Generated from code like

@code {

    [SupplyParameterFromQuery] // MA0116: Missing [Parameter] attribute - DO NOT WORK
    public string? Value2 { get; set; }

    [EditorRequired] // MA0117: Missing [Parameter] attribute - WORKS
    public string? Value { get; set; }

    [JSInvokable] // MA0118: The method must be public - WORKS
    internal static int[] ReturnArray()
    {
        return [1, 2, 3];
    }
}

Which is strange because from what I see in your repo both MA0116 and MA0117 comes from one Analyzer class ParameterAttributeForRazorComponentAnalyzer. When I use same code in project with .net 7.0 then all works fine!


λ dotnet --info .NET SDK: Version: 8.0.200 Commit: 438cab6a9d Workload version: 8.0.200-manifests.e575128c

Runtime Environment: OS Name: Windows OS Version: 10.0.19045 OS Platform: Windows RID: win-x64 Base Path: C:\Program Files\dotnet\sdk\8.0.200\

.NET workloads installed: [android] Installation Source: VS 17.9.34622.214, VS 17.9.34310.174 Manifest Version: 34.0.52/8.0.100 Manifest Path: C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.android\34.0.52\WorkloadManifest.json Install Type: Msi

[maui-windows] Installation Source: VS 17.9.34622.214, VS 17.9.34310.174 Manifest Version: 8.0.6/8.0.100 Manifest Path: C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.maui\8.0.6\WorkloadManifest.json Install Type: Msi

[maccatalyst] Installation Source: VS 17.9.34622.214, VS 17.9.34310.174 Manifest Version: 17.2.8004/8.0.100 Manifest Path: C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.maccatalyst\17.2.8004\WorkloadManifest.json Install Type: Msi

[ios] Installation Source: VS 17.9.34622.214, VS 17.9.34310.174 Manifest Version: 17.2.8004/8.0.100 Manifest Path: C:\Program Files\dotnet\sdk-manifests\8.0.100\microsoft.net.sdk.ios\17.2.8004\WorkloadManifest.json Install Type: Msi

Host: Version: 8.0.2 Architecture: x64 Commit: 1381d5ebd2

.NET SDKs installed: 7.0.116 [C:\Program Files\dotnet\sdk] 8.0.100 [C:\Program Files\dotnet\sdk] 8.0.200 [C:\Program Files\dotnet\sdk]

.NET runtimes installed: Microsoft.AspNetCore.App 3.1.32 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 6.0.25 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 6.0.27 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 7.0.14 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 7.0.16 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 8.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.AspNetCore.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] Microsoft.NETCore.App 3.1.32 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 6.0.25 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 6.0.27 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 7.0.14 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 7.0.16 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 8.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.NETCore.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] Microsoft.WindowsDesktop.App 3.1.32 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 6.0.25 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 6.0.27 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 7.0.14 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 7.0.16 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 8.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] Microsoft.WindowsDesktop.App 8.0.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other architectures found: x86 [C:\Program Files (x86)\dotnet] registered at [HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\InstallLocation]

meziantou commented 6 months ago

Can you try with the latest SDK (Version: 8.0.201)? I think it contains some fixes related to analyzers.

I'll try to reproduce the bug on my side later, maybe this weekend.

meziantou commented 6 months ago

Note that some rules such as MA0116 and MA0122 are not reported on .NET 8 as the attributes are now useless. More info: https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-8-preview-6/?WT.mc_id=DT-MVP-5003978#cascade-query-string-values-to-blazor-components

On my machine the analyzer seems to work correctly on .NET 8 with the latest SDK. Could you provide a repro if you still have the issue?

lksr-demant commented 6 months ago

Unfortunately after installing new SDK situation do not changes.

Repro steps:

  1. With this repository BlazorWithRoslynAnalyzersClean.zip

  2. Go into solution folder. From cmd execute "dotnet build"

  3. I get following errors. MA0115 and MA0116 are valid just for .net 7.0 project. Eventhough MA0116 is useless and not reporten on .net8.0 MA0115 still should work, right?

D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzers\BlazorWithRoslynAnalyzers.Client\Pages\Index.razor(13,20): error MA0117: Parameters with [EditorRequired] attributes should also be marked as [Parameter] (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0117.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzers\BlazorWithRoslynAnalyzers.Client\BlazorWithRoslynAnalyzers.Client.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzers\BlazorWithRoslynAnalyzers.Client\Program.cs(5,1): error MA0004: Use Task.ConfigureAwait(false) if the current SynchronizationContext is not needed (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0004.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzers\BlazorWithRoslynAnalyzers.Client\BlazorWithRoslynAnalyzers.Client.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzers\BlazorWithRoslynAnalyzers.Client\Pages\Index.razor(16,27): error MA0118: [JSInvokable] methods must be public (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0118.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzers\BlazorWithRoslynAnalyzers.Client\BlazorWithRoslynAnalyzers.Client.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\Pages\Index.razor(10,20): error MA0116: Parameters with [SupplyParameterFromQuery] attributes should also be marked as [Parameter] (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0116.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\BlazorApp7.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\Pages\Index.razor(13,20): error MA0117: Parameters with [EditorRequired] attributes should also be marked as [Parameter] (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0117.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\BlazorApp7.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\Microsoft.CodeAnalysis.Razor.Compiler.SourceGenerators\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator\Pages_Index_razor.g.cs(104,13): error MA0115: The parameter 'Undef' does not exist on component 'BlazorApp7.Components.CustomLabel' (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0115.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\BlazorApp7.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\Pages\Index.razor(16,27): error MA0118: [JSInvokable] methods must be public (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0118.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\BlazorApp7.csproj]
D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\Program.cs(11,1): error MA0004: Use Task.ConfigureAwait(false) if the current SynchronizationContext is not needed (https://github.com/meziantou/Meziantou.Analyzer/blob/main/docs/Rules/MA0004.md) [D:\src-tests\Blazor\BlazorWithRoslynAnalyzersClean\BlazorWithRoslynAnalyzersClean\BlazorApp7\BlazorApp7.csproj]
    0 Warning(s)
    8 Error(s)

λ dotnet --list-sdks 7.0.116 [C:\Program Files\dotnet\sdk] 8.0.200 [C:\Program Files\dotnet\sdk] 8.0.201 [C:\Program Files\dotnet\sdk]

λ dotnet --version 8.0.201

meziantou commented 6 months ago

MA0115 should be reported. In ASP.NET 8, Blazor introduced a new method AddComponentParameter which is not yet detected. A fix should appears soon :)

lksr-demant commented 6 months ago

I have updated to newest version and MA0115 works fine.

Thank you very much for your feedback and fast fix!!!