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

Re-added analyzers #238

Merged
merged 16 commits into from
Nov 6, 2022
Merged
36 changes: 20 additions & 16 deletions src/Bench/Bench.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -41,23 +41,27 @@
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>
<ItemGroup>
<!-- <PackageReference Include="AsyncFixer" Version="1.6.0" PrivateAssets="All" />-->
<!-- <PackageReference Include="codecracker.CSharp" Version="1.1.0" PrivateAssets="All" />-->
<!-- <PackageReference Include="FunFair.CodeAnalysis" Version="5.9.0.1493" PrivateAssets="All" />-->
<!-- <PackageReference Include="Meziantou.Analyzer" Version="1.0.732" PrivateAssets="All" />-->
<!-- <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.3.44" PrivateAssets="All" />-->
<!-- <PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.15" PrivateAssets="All" />-->
<!-- <PackageReference Include="Nullable.Extended.Analyzer" Version="1.10.4539" PrivateAssets="All" />-->
<!-- <PackageReference Include="Philips.CodeAnalysis.DuplicateCodeAnalyzer" Version="1.1.6" PrivateAssets="All" />-->
<!-- <PackageReference Include="Philips.CodeAnalysis.MaintainabilityAnalyzers" Version="1.2.28" PrivateAssets="All" />-->
<!-- <PackageReference Include="Roslynator.Analyzers" Version="4.1.1" PrivateAssets="All" />-->
<!-- <PackageReference Include="SecurityCodeScan.VS2019" Version="5.6.7" PrivateAssets="All" />-->
<!-- <PackageReference Include="SmartAnalyzers.CSharpExtensions.Annotations" Version="4.2.7" PrivateAssets="All" />-->
<!-- <PackageReference Include="SonarAnalyzer.CSharp" Version="8.45.0.54064" PrivateAssets="All" />-->
<!-- <PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All" />-->
<!-- <PackageReference Include="ToStringWithoutOverrideAnalyzer" Version="0.6.0" PrivateAssets="All" />-->
<PackageReference Include="AsyncFixer" Version="1.6.0" PrivateAssets="All"/>
<PackageReference Include="codecracker.CSharp" Version="1.1.0" PrivateAssets="All"/>
<PackageReference Include="FunFair.CodeAnalysis" Version="5.9.0.1493" PrivateAssets="All"/>
<PackageReference Include="Meziantou.Analyzer" Version="1.0.744" PrivateAssets="All"/>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.3.48" PrivateAssets="All"/>
<PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.15" PrivateAssets="All"/>
<PackageReference Include="Nullable.Extended.Analyzer" Version="1.10.4539" PrivateAssets="All"/>
<PackageReference Include="Philips.CodeAnalysis.DuplicateCodeAnalyzer" Version="1.1.7" PrivateAssets="All"/>
<PackageReference Include="Philips.CodeAnalysis.MaintainabilityAnalyzers" Version="1.2.29" PrivateAssets="All"/>
<PackageReference Include="Roslynator.Analyzers" Version="4.1.2" PrivateAssets="All"/>
<PackageReference Include="SecurityCodeScan.VS2019" Version="5.6.7" PrivateAssets="All"/>
<PackageReference Include="SmartAnalyzers.CSharpExtensions.Annotations" Version="4.2.7" PrivateAssets="All"/>
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.47.0.55603" PrivateAssets="All"/>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All"/>
<PackageReference Include="ToStringWithoutOverrideAnalyzer" Version="0.6.0" PrivateAssets="All"/>

<ProjectReference Include="..\Implementations\Implementations.csproj"/>

<ProjectReference Include="..\Models\Models.csproj"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.2" />
<PackageReference Include="BenchmarkDotNet" Version="0.13.2"/>
</ItemGroup>
</Project>
16 changes: 16 additions & 0 deletions src/Bench/BenchBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;

namespace Bench;

public abstract class BenchBase
{
[SuppressMessage(category: "codecracker.CSharp", checkId: "CC0091:MarkMembersAsStatic", Justification = "Benchmark")]
[SuppressMessage(category: "Microsoft.Performance", checkId: "CA1822:Mark methods static", Justification = "Benchmark")]
[SuppressMessage(category: "ReSharper", checkId: "UnusedParameter.Global", Justification = "Simplifies benchmarks")]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected void Test<T>(T value)
{
// Doesn't do anything
}
}
28 changes: 28 additions & 0 deletions src/Bench/EnumBench.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using BenchmarkDotNet.Attributes;
using Implementations;
using Models;

namespace Bench;

[SimpleJob]
[MemoryDiagnoser(false)]
public abstract class EnumBench : BenchBase
{
[Benchmark]
public void GetNameReflection()
{
this.Test(ExampleEnumValues.ONE.GetNameReflection());
}

[Benchmark]
public void GetNameCachedReflection()
{
this.Test(ExampleEnumValues.ONE.GetNameReflectionCached());
}

[Benchmark]
public void GetNameCodeGenerated()
{
this.Test(ExampleEnumValues.ONE.GetName());
}
}
18 changes: 18 additions & 0 deletions src/Bench/EnumWrappers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
using Implementations;

namespace Bench;

internal static class EnumWrappers
{
[SuppressMessage(category: "ReSharper", checkId: "InvokeAsExtensionMethod", Justification = "This is a benchmark.")]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string GetNameReflectionCached<T>(this T value)
where T : Enum
{
// ReSharper disable once InvokeAsExtensionMethod
return EnumHelpers.GetName(value);
}
}
17 changes: 16 additions & 1 deletion src/Bench/Program.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
using BenchmarkDotNet.Running;
#define ENUM
using System.Diagnostics;
using BenchmarkDotNet.Running;

namespace Bench;

public static class Program
{
private static void Main()
{
RunRegexBenchmarks();
RunEnumBenchmarks();
}

[Conditional("REGEX")]
private static void RunRegexBenchmarks()
{
BenchmarkRunner.Run<RegexBench>();
}

[Conditional("ENUM")]
private static void RunEnumBenchmarks()
{
BenchmarkRunner.Run<EnumBench>();
}
}
58 changes: 27 additions & 31 deletions src/Bench/RegexBench.cs
Original file line number Diff line number Diff line change
@@ -1,97 +1,93 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
using BenchmarkDotNet.Attributes;

namespace Bench;

