diff --git a/src/Cake.Issues.InspectCode/InspectCodeIssuesProvider.cs b/src/Cake.Issues.InspectCode/InspectCodeIssuesProvider.cs index 6cfc89cc7..da176fbd1 100644 --- a/src/Cake.Issues.InspectCode/InspectCodeIssuesProvider.cs +++ b/src/Cake.Issues.InspectCode/InspectCodeIssuesProvider.cs @@ -241,7 +241,7 @@ private static IssuePriority GetPriority(string severity) => /// /// Description of an issue type. /// - private class IssueType + private sealed class IssueType { /// /// Gets the description of the issue. diff --git a/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliJsonLogFileFormat.cs b/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliJsonLogFileFormat.cs index 414420ef7..554c359b4 100644 --- a/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliJsonLogFileFormat.cs +++ b/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliJsonLogFileFormat.cs @@ -102,7 +102,7 @@ private static string GetFilePath( #pragma warning disable CS0649 // Field 'field' is never assigned to, and will always have its default value 'value' [DataContract] - private class LogFileEntry + private sealed class LogFileEntry { [DataMember] public string fileName; diff --git a/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliLogFileFormat.cs b/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliLogFileFormat.cs index f9f04ad13..720e6618f 100644 --- a/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliLogFileFormat.cs +++ b/src/Cake.Issues.Markdownlint/LogFileFormat/MarkdownlintCliLogFileFormat.cs @@ -10,7 +10,7 @@ /// Logfile format as written by markdownlint-cli. /// /// The Cake log instance. -internal class MarkdownlintCliLogFileFormat(ICakeLog log) +internal partial class MarkdownlintCliLogFileFormat(ICakeLog log) : BaseMarkdownlintLogFileFormat(log) { private static readonly string[] Separator = ["\r\n", "\r", "\n"]; @@ -25,9 +25,9 @@ public override IEnumerable ReadIssues( repositorySettings.NotNull(); markdownlintIssuesSettings.NotNull(); - var regex = new Regex(@"(?.*[^:\d+]): ?(?\d+):?(?\d+)? (?MD\d+)/(?(?:\w*-*/*)*) (?.*)"); + var regex = LineParsingRegEx(); - foreach (var line in markdownlintIssuesSettings.LogFileContent.ToStringUsingEncoding().Split(Separator, StringSplitOptions.None).ToList().Where(s => !string.IsNullOrEmpty(s))) + foreach (var line in markdownlintIssuesSettings.LogFileContent.ToStringUsingEncoding().Split(Separator, StringSplitOptions.None).Where(s => !string.IsNullOrEmpty(s))) { var groups = regex.Match(line).Groups; @@ -57,6 +57,9 @@ public override IEnumerable ReadIssues( } } + [GeneratedRegex(@"(?.*[^:\d+]): ?(?\d+):?(?\d+)? (?MD\d+)/(?(?:\w*-*/*)*) (?.*)")] + private static partial Regex LineParsingRegEx(); + /// /// Reads the affected file path from a parsed entry. /// diff --git a/src/Cake.Issues.Markdownlint/MarkdownlintRuleUrlResolver.cs b/src/Cake.Issues.Markdownlint/MarkdownlintRuleUrlResolver.cs index c6bbc3a03..bd508830d 100644 --- a/src/Cake.Issues.Markdownlint/MarkdownlintRuleUrlResolver.cs +++ b/src/Cake.Issues.Markdownlint/MarkdownlintRuleUrlResolver.cs @@ -6,7 +6,7 @@ /// /// Class for retrieving a URL linking to a site describing a rule. /// -internal class MarkdownlintRuleUrlResolver : BaseRuleUrlResolver +internal partial class MarkdownlintRuleUrlResolver : BaseRuleUrlResolver { private static readonly Lazy InstanceValue = new(() => new MarkdownlintRuleUrlResolver()); @@ -28,7 +28,7 @@ internal MarkdownlintRuleUrlResolver() /// protected override bool TryGetRuleDescription(string rule, MarkdownlintRuleDescription ruleDescription) { - var regex = new Regex(@"^MD(\d*)$"); + var regex = RuleDescriptionRegEx(); var match = regex.Match(rule); if (!match.Success) @@ -52,4 +52,7 @@ protected override bool TryGetRuleDescription(string rule, MarkdownlintRuleDescr return true; } + + [GeneratedRegex(@"^MD(\d*)$")] + private static partial Regex RuleDescriptionRegEx(); } \ No newline at end of file diff --git a/src/Cake.Issues.Reporting.Console.Tests/ConsoleIssueReportGeneratorTests.cs b/src/Cake.Issues.Reporting.Console.Tests/ConsoleIssueReportGeneratorTests.cs index ef3b401fa..b5f35ed23 100644 --- a/src/Cake.Issues.Reporting.Console.Tests/ConsoleIssueReportGeneratorTests.cs +++ b/src/Cake.Issues.Reporting.Console.Tests/ConsoleIssueReportGeneratorTests.cs @@ -34,13 +34,15 @@ public void Should_Throw_If_Settings_Are_Null() public sealed class TheInternalCreateReportMethod { public static IEnumerable ReportFormatSettingsCombinations => - from b1 in new[] { false, true } - from b2 in new[] { false, true } - from b3 in new[] { false, true } - from b4 in new[] { false, true } - from b5 in new[] { false, true } + from b1 in boolArray + from b2 in boolArray + from b3 in boolArray + from b4 in boolArray + from b5 in boolArray select new object[] { b1, b2, b3, b4, b5 }; + private static readonly bool[] boolArray = [false, true]; + [Theory] [MemberData(nameof(ReportFormatSettingsCombinations))] public void Should_Generate_Report( diff --git a/src/Cake.Issues.Reporting.Console/IssueDiagnostic.cs b/src/Cake.Issues.Reporting.Console/IssueDiagnostic.cs index 6f773a83d..2b34e95e6 100644 --- a/src/Cake.Issues.Reporting.Console/IssueDiagnostic.cs +++ b/src/Cake.Issues.Reporting.Console/IssueDiagnostic.cs @@ -53,6 +53,30 @@ public IssueDiagnostic(IEnumerable issues) this.CreateLabels(); } + /// + /// Returns the diagnostic location of an issue. + /// + /// Issue for which the location should be returned. + /// Location for the diagnostic. + private static (Location Location, int Lenght) GetLocation(IIssue issue) + { + // Errata currently doesn't support file or line level diagnostics. + if (!issue.Line.HasValue || !issue.Column.HasValue) + { + return default; + } + + var location = new Location(issue.Line.Value, issue.Column.Value); + + var length = 0; + if (issue.EndColumn.HasValue) + { + length = issue.EndColumn.Value - issue.Column.Value; + } + + return (location, length); + } + /// /// Creates labels for the issue. /// @@ -68,7 +92,7 @@ private void CreateLabels() foreach (var issue in this.issues) { - var (location, length) = this.GetLocation(issue); + var (location, length) = GetLocation(issue); var label = new Label( issue.AffectedFileRelativePath.FullPath, @@ -84,28 +108,4 @@ private void CreateLabels() this.Labels.Add(label); } } - - /// - /// Returns the diagnostic location of an issue. - /// - /// Issue for which the location should be returned. - /// Location for the diagnostic. - private (Location Location, int Lenght) GetLocation(IIssue issue) - { - // Errata currently doesn't support file or line level diagnostics. - if (!issue.Line.HasValue || !issue.Column.HasValue) - { - return default; - } - - var location = new Location(issue.Line.Value, issue.Column.Value); - - var length = 0; - if (issue.EndColumn.HasValue) - { - length = issue.EndColumn.Value - issue.Column.Value; - } - - return (location, length); - } } \ No newline at end of file diff --git a/src/Cake.Issues.Reporting.Generic.Tests/DevExtremeThemeExtensionsTests.cs b/src/Cake.Issues.Reporting.Generic.Tests/DevExtremeThemeExtensionsTests.cs index 2afd2a7ae..2d797e514 100644 --- a/src/Cake.Issues.Reporting.Generic.Tests/DevExtremeThemeExtensionsTests.cs +++ b/src/Cake.Issues.Reporting.Generic.Tests/DevExtremeThemeExtensionsTests.cs @@ -6,7 +6,7 @@ public sealed class TheGetCssFileNameMethod { public static IEnumerable DevExtremeThemes() { - foreach (var number in Enum.GetValues(typeof(DevExtremeTheme))) + foreach (var number in Enum.GetValues()) { yield return [number]; } diff --git a/src/Cake.Issues.Reporting.Generic.Tests/HtmlDxDataGridTemplateTests.cs b/src/Cake.Issues.Reporting.Generic.Tests/HtmlDxDataGridTemplateTests.cs index cfe8b423d..64c20c08b 100644 --- a/src/Cake.Issues.Reporting.Generic.Tests/HtmlDxDataGridTemplateTests.cs +++ b/src/Cake.Issues.Reporting.Generic.Tests/HtmlDxDataGridTemplateTests.cs @@ -50,7 +50,7 @@ public void Should_Set_Heading() public sealed class TheThemeOption { public static IEnumerable DevExtremeThemes() => - from object number in Enum.GetValues(typeof(DevExtremeTheme)) + from object number in Enum.GetValues() select new[] { number }; [Theory] diff --git a/src/Cake.Issues.Reporting.Generic/StringExtensions.cs b/src/Cake.Issues.Reporting.Generic/StringExtensions.cs index b2187322d..c407ce3f3 100644 --- a/src/Cake.Issues.Reporting.Generic/StringExtensions.cs +++ b/src/Cake.Issues.Reporting.Generic/StringExtensions.cs @@ -5,7 +5,7 @@ /// /// Extensions for . /// -public static class StringExtensions +public static partial class StringExtensions { /// /// Sanitizes a string to be a valid HTML ID. @@ -23,7 +23,7 @@ public static string SanitizeHtmlIdAttribute(this string input) var firstLegalCharacter = GetIndexOfFirstLetter(input); input = input[firstLegalCharacter..]; - return Regex.Replace(input, @"/^[^a-z]+|[^\w:-]+", "-"); + return SanitizeHtmlIdRegEx().Replace(input, "-"); } /// @@ -46,4 +46,7 @@ private static int GetIndexOfFirstLetter(string input) return input.Length; } + + [GeneratedRegex(@"/^[^a-z]+|[^\w:-]+")] + private static partial Regex SanitizeHtmlIdRegEx(); } diff --git a/src/Cake.Issues.Reporting.Sarif/SarifIssueReportGenerator.cs b/src/Cake.Issues.Reporting.Sarif/SarifIssueReportGenerator.cs index b499139ed..5f3adc635 100644 --- a/src/Cake.Issues.Reporting.Sarif/SarifIssueReportGenerator.cs +++ b/src/Cake.Issues.Reporting.Sarif/SarifIssueReportGenerator.cs @@ -236,7 +236,7 @@ private Result GetResult(SarifIssue sarifIssue) /// /// Contains the and . /// - private class SarifIssue + private sealed class SarifIssue { /// /// Gets the BaselineState for the . diff --git a/src/Cake.Issues.Tests/IssuesArgumentChecksTests.cs b/src/Cake.Issues.Tests/IssuesArgumentChecksTests.cs index a797cd502..9c9b315ea 100644 --- a/src/Cake.Issues.Tests/IssuesArgumentChecksTests.cs +++ b/src/Cake.Issues.Tests/IssuesArgumentChecksTests.cs @@ -288,7 +288,7 @@ public void Should_Not_Throw_If_Value_Is_Valid(string value) var values = new List { value }; // When - values.NotNullOrEmpty("foo"); + values.NotNullOrEmpty(); // Then } @@ -330,7 +330,7 @@ public void Should_Not_Throw_If_Value_Is_Empty() var value = new List(); // When - value.NotNullOrEmptyElement("foo"); + value.NotNullOrEmptyElement(); // Then } @@ -340,12 +340,13 @@ public void Should_Throw_With_Correct_ParameterName_If_ParameterName_Is_Passed_A { // Given var value = new List { null }; + const string parameterName = "foo"; // When - var result = Record.Exception(() => value.NotNullOrEmptyElement("foo")); + var result = Record.Exception(() => value.NotNullOrEmptyElement(parameterName)); // Then - result.IsArgumentOutOfRangeException("foo"); + result.IsArgumentOutOfRangeException(parameterName); } [Theory] @@ -357,7 +358,7 @@ public void Should_Not_Throw_If_Value_Is_Valid(string value) var values = new List { value }; // When - values.NotNullOrEmptyElement("foo"); + values.NotNullOrEmptyElement(); // Then } @@ -455,7 +456,7 @@ public void Should_Not_Throw_If_Value_Is_Valid(string value) var values = new List { value }; // When - values.NotNullOrEmptyOrEmptyElement("foo"); + values.NotNullOrEmptyOrEmptyElement(); // Then } diff --git a/src/Cake.Issues/IIssueComparer.cs b/src/Cake.Issues/IIssueComparer.cs index a44abc2eb..d179771ba 100644 --- a/src/Cake.Issues/IIssueComparer.cs +++ b/src/Cake.Issues/IIssueComparer.cs @@ -95,7 +95,7 @@ y is not null && /// public int GetHashCode(IIssue obj) { - obj.NotNull(nameof(obj)); + obj.NotNull(); var valuesToHash = new List();