Skip to content

Commit 54e9030

Browse files
authored
Allow to disable all rules using a property (#781)
1 parent 6ca45f8 commit 54e9030

File tree

11 files changed

+1094
-50
lines changed

11 files changed

+1094
-50
lines changed

.github/workflows/ci.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ jobs:
7474
- 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 }}
7575
- 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 }}
7676

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

8181
- uses: actions/upload-artifact@v4

Meziantou.Analyzer.sln

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DocumentationGenerator", "s
2323
EndProject
2424
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ListDotNetTypes", "src\ListDotNetTypes\ListDotNetTypes.csproj", "{B496BD9C-27CA-44BE-95A9-57CBC99314D4}"
2525
EndProject
26-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Meziantou.Analyzer.pack", "src\Meziantou.Analyzer.pack.csproj", "{6AB20B80-DE7F-4EB3-8A8B-E5C902F06438}"
26+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Meziantou.Analyzer.Pack", "src\Meziantou.Analyzer.Pack\Meziantou.Analyzer.Pack.csproj", "{6AB20B80-DE7F-4EB3-8A8B-E5C902F06438}"
2727
EndProject
2828
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Meziantou.Analyzer.Annotations", "src\Meziantou.Analyzer.Annotations\Meziantou.Analyzer.Annotations.csproj", "{6C3D4314-A2E3-498F-A2C3-AC10E714A498}"
2929
EndProject

