From b5ff65f2cb5c77cd492b937b902371589a14579e Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Thu, 30 May 2024 10:22:01 +1000 Subject: [PATCH] Add Analyzer to enforce spaces in `[]` --- .../BizHawk.Analyzer/HawkSourceAnalyzer.cs | 44 ++++++++++++++++++ References/BizHawk.Analyzer.dll | Bin 31232 -> 33280 bytes .../DisplayManager/DisplayManagerBase.cs | 2 +- .../Common/checksums/SHA1Tests.cs | 12 ++--- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/ExternalProjects/BizHawk.Analyzer/HawkSourceAnalyzer.cs b/ExternalProjects/BizHawk.Analyzer/HawkSourceAnalyzer.cs index a26cde6966..5160baa5db 100644 --- a/ExternalProjects/BizHawk.Analyzer/HawkSourceAnalyzer.cs +++ b/ExternalProjects/BizHawk.Analyzer/HawkSourceAnalyzer.cs @@ -1,5 +1,6 @@ namespace BizHawk.Analyzers; +using System; using System.Collections.Immutable; using Microsoft.CodeAnalysis; @@ -10,6 +11,12 @@ using Microsoft.CodeAnalysis.Diagnostics; [DiagnosticAnalyzer(LanguageNames.CSharp)] public class HawkSourceAnalyzer : DiagnosticAnalyzer { + private const string ERR_MSG_LIST_EXPR_EMPTY = "Empty collection expression should be `[ ]`"; + + private const string ERR_MSG_LIST_EXPR_END = "Collection expression should end with ` ]`"; + + private const string ERR_MSG_LIST_EXPR_START = "Collection expression should start with `[ `"; + private const string ERR_MSG_SWITCH_THROWS_UNKNOWN = "Indeterminable exception type in default switch branch, should be InvalidOperationException/SwitchExpressionException"; private const string ERR_MSG_SWITCH_THROWS_WRONG_TYPE = "Incorrect exception type in default switch branch, should be InvalidOperationException/SwitchExpressionException"; @@ -22,6 +29,14 @@ public class HawkSourceAnalyzer : DiagnosticAnalyzer defaultSeverity: DiagnosticSeverity.Error, isEnabledByDefault: true); + private static readonly DiagnosticDescriptor DiagListExprSpacing = new( + id: "BHI1110", + title: "Brackets of collection expression should be separated with spaces", + messageFormat: "{0}", + category: "Usage", + defaultSeverity: DiagnosticSeverity.Warning, + isEnabledByDefault: true); + private static readonly DiagnosticDescriptor DiagNoAnonClasses = new( id: "BHI1002", title: "Do not use anonymous types (classes)", @@ -64,6 +79,7 @@ public class HawkSourceAnalyzer : DiagnosticAnalyzer public override ImmutableArray SupportedDiagnostics { get; } = ImmutableArray.Create( DiagInterpStringIsDollarAt, + DiagListExprSpacing, DiagNoAnonClasses, DiagNoAnonDelegates, DiagNoDiscardingLocals, @@ -72,6 +88,24 @@ public class HawkSourceAnalyzer : DiagnosticAnalyzer public override void Initialize(AnalysisContext context) { + static string? CheckSpacingInList( + SeparatedSyntaxList listContents, + SyntaxToken openBracketToken, + Func serialiseOuter) + where T : SyntaxNode + { + if (listContents.Count is 0) return serialiseOuter() is "[ ]" ? null : ERR_MSG_LIST_EXPR_EMPTY; + var contentsWithTrivia = listContents.ToFullString(); + if (contentsWithTrivia.Contains("\n")) return null; // don't need to police spaces for multi-line expressions + if (contentsWithTrivia.Length > 1 + ? (contentsWithTrivia[contentsWithTrivia.Length - 1] is not ' ' + || contentsWithTrivia[contentsWithTrivia.Length - 2] is ' ' or '\t') + : contentsWithTrivia[0] is not ' ') + { + return ERR_MSG_LIST_EXPR_END; + } + return openBracketToken.TrailingTrivia.ToFullString() is " " ? null : ERR_MSG_LIST_EXPR_START; + } static bool IsDiscard(AssignmentExpressionSyntax aes) => aes.OperatorToken.RawKind is (int) SyntaxKind.EqualsToken && aes.Left is IdentifierNameSyntax { Identifier.Text: "_" }; context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); @@ -97,9 +131,17 @@ public class HawkSourceAnalyzer : DiagnosticAnalyzer case AssignmentExpressionSyntax aes when IsDiscard(aes) && snac.SemanticModel.GetSymbolInfo(aes.Right).Symbol?.Kind is SymbolKind.Local: snac.ReportDiagnostic(Diagnostic.Create(DiagNoDiscardingLocals, snac.Node.GetLocation())); break; + case CollectionExpressionSyntax ces: + var cesError = CheckSpacingInList(ces.Elements, ces.OpenBracketToken, ces.ToFullString); + if (cesError is not null) snac.ReportDiagnostic(Diagnostic.Create(DiagListExprSpacing, ces.GetLocation(), cesError)); + break; case InterpolatedStringExpressionSyntax ises: if (ises.StringStartToken.Text[0] is '@') snac.ReportDiagnostic(Diagnostic.Create(DiagInterpStringIsDollarAt, ises.GetLocation())); break; + case ListPatternSyntax lps: + var lpsError = CheckSpacingInList(lps.Patterns, lps.OpenBracketToken, lps.ToFullString); + if (lpsError is not null) snac.ReportDiagnostic(Diagnostic.Create(DiagListExprSpacing, lps.GetLocation(), lpsError)); + break; case QueryExpressionSyntax: snac.ReportDiagnostic(Diagnostic.Create(DiagNoQueryExpression, snac.Node.GetLocation())); break; @@ -125,7 +167,9 @@ public class HawkSourceAnalyzer : DiagnosticAnalyzer }, SyntaxKind.AnonymousObjectCreationExpression, SyntaxKind.AnonymousMethodExpression, + SyntaxKind.CollectionExpression, SyntaxKind.InterpolatedStringExpression, + SyntaxKind.ListPattern, SyntaxKind.QueryExpression, SyntaxKind.SimpleAssignmentExpression, SyntaxKind.SwitchExpressionArm); diff --git a/References/BizHawk.Analyzer.dll b/References/BizHawk.Analyzer.dll index 286a276777c6eb0d067f9bbb038ee4aa4c30eb1e..eee77cb385e586ed888193e412f52bf4573c7355 100644 GIT binary patch literal 33280 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 z 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 literal 31232 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 N#K8Z5{l8~{e+O27BTWDR diff --git a/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs b/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs index a43ad6e575..4abed96323 100644 --- a/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs +++ b/src/BizHawk.Client.Common/DisplayManager/DisplayManagerBase.cs @@ -259,7 +259,7 @@ namespace BizHawk.Client.Common break; case 2 when _shaderChainScanlines is { Available: true }: selectedChain = _shaderChainScanlines; - selectedChainProperties = [new("uIntensity", 1.0f - GlobalConfig.TargetScanlineFilterIntensity / 256.0f)]; + selectedChainProperties = [ new("uIntensity", 1.0f - GlobalConfig.TargetScanlineFilterIntensity / 256.0f) ]; break; case 3 when _shaderChainUser is { Available: true }: selectedChain = _shaderChainUser; diff --git a/src/BizHawk.Tests/Common/checksums/SHA1Tests.cs b/src/BizHawk.Tests/Common/checksums/SHA1Tests.cs index 753e841567..55dcd8143b 100644 --- a/src/BizHawk.Tests/Common/checksums/SHA1Tests.cs +++ b/src/BizHawk.Tests/Common/checksums/SHA1Tests.cs @@ -13,8 +13,8 @@ namespace BizHawk.Tests.Common.checksums [TestMethod] public void TestSHA1Empty() { - byte[] data = []; // empty data - byte[] expectedSha = [0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09]; + byte[] data = [ ]; // empty data + byte[] expectedSha = [ 0xDA, 0x39, 0xA3, 0xEE, 0x5E, 0x6B, 0x4B, 0x0D, 0x32, 0x55, 0xBF, 0xEF, 0x95, 0x60, 0x18, 0x90, 0xAF, 0xD8, 0x07, 0x09 ]; Assert.IsTrue(expectedSha.SequenceEqual(SHA1Checksum.Compute(data))); } @@ -23,7 +23,7 @@ namespace BizHawk.Tests.Common.checksums public void TestSHA1Simple() { byte[] data = "hash"u8.ToArray(); // random short data - byte[] expectedSha = [0x23, 0x46, 0xad, 0x27, 0xd7, 0x56, 0x8b, 0xa9, 0x89, 0x6f, 0x1b, 0x7d, 0xa6, 0xb5, 0x99, 0x12, 0x51, 0xde, 0xbd, 0xf2]; + byte[] expectedSha = [ 0x23, 0x46, 0xAD, 0x27, 0xD7, 0x56, 0x8B, 0xA9, 0x89, 0x6F, 0x1B, 0x7D, 0xA6, 0xB5, 0x99, 0x12, 0x51, 0xDE, 0xBD, 0xF2 ]; Assert.IsTrue(expectedSha.SequenceEqual(SHA1Checksum.Compute(data))); Assert.IsTrue(expectedSha.SequenceEqual(SHA1Checksum.ComputeConcat(Array.Empty(), data))); @@ -40,17 +40,17 @@ namespace BizHawk.Tests.Common.checksums { const string testString = "The quick brown fox jumps over the lazy dog."; byte[] data = Encoding.ASCII.GetBytes(testString); - byte[] expectedSha1 = [0x40, 0x8d, 0x94, 0x38, 0x42, 0x16, 0xf8, 0x90, 0xff, 0x7a, 0x0c, 0x35, 0x28, 0xe8, 0xbe, 0xd1, 0xe0, 0xb0, 0x16, 0x21]; + byte[] expectedSha1 = [ 0x40, 0x8D, 0x94, 0x38, 0x42, 0x16, 0xF8, 0x90, 0xFF, 0x7A, 0x0C, 0x35, 0x28, 0xE8, 0xBE, 0xD1, 0xE0, 0xB0, 0x16, 0x21 ]; Assert.IsTrue(expectedSha1.SequenceEqual(SHA1Checksum.Compute(data))); data = new byte[65]; Encoding.ASCII.GetBytes(testString).CopyTo(data, 0); - byte[] expectedSha2 = [0x65, 0x87, 0x84, 0xE2, 0x68, 0xBF, 0xB1, 0x67, 0x94, 0x7B, 0xB7, 0xF3, 0xFB, 0x76, 0x69, 0x62, 0x79, 0x3E, 0x8C, 0x46]; + byte[] expectedSha2 = [ 0x65, 0x87, 0x84, 0xE2, 0x68, 0xBF, 0xB1, 0x67, 0x94, 0x7B, 0xB7, 0xF3, 0xFB, 0x76, 0x69, 0x62, 0x79, 0x3E, 0x8C, 0x46 ]; Assert.IsTrue(expectedSha2.SequenceEqual(SHA1Checksum.Compute(new Span(data, 0, 64)))); - byte[] expectedSha3 = [0x34, 0xF3, 0xA2, 0x57, 0xBD, 0x12, 0x5E, 0x6E, 0x0E, 0x28, 0xD0, 0xE5, 0xDA, 0xBE, 0x22, 0x28, 0x97, 0xFA, 0x69, 0x55]; + byte[] expectedSha3 = [ 0x34, 0xF3, 0xA2, 0x57, 0xBD, 0x12, 0x5E, 0x6E, 0x0E, 0x28, 0xD0, 0xE5, 0xDA, 0xBE, 0x22, 0x28, 0x97, 0xFA, 0x69, 0x55 ]; Assert.IsTrue(expectedSha3.SequenceEqual(SHA1Checksum.Compute(data))); } }