Skip to content

Commit

Permalink
Merge pull request #842 from polyadic/fix-analyzers
Browse files Browse the repository at this point in the history
  • Loading branch information
bash authored Feb 4, 2025
2 parents a8b6d37 + f20acaf commit cc33b2b
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RoslynApiVersion>4.0.1</RoslynApiVersion>
<AnalyzerRoslynVersion>4.0.1</AnalyzerRoslynVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Funcky.Analyzers\Funcky.Analyzers.Roslyn4.0.csproj" PrivateAssets="all" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IsPackable>false</IsPackable>
<RootNamespace>Funcky.Analyzers</RootNamespace>
<AssemblyName>Funcky.Analyzers.CodeFixes</AssemblyName>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<AnalysisLevel>5</AnalysisLevel>
</PropertyGroup>
<PropertyGroup>
<!-- These are properties that are usually default to the project name, but since
we have a project per roslyn version, we need to be explicit. -->
<AssemblyName>Funcky.Analyzers.CodeFixes</AssemblyName>
<RootNamespace>Funcky.Analyzers</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<AnalyzerLanguage>cs</AnalyzerLanguage>
<RoslynApiVersion Condition="'$(RoslynApiVersion)' == '' And '$(AnalyzerRoslynVersion)' != ''">$(AnalyzerRoslynVersion)</RoslynApiVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PolySharp" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" VersionOverride="$(RoslynApiVersion)" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" VersionOverride="$(AnalyzerRoslynVersion)" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<Compile Update="CodeFixResources.Designer.cs" DesignTime="True" AutoGen="True" DependentUpon="CodeFixResources.resx" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
</ItemGroup>
<ItemGroup>
<None Update="tools\*.ps1" CopyToOutputDirectory="Always" Pack="true" PackagePath="" />
<None Update="buildTransitive\$(PackageId).targets" Pack="true" PackagePath="%(Identity)" />
</ItemGroup>
<!-- Adapted from https://github.com/dotnet/runtime/blob/4bd597ffde128555b4ff017e87c60adc2fedd178/eng/packaging.targets#L136 -->
<PropertyGroup>
Expand Down
3 changes: 3 additions & 0 deletions Funcky.Analyzers/Funcky.Analyzers.Package/Packing.targets
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
<Target Name="GetAnalyzerPackFiles"
DependsOnTargets="$(GenerateNuspecDependsOn)"
Returns="@(_AnalyzerPackFile)">
<Error Text="Project is missing the 'AnalyzerRoslynVersion' property" Condition="'$(AnalyzerRoslynVersion)' == ''" />
<Error Text="Project is missing the 'AnalyzerLanguage' property" Condition="'$(AnalyzerLanguage)' == ''" />

<PropertyGroup>
<_analyzerPath>analyzers/dotnet</_analyzerPath>
<_analyzerRoslynVersion Condition="'$(AnalyzerRoslynVersion)' != ''">$([System.Version]::Parse($(AnalyzerRoslynVersion)).Major).$([System.Version]::Parse($(AnalyzerRoslynVersion)).Minor)</_analyzerRoslynVersion>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="_Funcky_Analyzers_WarnAboutUnsupportedRoslynVersion"
Condition="'$(SupportsRoslynComponentVersioning)' != 'true'"
AfterTargets="ResolvePackageDependenciesForBuild;ResolveNuGetPackageAssets">
<Warning Code="λ.BUILD.0001"
Text="Funcky.Analyzers requires at least Roslyn 4.x i.e. Visual Studio 2022 / .NET 6.0" />
<ItemGroup>
<Analyzer Remove="@(Analyzer->WithMetadataValue('NuGetPackageId', 'Funcky.Analyzers'))" />
</ItemGroup>
</Target>
</Project>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RoslynApiVersion>4.0.1</RoslynApiVersion>
<AnalyzerRoslynVersion>4.0.1</AnalyzerRoslynVersion>
</PropertyGroup>
<Import Project="Funcky.Analyzers.targets" />
</Project>
10 changes: 7 additions & 3 deletions Funcky.Analyzers/Funcky.Analyzers/Funcky.Analyzers.targets
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,25 @@
<IsPackable>false</IsPackable>
<!-- Avoid ID conflicts with the package project. -->
<PackageId>*$(MSBuildProjectFile)*</PackageId>
<AssemblyName>Funcky.Analyzers</AssemblyName>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<AnalysisLevel>5</AnalysisLevel>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
</PropertyGroup>
<PropertyGroup>
<!-- These are properties that are usually default to the project name, but since
we have a project per roslyn version, we need to be explicit. -->
<AssemblyName>Funcky.Analyzers</AssemblyName>
<RootNamespace>Funcky.Analyzers</RootNamespace>
</PropertyGroup>
<PropertyGroup>
<AnalyzerLanguage>cs</AnalyzerLanguage>
<RoslynApiVersion Condition="'$(RoslynApiVersion)' == '' And '$(AnalyzerRoslynVersion)' != ''">$(AnalyzerRoslynVersion)</RoslynApiVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PolySharp" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" VersionOverride="$(RoslynApiVersion)" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" VersionOverride="$(AnalyzerRoslynVersion)" PrivateAssets="all" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources.Designer.cs">
Expand Down
21 changes: 18 additions & 3 deletions Funcky.Analyzers/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,30 @@ This means that we ship multiple copies of the analyzer assembly in the followin
```
╰─ analyzers
╰─ dotnet
├─ cs
│ ├─ Funcky.Analyzers.dll
│ ╰─ ...
├─ roslyn4.0
│ ╰─ cs
│ ├─ Funcky.Analyzers.dll
│ ╰─ ...
╰─ roslyn4.12
╰─ cs
├─ Funcky.Analyzers.dll
╰─ ...
```

From the different versions, the highest compatible version is picked.

### Remarks
* SDKs that don't support multi-targeting load analyzers recursively,
even inside the "versioned" `roslyn*` directories.
* The `System.Text.Json` package fixes this by shipping a `.targets` file with their packages that
catches this case by checking for the `SupportsRoslynComponentVersioning` property
and manually removing discovered analyzers that are incompatible.
* Our analyzers require at least Roslyn 4.0 / .NET 6.0 (which is the version that introduced multi-targeting)
so we fix this by shipping a `.targets` file that removes all our analyzers and warns the user.
* SDKs versions that support multi-targeting also load analyzers
that are not in a `roslyn*` directory, so to avoid loading analyzers twice
all analyzers need to be inside a `roslyn*` directory.

## Roslyn Version Compatibility
There are three documents that help figure out what version of Roslyn to target:
* [.NET compiler platform package version reference](https://learn.microsoft.com/en-us/visualstudio/extensibility/roslyn-version-support): \
Expand Down

0 comments on commit cc33b2b

Please sign in to comment.