README.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,16 @@ If you are already using other analyzers, you can check [which rules are duplica
194194
|`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\].|
195195
|`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|
196196

197-
<!-- suppressions -->
197+
<!-- suppressions -->
198+
199+
# Configuration
200+
201+
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.
202+
203+
````
204+
<Project>
205+
<PropertyGroup>
206+
<MeziantouAnalysisMode>None</MeziantouAnalysisMode>
207+
</PropertyGroup>
208+
</Project>
209+
````

src/DocumentationGenerator/Program.cs

+31-8
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
{
5757
// The main readme is embedded into the NuGet package and rendered by nuget.org.
5858
// nuget.org's markdown support is limited. Raw html in table is not supported.
59-
var readmePath = Path.GetFullPath(Path.Combine(outputFolder, "README.md"));
59+
var readmePath = outputFolder / "README.md";
6060
var readmeContent = await File.ReadAllTextAsync(readmePath);
6161
var newContent = Regex.Replace(readmeContent, "(?<=<!-- rules -->\\r?\\n).*(?=<!-- rules -->)", "\n" + GenerateRulesTable(diagnosticAnalyzers, codeFixProviders, addTitle: false) + "\n", RegexOptions.Singleline);
6262
newContent = Regex.Replace(newContent, "(?<=<!-- suppressions -->\\r?\\n).*(?=<!-- suppressions -->)", "\n" + GenerateSuppressorsTable(diagnosticSuppressors) + "\n", RegexOptions.Singleline);
@@ -65,7 +65,7 @@
6565

6666
// Update doc readme
6767
{
68-
var path = Path.GetFullPath(Path.Combine(outputFolder, "docs", "README.md"));
68+
var path = outputFolder / "docs" / "README.md";
6969
Console.WriteLine(path);
7070
WriteFileIfChanged(path, sb.ToString());
7171
}
@@ -75,7 +75,7 @@
7575
foreach (var diagnostic in diagnosticAnalyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal))
7676
{
7777
var title = $"# {diagnostic.Id} - {EscapeMarkdown(diagnostic.Title.ToString(CultureInfo.InvariantCulture))}";
78-
var detailPath = Path.GetFullPath(Path.Combine(outputFolder, "docs", "Rules", diagnostic.Id + ".md"));
78+
var detailPath = outputFolder / "docs" / "Rules" / (diagnostic.Id + ".md");
7979
if (File.Exists(detailPath))
8080
{
8181
var lines = await File.ReadAllLinesAsync(detailPath);
@@ -89,14 +89,30 @@
8989
}
9090
}
9191

92+
// Update editorconfig files for NuGet package
93+
{
94+
GenerateFile(outputFolder / "src" / "Meziantou.Analyzer.Pack" / "configuration" / "none.editorconfig", sb => GenerateEditorConfig(sb, diagnosticAnalyzers, overrideSeverity: "none", appendCodeBlock: false));
95+
GenerateFile(outputFolder / "src" / "Meziantou.Analyzer.Pack" / "configuration" / "default.editorconfig", sb => GenerateEditorConfig(sb, diagnosticAnalyzers, overrideSeverity: null, appendCodeBlock: false));
96+
void GenerateFile(FullPath outputPath, Action<StringBuilder> code)
97+
{
98+
var sb = new StringBuilder();
99+
sb.Append("# This file is generated by the build process. Do not edit it manually.\n");
100+
sb.Append("is_global = true\n");
101+
sb.Append("global_level = 0\n");
102+
sb.Append('\n');
103+
code(sb);
104+
WriteFileIfChanged(outputPath, sb.ToString());
105+
}
106+
}
107+
92108
return fileWritten;
93109

94-
void WriteFileIfChanged(string path, string content)
110+
void WriteFileIfChanged(FullPath path, string content)
95111
{
96112
content = content.ReplaceLineEndings("\n");
97-
98113
if (!File.Exists(path))
99114
{
115+
path.CreateParentDirectory();
100116
File.WriteAllText(path, content);
101117
fileWritten++;
102118
return;
@@ -200,9 +216,13 @@ static string GenerateSuppressorsTable(List<DiagnosticSuppressor> diagnosticSupp
200216
return sb.ToString();
201217
}
202218

203-
static void GenerateEditorConfig(StringBuilder sb, List<DiagnosticAnalyzer> analyzers, string? overrideSeverity = null)
219+
static void GenerateEditorConfig(StringBuilder sb, List<DiagnosticAnalyzer> analyzers, string? overrideSeverity = null, bool appendCodeBlock = true)
204220
{
205-
sb.Append("```editorconfig\n");
221+
if (appendCodeBlock)
222+
{
223+
sb.Append("```editorconfig\n");
224+
}
225+
206226
var first = true;
207227
foreach (var diagnostic in analyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal))
208228
{
@@ -237,7 +257,10 @@ static void GenerateEditorConfig(StringBuilder sb, List<DiagnosticAnalyzer> anal
237257
first = false;
238258
}
239259

240-
sb.Append("```\n");
260+
if (appendCodeBlock)
261+
{
262+
sb.Append("```\n");
263+
}
241264
}
242265

243266
static string GetSeverity(DiagnosticSeverity severity)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<TargetFramework>netstandard2.0</TargetFramework>
4+
<IncludeBuildOutput>false</IncludeBuildOutput>
5+
<EnableDefaultItems>false</EnableDefaultItems>
6+
<GenerateDependencyFile>false</GenerateDependencyFile>
7+
<developmentDependency>true</developmentDependency>
8+
<NoPackageAnalysis>true</NoPackageAnalysis>
9+
10+
<Version>2.0.0</Version>
11+
12+
<PackageId>Meziantou.Analyzer</PackageId>
13+
<Description>A Roslyn analyzer to enforce some good practices in C#</Description>
14+
<PackageTags>Meziantou.Analyzer, analyzers</PackageTags>
15+
</PropertyGroup>
16+
17+
<ItemGroup>
18+
<PackageReference Remove="Meziantou.DotNet.CodingStandard" />
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<None Include="../../README.md" Pack="true" PackagePath="" />
23+
24+
<None Include="build/**" Pack="true" PackagePath="build" />
25+
<None Include="buildMultiTargeting/**" Pack="true" PackagePath="buildMultiTargeting" />
26+
<None Include="buildTransitive/**" Pack="true" PackagePath="buildTransitive" />
27+
28+
<None Include="configuration/*.editorconfig" Pack="true" PackagePath="configuration" />
29+
30+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn3.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn3.8/cs/" />
31+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn3.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn3.8/cs/" />
32+
33+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.2\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.2/cs/" />
34+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.2\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.2/cs/" />
35+
36+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.4\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.4/cs/" />
37+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.4\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.4/cs/" />
38+
39+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.6\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.6/cs/" />
40+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.6\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.6/cs/" />
41+
42+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer\bin\roslyn4.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.8/cs/" />
43+
<None Include="$(MSBuildThisFileDirectory)\..\Meziantou.Analyzer.CodeFixers\bin\roslyn4.8\$(Configuration)\netstandard2.0\Meziantou.Analyzer.CodeFixers.dll" Pack="true" PackagePath="analyzers/dotnet/roslyn4.8/cs/" />
44+
</ItemGroup>
45+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<Project>
2+
<ItemGroup>
3+
<EditorConfigFiles Condition="'$(MeziantouAnalysisMode)' == 'None'" Include="$(MSBuildThisFileDirectory)\..\configuration\none.editorconfig" />
4+
<EditorConfigFiles Condition="'$(MeziantouAnalysisMode)' == 'Default'" Include="$(MSBuildThisFileDirectory)\..\configuration\default.editorconfig" />
5+
</ItemGroup>
6+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<Project>
2+
<Import Project="$(MSBuildThisFileDirectory)\..\build\Meziantou.Analyzer.props" />
3+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<Project>
2+
<Import Project="$(MSBuildThisFileDirectory)\..\build\Meziantou.Analyzer.props" />
3+
</Project>

0 commit comments

Comments
 (0)