Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to disable all rules using a property #781

Merged
merged 1 commit into from
Jan 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading