From 53626ac7e553061266d5b9f20bb3611ef070a897 Mon Sep 17 00:00:00 2001 From: Tim Pohlmann Date: Fri, 5 Jan 2024 17:35:03 +0100 Subject: [PATCH] Fix S1104 FP: Should be ignored on classes and structs marked as [Serializable] (#8521) --- ...kka.Persistence--netstandard2.0-S1104.json | 13 -------- ...ence.Sql.Common--netstandard2.0-S1104.json | 30 ------------------- .../FieldsShouldBeEncapsulatedInProperties.cs | 3 +- .../FieldsShouldBeEncapsulatedInProperties.cs | 8 +++++ 4 files changed, 10 insertions(+), 44 deletions(-) delete mode 100644 analyzers/its/expected/akka.net/Akka.Persistence.Sql.Common--netstandard2.0-S1104.json diff --git a/analyzers/its/expected/akka.net/Akka.Persistence--netstandard2.0-S1104.json b/analyzers/its/expected/akka.net/Akka.Persistence--netstandard2.0-S1104.json index dd7be4a8bb7..6cb5936226c 100644 --- a/analyzers/its/expected/akka.net/Akka.Persistence--netstandard2.0-S1104.json +++ b/analyzers/its/expected/akka.net/Akka.Persistence--netstandard2.0-S1104.json @@ -12,19 +12,6 @@ "endColumn": 73 } } -}, -{ -"id": "S1104", -"message": "Make this field 'private' and encapsulate it in a 'public' property.", -"location": { -"uri": "https://github.com/SonarSource/sonar-dotnet/blob/master/analyzers/its/sources/akka.net/src/core/Akka.Persistence/SnapshotProtocol.cs#L62", -"region": { -"startLine": 62, -"startColumn": 32, -"endLine": 62, -"endColumn": 73 -} -} } ] } diff --git a/analyzers/its/expected/akka.net/Akka.Persistence.Sql.Common--netstandard2.0-S1104.json b/analyzers/its/expected/akka.net/Akka.Persistence.Sql.Common--netstandard2.0-S1104.json deleted file mode 100644 index 30f27149ec1..00000000000 --- a/analyzers/its/expected/akka.net/Akka.Persistence.Sql.Common--netstandard2.0-S1104.json +++ /dev/null @@ -1,30 +0,0 @@ -{ -"issues": [ -{ -"id": "S1104", -"message": "Make this field 'private' and encapsulate it in a 'public' property.", -"location": { -"uri": "https://github.com/SonarSource/sonar-dotnet/blob/master/analyzers/its/sources/akka.net/src/contrib/persistence/Akka.Persistence.Sql.Common/Journal/QueryApi.cs#L113", -"region": { -"startLine": 113, -"startColumn": 42, -"endLine": 113, -"endColumn": 77 -} -} -}, -{ -"id": "S1104", -"message": "Make this field 'private' and encapsulate it in a 'public' property.", -"location": { -"uri": "https://github.com/SonarSource/sonar-dotnet/blob/master/analyzers/its/sources/akka.net/src/contrib/persistence/Akka.Persistence.Sql.Common/Journal/QueryApi.cs#L121", -"region": { -"startLine": 121, -"startColumn": 40, -"endLine": 121, -"endColumn": 73 -} -} -} -] -} diff --git a/analyzers/src/SonarAnalyzer.CSharp/Rules/FieldsShouldBeEncapsulatedInProperties.cs b/analyzers/src/SonarAnalyzer.CSharp/Rules/FieldsShouldBeEncapsulatedInProperties.cs index 41a324787aa..9581cc24fc4 100644 --- a/analyzers/src/SonarAnalyzer.CSharp/Rules/FieldsShouldBeEncapsulatedInProperties.cs +++ b/analyzers/src/SonarAnalyzer.CSharp/Rules/FieldsShouldBeEncapsulatedInProperties.cs @@ -50,7 +50,8 @@ protected override void Initialize(SonarAnalysisContext context) => } var parentSymbol = c.SemanticModel.GetDeclaredSymbol(fieldDeclaration.Parent); - if (parentSymbol.HasAttribute(KnownType.System_Runtime_InteropServices_StructLayoutAttribute)) + if (parentSymbol.HasAttribute(KnownType.System_Runtime_InteropServices_StructLayoutAttribute) + || parentSymbol.HasAttribute(KnownType.System_SerializableAttribute)) { return; } diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/FieldsShouldBeEncapsulatedInProperties.cs b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/FieldsShouldBeEncapsulatedInProperties.cs index 6f06a255f8e..9d4866213f5 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/FieldsShouldBeEncapsulatedInProperties.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/TestCases/FieldsShouldBeEncapsulatedInProperties.cs @@ -84,4 +84,12 @@ public class InteropClass public string value; // Compliant - for interop code } + // https://github.com/SonarSource/sonar-dotnet/issues/8504 + [Serializable] + public class Repro_8504 + { + public string type; // Compliant + public string key; // Compliant + public string value; // Compliant + } }