Skip to content

Commit

Permalink
Allow to disable all rules using a property (#781)
Browse files Browse the repository at this point in the history
  • Loading branch information
meziantou authored Jan 8, 2025
1 parent 6ca45f8 commit 54e9030
Show file tree
Hide file tree
Showing 11 changed files with 1,094 additions and 50 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ jobs:
- run: dotnet build src/Meziantou.Analyzer.CodeFixers/Meziantou.Analyzer.CodeFixers.csproj --configuration Release /p:RoslynVersion=roslyn4.6 /p:Version=${{ needs.compute_package_version.outputs.package_version }}
- run: dotnet build src/Meziantou.Analyzer.CodeFixers/Meziantou.Analyzer.CodeFixers.csproj --configuration Release /p:RoslynVersion=roslyn4.8 /p:Version=${{ needs.compute_package_version.outputs.package_version }}

- run: dotnet restore src/Meziantou.Analyzer.pack.csproj
- run: dotnet pack src/Meziantou.Analyzer.pack.csproj --configuration Release --no-build /p:Version=${{ needs.compute_package_version.outputs.package_version }}
- run: dotnet restore src/Meziantou.Analyzer.Pack/Meziantou.Analyzer.Pack.csproj
- run: dotnet pack src/Meziantou.Analyzer.Pack/Meziantou.Analyzer.Pack.csproj --configuration Release --no-build /p:Version=${{ needs.compute_package_version.outputs.package_version }}
- run: dotnet pack src/Meziantou.Analyzer.Annotations/Meziantou.Analyzer.Annotations.csproj --configuration Release

- uses: actions/upload-artifact@v4
Expand Down
2 changes: 1 addition & 1 deletion Meziantou.Analyzer.sln
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocumentationGenerator", "s
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ListDotNetTypes", "src\ListDotNetTypes\ListDotNetTypes.csproj", "{B496BD9C-27CA-44BE-95A9-57CBC99314D4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Meziantou.Analyzer.pack", "src\Meziantou.Analyzer.pack.csproj", "{6AB20B80-DE7F-4EB3-8A8B-E5C902F06438}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Meziantou.Analyzer.Pack", "src\Meziantou.Analyzer.Pack\Meziantou.Analyzer.Pack.csproj", "{6AB20B80-DE7F-4EB3-8A8B-E5C902F06438}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Meziantou.Analyzer.Annotations", "src\Meziantou.Analyzer.Annotations\Meziantou.Analyzer.Annotations.csproj", "{6C3D4314-A2E3-498F-A2C3-AC10E714A498}"
EndProject
Expand Down
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,4 +194,16 @@ If you are already using other analyzers, you can check [which rules are duplica
|`MAS0002`|[CA1822](https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1822?WT.mc_id=DT-MVP-5003978)|Suppress CA1822 on methods decorated with a System.Text.Json attribute such as \[JsonPropertyName\] or \[JsonInclude\].|
|`MAS0003`|[IDE0058](https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0058?WT.mc_id=DT-MVP-5003978)|Suppress IDE0058 on well-known types|

<!-- suppressions -->
<!-- suppressions -->

# Configuration

You can set the `<MeziantouAnalysisMode>` MSBuild property to configure the default severity of the rules. The default value is `Default`. You can set it to `None` to disable all rules by default.

````
<Project>
<PropertyGroup>
<MeziantouAnalysisMode>None</MeziantouAnalysisMode>
</PropertyGroup>
</Project>
````
39 changes: 31 additions & 8 deletions src/DocumentationGenerator/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
{
// The main readme is embedded into the NuGet package and rendered by nuget.org.
// nuget.org's markdown support is limited. Raw html in table is not supported.
var readmePath = Path.GetFullPath(Path.Combine(outputFolder, "README.md"));
var readmePath = outputFolder / "README.md";
var readmeContent = await File.ReadAllTextAsync(readmePath);
var newContent = Regex.Replace(readmeContent, "(?<=<!-- rules -->\\r?\\n).*(?=<!-- rules -->)", "\n" + GenerateRulesTable(diagnosticAnalyzers, codeFixProviders, addTitle: false) + "\n", RegexOptions.Singleline);
newContent = Regex.Replace(newContent, "(?<=<!-- suppressions -->\\r?\\n).*(?=<!-- suppressions -->)", "\n" + GenerateSuppressorsTable(diagnosticSuppressors) + "\n", RegexOptions.Singleline);
Expand All @@ -65,7 +65,7 @@

// Update doc readme
{
var path = Path.GetFullPath(Path.Combine(outputFolder, "docs", "README.md"));
var path = outputFolder / "docs" / "README.md";
Console.WriteLine(path);
WriteFileIfChanged(path, sb.ToString());
}
Expand All @@ -75,7 +75,7 @@
foreach (var diagnostic in diagnosticAnalyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal))
{
var title = $"# {diagnostic.Id} - {EscapeMarkdown(diagnostic.Title.ToString(CultureInfo.InvariantCulture))}";
var detailPath = Path.GetFullPath(Path.Combine(outputFolder, "docs", "Rules", diagnostic.Id + ".md"));
var detailPath = outputFolder / "docs" / "Rules" / (diagnostic.Id + ".md");
if (File.Exists(detailPath))
{
var lines = await File.ReadAllLinesAsync(detailPath);
Expand All @@ -89,14 +89,30 @@
}
}

// Update editorconfig files for NuGet package
{
GenerateFile(outputFolder / "src" / "Meziantou.Analyzer.Pack" / "configuration" / "none.editorconfig", sb => GenerateEditorConfig(sb, diagnosticAnalyzers, overrideSeverity: "none", appendCodeBlock: false));
GenerateFile(outputFolder / "src" / "Meziantou.Analyzer.Pack" / "configuration" / "default.editorconfig", sb => GenerateEditorConfig(sb, diagnosticAnalyzers, overrideSeverity: null, appendCodeBlock: false));
void GenerateFile(FullPath outputPath, Action<StringBuilder> code)
{
var sb = new StringBuilder();
sb.Append("# This file is generated by the build process. Do not edit it manually.\n");
sb.Append("is_global = true\n");
sb.Append("global_level = 0\n");
sb.Append('\n');
code(sb);
WriteFileIfChanged(outputPath, sb.ToString());
}
}

return fileWritten;

void WriteFileIfChanged(string path, string content)
void WriteFileIfChanged(FullPath path, string content)
{
content = content.ReplaceLineEndings("\n");

if (!File.Exists(path))
{
path.CreateParentDirectory();
File.WriteAllText(path, content);
fileWritten++;
return;
Expand Down Expand Up @@ -200,9 +216,13 @@ static string GenerateSuppressorsTable(List<DiagnosticSuppressor> diagnosticSupp
return sb.ToString();
}

static void GenerateEditorConfig(StringBuilder sb, List<DiagnosticAnalyzer> analyzers, string? overrideSeverity = null)
static void GenerateEditorConfig(StringBuilder sb, List<DiagnosticAnalyzer> analyzers, string? overrideSeverity = null, bool appendCodeBlock = true)
{
sb.Append("```editorconfig\n");
if (appendCodeBlock)
{
sb.Append("```editorconfig\n");
}

var first = true;
foreach (var diagnostic in analyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal))
{
Expand Down Expand Up @@ -237,7 +257,10 @@ static void GenerateEditorConfig(StringBuilder sb, List<DiagnosticAnalyzer> anal
first = false;
}

sb.Append("```\n");
if (appendCodeBlock)
{
sb.Append("```\n");
}
}

static string GetSeverity(DiagnosticSeverity severity)
Expand Down
45 changes: 45 additions & 0 deletions src/Meziantou.Analyzer.Pack/Meziantou.Analyzer.Pack.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<IncludeBuildOutput>false</IncludeBuildOutput>
<EnableDefaultItems>false</EnableDefaultItems>
<GenerateDependencyFile>false</GenerateDependencyFile>
<developmentDependency>true</developmentDependency>
<NoPackageAnalysis>true</NoPackageAnalysis>

<Version>2.0.0</Version>

<PackageId>Meziantou.Analyzer</PackageId>
<Description>A Roslyn analyzer to enforce some good practices in C#</Description>
<PackageTags>Meziantou.Analyzer, analyzers</PackageTags>
</PropertyGroup>

<ItemGroup>
<PackageReference Remove="Meziantou.DotNet.CodingStandard" />
</ItemGroup>

<ItemGroup>
<None Include="../../README.md" Pack="true" PackagePath="" />

<None Include="build/**" Pack="true" PackagePath="build" />
<None Include="buildMultiTargeting/**" Pack="true" PackagePath="buildMultiTargeting" />
<None Include="buildTransitive/**" Pack="true" PackagePath="buildTransitive" />

<None Include="configuration/*.editorconfig" Pack="true" PackagePath="configuration" />

<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn3.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn3.8/cs/" />
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn3.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn3.8/cs/" />

<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.2\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.2/cs/" />
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.2\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.2/cs/" />

<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.4\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.4/cs/" />
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.4\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.4/cs/" />

<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.6\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.6/cs/" />
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.6\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.6/cs/" />

<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.8/cs/" />
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.8/cs/" />
</ItemGroup>
</Project>
6 changes: 6 additions & 0 deletions src/Meziantou.Analyzer.Pack/build/Meziantou.Analyzer.props
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<Project>
<ItemGroup>
<EditorConfigFiles Condition="'$(MeziantouAnalysisMode)' == 'None'" Include="$(MSBuildThisFileDirectory)\..\configuration\none.editorconfig" />
<EditorConfigFiles Condition="'$(MeziantouAnalysisMode)' == 'Default'" Include="$(MSBuildThisFileDirectory)\..\configuration\default.editorconfig" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Project>
<Import Project="$(MSBuildThisFileDirectory)\..\build\Meziantou.Analyzer.props" />
</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<Project>
<Import Project="$(MSBuildThisFileDirectory)\..\build\Meziantou.Analyzer.props" />
</Project>
Loading

0 comments on commit 54e9030

Please sign in to comment.