[SuppressMessage(category: "Microsoft.Performance", checkId: "CA1822:Mark methods static", Justification = "Needed for BenchmarkDotNet")]
[SimpleJob]
[MemoryDiagnoser(false)]
public partial class RegexBench
public abstract partial class RegexBench : BenchBase
{
private const string GOOD = "0123456789abcdef";
private const string BAD = "0123456789abcdefg";

private static readonly Regex CompiledRegex = new(pattern: @"^[0-9a-fA-F]+$",
RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline,
TimeSpan.FromSeconds(1));
private static readonly Regex CompiledRegex = new(pattern: @"^[0-9a-fA-F]+$", RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline, TimeSpan.FromSeconds(1));

[GeneratedRegexAttribute(pattern: @"^[0-9a-fA-F]+$", RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline)]
[GeneratedRegex(pattern: @"^[0-9a-fA-F]+$", RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline)]
private static partial Regex SourceGeneratedRegex();

[Benchmark]
public bool GoodNormalRegexString()
public void GoodNormalRegexString()
{
return ShouldBeNormalHexRegexString(GOOD);
this.Test(ShouldBeNormalHexRegexString(GOOD));
}

[Benchmark]
public bool GoodNormalRegexSpan()
public void GoodNormalRegexSpan()
{
return ShouldBeNormalHexRegexSpan(GOOD);
this.Test(ShouldBeNormalHexRegexSpan(GOOD));
}

[Benchmark]
public bool GoodSourceGeneratedRegexString()
public void GoodSourceGeneratedRegexString()
{
return ShouldBeHexSourceGeneratedRegexString(GOOD);
this.Test(ShouldBeHexSourceGeneratedRegexString(GOOD));
}

[Benchmark]
public bool GoodSourceGeneratedRegexSpan()
public void GoodSourceGeneratedRegexSpan()
{
return ShouldBeHexSourceGeneratedRegexSpan(GOOD);
this.Test(ShouldBeHexSourceGeneratedRegexSpan(GOOD));
}

[Benchmark]
public bool GoodMethodSpan()
public void GoodMethodSpan()
{
return ShouldBeHexMethodSpan(GOOD);
this.Test(ShouldBeHexMethodSpan(GOOD));
}

[Benchmark]
public bool GoodMethod7Span()
public void GoodMethod7Span()
{
return ShouldBeHexMethodSpan7(GOOD);
this.Test(ShouldBeHexMethodSpan7(GOOD));
}

[Benchmark]
public bool BadSourceGeneratedRegexString()
public void BadSourceGeneratedRegexString()
{
return ShouldBeHexSourceGeneratedRegexString(BAD);
this.Test(ShouldBeHexSourceGeneratedRegexString(BAD));
}

[Benchmark]
public bool BadNormalRegexString()
public void BadNormalRegexString()
{
return ShouldBeNormalHexRegexString(BAD);
this.Test(ShouldBeNormalHexRegexString(BAD));
}

[Benchmark]
public bool BadRegexSpan()
public void BadRegexSpan()
{
return ShouldBeNormalHexRegexSpan(BAD);
this.Test(ShouldBeNormalHexRegexSpan(BAD));
}

[Benchmark]
public bool BadSourceGeneratedRegexSpan()
public void BadSourceGeneratedRegexSpan()
{
return ShouldBeHexSourceGeneratedRegexSpan(BAD);
this.Test(ShouldBeHexSourceGeneratedRegexSpan(BAD));
}

[Benchmark]
public bool BadMethodSpan()
public void BadMethodSpan()
{
return ShouldBeHexMethodSpan(BAD);
this.Test(ShouldBeHexMethodSpan(BAD));
}

[Benchmark]
public bool BadMethodSpan7()
public void BadMethodSpan7()
{
return ShouldBeHexMethodSpan7(BAD);
this.Test(ShouldBeHexMethodSpan7(BAD));
}

private static bool ShouldBeNormalHexRegexString(string input)
Expand Down
1 change: 1 addition & 0 deletions src/Experiments/DependencyInjectionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Experiments.ReferenceObjects.Services;
using FunFair.Test.Common;
using Microsoft.Extensions.DependencyInjection;
using Models;
using Xunit;

namespace Experiments;
Expand Down
22 changes: 22 additions & 0 deletions src/Experiments/EnumTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using FunFair.Test.Common;
using Implementations;
using Models;
using Xunit;
using Xunit.Abstractions;

namespace Experiments;

public sealed class EnumTests : LoggingTestBase
{
public EnumTests(ITestOutputHelper output)
: base(output)
{
}

[Fact]
public void DoIt()
{
Assert.Equal(expected: "ONE", ExampleEnumValues.ONE.GetNameReflection());
Assert.Equal(expected: "ONE", ExampleEnumValues.SAME_AS_ONE.GetNameReflection());
}
}
53 changes: 20 additions & 33 deletions src/Experiments/Experiments.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -40,29 +40,6 @@
<EnableNETAnalyzers>true</EnableNETAnalyzers>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>
<ItemGroup>
<!-- <PackageReference Include="AsyncFixer" Version="1.5.1" PrivateAssets="All" />-->
<!-- <PackageReference Include="coverlet.collector" Version="3.1.0" PrivateAssets="All" />-->
<!-- <PackageReference Include="coverlet.msbuild" Version="3.1.0" PrivateAssets="All" />-->
<!-- <PackageReference Include="FunFair.CodeAnalysis" Version="5.7.3.1052" PrivateAssets="All" />-->
<!-- <PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.0.64" PrivateAssets="All" />-->
<!-- <PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.15" PrivateAssets="All" />-->
<!-- <PackageReference Include="Roslynator.Analyzers" Version="3.3.0" PrivateAssets="All" />-->
<!-- <PackageReference Include="SonarAnalyzer.CSharp" Version="8.33.0.40503" PrivateAssets="All" />-->
<!-- <PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All" />-->
<!-- <PackageReference Include="ToStringWithoutOverrideAnalyzer" Version="0.6.0" PrivateAssets="All" />-->
<!-- <PackageReference Include="xunit.analyzers" Version="0.10.0" PrivateAssets="All" />-->
<!-- &lt;!&ndash; Experiments &ndash;&gt;-->
<!-- &lt;!&ndash; SecurityCodeScan.VS2019 &ndash;&gt;-->
<!-- <PackageReference Include="SecurityCodeScan.VS2019" Version="5.6.0" PrivateAssets="all" />-->
<!-- &lt;!&ndash; Obsessive.Defender &ndash;&gt;-->
<!-- &lt;!&ndash; <PackageReference Include="Obsessive.Defender" Version="1.2.0" PrivateAssets="all" />&ndash;&gt;-->
<!-- &lt;!&ndash; Puma.Security.Rules &ndash;&gt;-->
<!-- <PackageReference Include="Puma.Security.Rules" Version="2.4.7" PrivateAssets="all" />-->
<!-- &lt;!&ndash; No point &ndash;&gt;-->
<!-- &lt;!&ndash; <PackageReference Include="Roslynator.Formatting.Analyzers" Version="1.2.0" PrivateAssets="All" />&ndash;&gt;-->
<!-- &lt;!&ndash; <PackageReference Include="Philips.CodeAnalysis.DuplicateCodeAnalyzer" Version="1.1.2" PrivateAssets="All" />&ndash;&gt;-->
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="3.2.0" />
<PackageReference Include="FunFair.Test.Common" Version="6.0.5.2217" />
Expand All @@ -77,15 +54,25 @@
<PackageReference Include="FunFair.CodeAnalysis" Version="5.9.0.1493" PrivateAssets="All" />
<PackageReference Include="Meziantou.Analyzer" Version="1.0.745" PrivateAssets="All" />
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.3.48" PrivateAssets="All" />
<PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.15" PrivateAssets="All" />
<PackageReference Include="Nullable.Extended.Analyzer" Version="1.10.4539" PrivateAssets="All" />
<PackageReference Include="Philips.CodeAnalysis.DuplicateCodeAnalyzer" Version="1.1.7" PrivateAssets="All" />
<PackageReference Include="Philips.CodeAnalysis.MaintainabilityAnalyzers" Version="1.2.29" PrivateAssets="All" />
<PackageReference Include="Roslynator.Analyzers" Version="4.1.2" PrivateAssets="All" />
<PackageReference Include="SecurityCodeScan.VS2019" Version="5.6.7" PrivateAssets="All" />
<PackageReference Include="SmartAnalyzers.CSharpExtensions.Annotations" Version="4.2.7" PrivateAssets="All" />
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.47.0.55603" PrivateAssets="All" />
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All" />
<PackageReference Include="ToStringWithoutOverrideAnalyzer" Version="0.6.0" PrivateAssets="All" />
<PackageReference Include="NSubstitute.Analyzers.CSharp" Version="1.0.15" PrivateAssets="All"/>
<PackageReference Include="Nullable.Extended.Analyzer" Version="1.10.4539" PrivateAssets="All"/>
<PackageReference Include="Philips.CodeAnalysis.DuplicateCodeAnalyzer" Version="1.1.7" PrivateAssets="All"/>
<PackageReference Include="Philips.CodeAnalysis.MaintainabilityAnalyzers" Version="1.2.29" PrivateAssets="All"/>
<PackageReference Include="Roslynator.Analyzers" Version="4.1.2" PrivateAssets="All"/>
<PackageReference Include="SecurityCodeScan.VS2019" Version="5.6.7" PrivateAssets="All"/>
<PackageReference Include="SmartAnalyzers.CSharpExtensions.Annotations" Version="4.2.7" PrivateAssets="All"/>
<PackageReference Include="SonarAnalyzer.CSharp" Version="8.47.0.55603" PrivateAssets="All"/>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.3" PrivateAssets="All"/>
<PackageReference Include="ToStringWithoutOverrideAnalyzer" Version="0.6.0" PrivateAssets="All"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Implementations\Implementations.csproj"/>
<ProjectReference Include="..\Models\Models.csproj"/>

<!-- Note that this is not a "normal" ProjectReference.
It needs the additional 'OutputItemType' and 'ReferenceOutputAssmbly' attributes. -->
<ProjectReference Include="..\SourceGenerator\SourceGenerator.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false"/>
</ItemGroup>
</Project>
5 changes: 0 additions & 5 deletions src/Experiments/ReferenceObjects/T1.cs

This file was deleted.

5 changes: 0 additions & 5 deletions src/Experiments/ReferenceObjects/T2.cs

This file was deleted.

Loading