From 6e6f250cf01cf0e49e5b439ace69dbf86afad39a Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Tue, 14 Mar 2023 15:01:30 +0100 Subject: [PATCH 01/17] transport methods from SonarAnalysisContext to SonarLintXmlReader --- .../AnalysisContext/SonarAnalysisContextBase.cs | 16 ---------------- .../Helpers/SonarLintXmlReader.cs | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs b/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs index cc9dedd3618..2c4cbdeb06e 100644 --- a/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs +++ b/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs @@ -130,20 +130,4 @@ public bool HasMatchingScope(DiagnosticDescriptor descriptor) private ImmutableHashSet CreateUnchangedFilesHashSet() => ImmutableHashSet.Create(StringComparer.OrdinalIgnoreCase, ProjectConfiguration().AnalysisConfig?.UnchangedFiles() ?? Array.Empty()); - - private bool IsFileIncluded(SonarLintXmlReader sonarLintXml, string filePath) => - IsTestProject() - ? IsFileIncluded(sonarLintXml.TestInclusions, sonarLintXml.TestExclusions, sonarLintXml.GlobalTestExclusions, filePath) - : IsFileIncluded(sonarLintXml.Inclusions, sonarLintXml.Exclusions, sonarLintXml.GlobalExclusions, filePath); - - private static bool IsFileIncluded(string[] inclusions, string[] exclusions, string[] globalExclusions, string filePath) => - IsIncluded(inclusions, filePath) - && !IsExcluded(exclusions, filePath) - && !IsExcluded(globalExclusions, filePath); - - private static bool IsIncluded(string[] inclusions, string filePath) => - inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); - - private static bool IsExcluded(string[] exclusions, string filePath) => - exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, false)); } diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index ec69d9c96a3..bd47fd5e74d 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -76,6 +76,22 @@ language switch public SonarLintXmlReader(SourceText sonarLintXml) => this.sonarLintXml = sonarLintXml == null ? SonarLintXml.Empty : ParseContent(sonarLintXml); + public bool IsFileIncluded(string filePath, bool isTestProject) => + isTestProject + ? IsFileIncluded(TestInclusions, TestExclusions, GlobalTestExclusions, filePath) + : IsFileIncluded(Inclusions, Exclusions, GlobalExclusions, filePath); + + private static bool IsFileIncluded(string[] inclusions, string[] exclusions, string[] globalExclusions, string filePath) => + IsIncluded(inclusions, filePath) + && !IsExcluded(exclusions, filePath) + && !IsExcluded(globalExclusions, filePath); + + private static bool IsIncluded(string[] inclusions, string filePath) => + inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath)); + + private static bool IsExcluded(string[] exclusions, string filePath) => + exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath)); + private static SonarLintXml ParseContent(SourceText sonarLintXml) { try From 22b698a428d264f49d324279ceec7c5ba7c08a38 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Wed, 15 Mar 2023 13:00:41 +0100 Subject: [PATCH 02/17] fix comment --- analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXml.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXml.cs index d699d960638..2a305d92cab 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXml.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXml.cs @@ -23,7 +23,7 @@ namespace SonarAnalyzer.Helpers; /// -/// DTO to represent the SonarLint.xml for our analyzers. +/// Data class to represent the SonarLint.xml for our analyzers. /// /// /// This class should not be used in this codebase. To get SonarLint.xml properties, use . From 706e876b77f69d47cea327a3eba2ea1e67b21f4f Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Wed, 15 Mar 2023 16:54:49 +0100 Subject: [PATCH 03/17] remove backing fields - read everything in the constructor --- .../Helpers/SonarLintXmlReader.cs | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index bd47fd5e74d..f4f8b79068b 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -32,6 +32,14 @@ public class SonarLintXmlReader private readonly SonarLintXml sonarLintXml; + public string[] Exclusions { get; private set; } + public string[] Inclusions { get; private set; } + public string[] GlobalExclusions { get; private set; } + public string[] TestExclusions { get; private set; } + public string[] TestInclusions { get; private set; } + public string[] GlobalTestExclusions { get; private set; } + public List ParametrizedRules { get; private set; } + private bool? ignoreHeaderCommentsCS; private bool? ignoreHeaderCommentsVB; public bool IgnoreHeaderComments(string language) => @@ -52,29 +60,17 @@ language switch _ => throw new UnexpectedLanguageException(language) }; - private string[] exclusions; - public string[] Exclusions => exclusions ??= ReadCommaSeparatedArray(ReadSettingsProperty("sonar.exclusions")); - - private string[] inclusions; - public string[] Inclusions => inclusions ??= ReadCommaSeparatedArray(ReadSettingsProperty("sonar.inclusions")); - - private string[] globalExclusions; - public string[] GlobalExclusions => globalExclusions ??= ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.exclusions")); - - private string[] testExclusions; - public string[] TestExclusions => testExclusions ??= ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.exclusions")); - - private string[] testInclusions; - public string[] TestInclusions => testInclusions ??= ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.inclusions")); - - private string[] globalTestExclusions; - public string[] GlobalTestExclusions => globalTestExclusions ??= ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.test.exclusions")); - - private List parametrizedRules; - public List ParametrizedRules => parametrizedRules ??= ReadRuleParameters(); - - public SonarLintXmlReader(SourceText sonarLintXml) => + public SonarLintXmlReader(SourceText sonarLintXml) + { this.sonarLintXml = sonarLintXml == null ? SonarLintXml.Empty : ParseContent(sonarLintXml); + Exclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.exclusions")); + Inclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.inclusions")); + GlobalExclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.exclusions")); + TestExclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.exclusions")); + TestInclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.inclusions")); + GlobalTestExclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.test.exclusions")); + ParametrizedRules = ReadRuleParameters(); + } public bool IsFileIncluded(string filePath, bool isTestProject) => isTestProject From 6519227bc825cb9d92b2467b798b8ead1244a43c Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Wed, 15 Mar 2023 16:58:02 +0100 Subject: [PATCH 04/17] fix after rebase --- .../AnalysisContext/SonarAnalysisContextBase.cs | 3 +-- .../src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs b/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs index 2c4cbdeb06e..fec48413843 100644 --- a/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs +++ b/analyzers/src/SonarAnalyzer.Common/AnalysisContext/SonarAnalysisContextBase.cs @@ -125,8 +125,7 @@ public bool HasMatchingScope(DiagnosticDescriptor descriptor) // If ProjectType is not 'Unknown' it means we are in S4NET context and all files are analyzed. // If ProjectType is 'Unknown' then we are in SonarLint or NuGet context and we need to check if the file has been excluded from analysis through SonarLint.xml. ProjectConfiguration().ProjectType == ProjectType.Unknown - && FileInclusionCache.GetValue(Compilation, _ => new()) is var cache - && !cache.GetOrAdd(filePath, _ => IsFileIncluded(sonarLintXml, filePath)); + && !FileInclusionCache.GetValue(Compilation, _ => new()).GetOrAdd(filePath, _ => sonarLintXml.IsFileIncluded(filePath, IsTestProject())); private ImmutableHashSet CreateUnchangedFilesHashSet() => ImmutableHashSet.Create(StringComparer.OrdinalIgnoreCase, ProjectConfiguration().AnalysisConfig?.UnchangedFiles() ?? Array.Empty()); diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index f4f8b79068b..56755eac6f8 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -78,9 +78,9 @@ public SonarLintXmlReader(SourceText sonarLintXml) : IsFileIncluded(Inclusions, Exclusions, GlobalExclusions, filePath); private static bool IsFileIncluded(string[] inclusions, string[] exclusions, string[] globalExclusions, string filePath) => - IsIncluded(inclusions, filePath) - && !IsExcluded(exclusions, filePath) - && !IsExcluded(globalExclusions, filePath); + IsIncluded(inclusions, filePath) + && !IsExcluded(exclusions, filePath) + && !IsExcluded(globalExclusions, filePath); private static bool IsIncluded(string[] inclusions, string filePath) => inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath)); From 72674726c8d2919fd7c7baa4781abe886e64155a Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Thu, 16 Mar 2023 08:59:49 +0100 Subject: [PATCH 05/17] fix after rebase --- .../src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 56755eac6f8..7268405bbb2 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -83,10 +83,10 @@ public SonarLintXmlReader(SourceText sonarLintXml) && !IsExcluded(globalExclusions, filePath); private static bool IsIncluded(string[] inclusions, string filePath) => - inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath)); + inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); private static bool IsExcluded(string[] exclusions, string filePath) => - exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath)); + exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, false)); private static SonarLintXml ParseContent(SourceText sonarLintXml) { From bc7aefd1a7b9af5f4f35b23cfc5f9089e4d38b7c Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Thu, 16 Mar 2023 09:42:48 +0100 Subject: [PATCH 06/17] Add missing tabs --- .../SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 7268405bbb2..ad8af820a85 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -74,8 +74,8 @@ public SonarLintXmlReader(SourceText sonarLintXml) public bool IsFileIncluded(string filePath, bool isTestProject) => isTestProject - ? IsFileIncluded(TestInclusions, TestExclusions, GlobalTestExclusions, filePath) - : IsFileIncluded(Inclusions, Exclusions, GlobalExclusions, filePath); + ? IsFileIncluded(TestInclusions, TestExclusions, GlobalTestExclusions, filePath) + : IsFileIncluded(Inclusions, Exclusions, GlobalExclusions, filePath); private static bool IsFileIncluded(string[] inclusions, string[] exclusions, string[] globalExclusions, string filePath) => IsIncluded(inclusions, filePath) @@ -104,8 +104,8 @@ private static SonarLintXml ParseContent(SourceText sonarLintXml) private List ReadRuleParameters() => sonarLintXml is { Rules: { } rules } - ? rules.Where(x => x.Parameters.Any()).ToList() - : new(); + ? rules.Where(x => x.Parameters.Any()).ToList() + : new(); private string ReadSettingsProperty(string property) => sonarLintXml is { Settings: { } settings } From 2f14c7dbe2fcb6d7699b4ef40b6c8ca3594f2d06 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Thu, 16 Mar 2023 15:20:03 +0100 Subject: [PATCH 07/17] apply comments --- .../Helpers/SonarLintXmlReader.cs | 60 +++++++++---------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index ad8af820a85..b46362e9daf 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -32,46 +32,40 @@ public class SonarLintXmlReader private readonly SonarLintXml sonarLintXml; - public string[] Exclusions { get; private set; } - public string[] Inclusions { get; private set; } - public string[] GlobalExclusions { get; private set; } - public string[] TestExclusions { get; private set; } - public string[] TestInclusions { get; private set; } - public string[] GlobalTestExclusions { get; private set; } - public List ParametrizedRules { get; private set; } - - private bool? ignoreHeaderCommentsCS; - private bool? ignoreHeaderCommentsVB; + public string[] Exclusions { get => Exclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.exclusions")); } + public string[] Inclusions { get => Inclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.inclusions")); } + public string[] GlobalExclusions { get => GlobalExclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.exclusions")); } + public string[] TestExclusions { get => TestExclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.exclusions")); } + public string[] TestInclusions { get => TestInclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.inclusions")); } + public string[] GlobalTestExclusions { get => GlobalTestExclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.test.exclusions")); } + public List ParametrizedRules { get => ParametrizedRules; init => ReadRuleParameters(); } + + private bool IgnoreHeaderCommentsCS { get => IgnoreHeaderCommentsCS; init => ReadBoolean(ReadSettingsProperty("sonar.cs.ignoreHeaderComments")); } + private bool IgnoreHeaderCommentsVB { get => IgnoreHeaderCommentsVB; init => ReadBoolean(ReadSettingsProperty("sonar.vbnet.ignoreHeaderComments")); } + private bool AnalyzeGeneratedCodeCS { get => AnalyzeGeneratedCodeCS; init => ReadBoolean(ReadSettingsProperty("sonar.cs.analyzeGeneratedCode")); } + private bool AnalyzeGeneratedCodeVB { get => AnalyzeGeneratedCodeVB; init => ReadBoolean(ReadSettingsProperty("sonar.vbnet.analyzeGeneratedCode")); } + + public SonarLintXmlReader(SourceText sonarLintXml) + { + this.sonarLintXml = sonarLintXml == null ? SonarLintXml.Empty : ParseContent(sonarLintXml); + } + public bool IgnoreHeaderComments(string language) => - language switch - { - LanguageNames.CSharp => ignoreHeaderCommentsCS ??= ReadBoolean(ReadSettingsProperty("sonar.cs.ignoreHeaderComments")), - LanguageNames.VisualBasic => ignoreHeaderCommentsVB ??= ReadBoolean(ReadSettingsProperty("sonar.vbnet.ignoreHeaderComments")), - _ => throw new UnexpectedLanguageException(language) - }; + language switch + { + LanguageNames.CSharp => IgnoreHeaderCommentsCS, + LanguageNames.VisualBasic => IgnoreHeaderCommentsVB, + _ => throw new UnexpectedLanguageException(language) + }; - private bool? analyzeGeneratedCodeCS; - private bool? analyzeGeneratedCodeVB; public bool AnalyzeGeneratedCode(string language) => language switch { - LanguageNames.CSharp => analyzeGeneratedCodeCS ??= ReadBoolean(ReadSettingsProperty("sonar.cs.analyzeGeneratedCode")), - LanguageNames.VisualBasic => analyzeGeneratedCodeVB ??= ReadBoolean(ReadSettingsProperty("sonar.vbnet.analyzeGeneratedCode")), + LanguageNames.CSharp => AnalyzeGeneratedCodeCS, + LanguageNames.VisualBasic => AnalyzeGeneratedCodeVB, _ => throw new UnexpectedLanguageException(language) }; - public SonarLintXmlReader(SourceText sonarLintXml) - { - this.sonarLintXml = sonarLintXml == null ? SonarLintXml.Empty : ParseContent(sonarLintXml); - Exclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.exclusions")); - Inclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.inclusions")); - GlobalExclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.exclusions")); - TestExclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.exclusions")); - TestInclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.inclusions")); - GlobalTestExclusions = ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.test.exclusions")); - ParametrizedRules = ReadRuleParameters(); - } - public bool IsFileIncluded(string filePath, bool isTestProject) => isTestProject ? IsFileIncluded(TestInclusions, TestExclusions, GlobalTestExclusions, filePath) @@ -83,7 +77,7 @@ public SonarLintXmlReader(SourceText sonarLintXml) && !IsExcluded(globalExclusions, filePath); private static bool IsIncluded(string[] inclusions, string filePath) => - inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); + inclusions.Length == 0 || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); private static bool IsExcluded(string[] exclusions, string filePath) => exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, false)); From bc2ec8c201883785618c82a12c8c5a4138173f73 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Fri, 17 Mar 2023 10:40:00 +0100 Subject: [PATCH 08/17] Turn settings to a dictionary so that its better to the eyes --- .../Helpers/SonarLintXmlReader.cs | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index b46362e9daf..0a9c5a716fa 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -18,6 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; @@ -32,22 +33,34 @@ public class SonarLintXmlReader private readonly SonarLintXml sonarLintXml; - public string[] Exclusions { get => Exclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.exclusions")); } - public string[] Inclusions { get => Inclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.inclusions")); } - public string[] GlobalExclusions { get => GlobalExclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.exclusions")); } - public string[] TestExclusions { get => TestExclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.exclusions")); } - public string[] TestInclusions { get => TestInclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.test.inclusions")); } - public string[] GlobalTestExclusions { get => GlobalTestExclusions; init => ReadCommaSeparatedArray(ReadSettingsProperty("sonar.global.test.exclusions")); } - public List ParametrizedRules { get => ParametrizedRules; init => ReadRuleParameters(); } - - private bool IgnoreHeaderCommentsCS { get => IgnoreHeaderCommentsCS; init => ReadBoolean(ReadSettingsProperty("sonar.cs.ignoreHeaderComments")); } - private bool IgnoreHeaderCommentsVB { get => IgnoreHeaderCommentsVB; init => ReadBoolean(ReadSettingsProperty("sonar.vbnet.ignoreHeaderComments")); } - private bool AnalyzeGeneratedCodeCS { get => AnalyzeGeneratedCodeCS; init => ReadBoolean(ReadSettingsProperty("sonar.cs.analyzeGeneratedCode")); } - private bool AnalyzeGeneratedCodeVB { get => AnalyzeGeneratedCodeVB; init => ReadBoolean(ReadSettingsProperty("sonar.vbnet.analyzeGeneratedCode")); } + public string[] Exclusions { get; } + public string[] Inclusions { get; } + public string[] GlobalExclusions { get; } + public string[] TestExclusions { get; } + public string[] TestInclusions { get; } + public string[] GlobalTestExclusions { get; } + public List ParametrizedRules { get; } + private bool IgnoreHeaderCommentsCS { get; } + private bool IgnoreHeaderCommentsVB { get; } + private bool AnalyzeGeneratedCodeCS { get; } + private bool AnalyzeGeneratedCodeVB { get; } public SonarLintXmlReader(SourceText sonarLintXml) { this.sonarLintXml = sonarLintXml == null ? SonarLintXml.Empty : ParseContent(sonarLintXml); + + var settings = SettingsToDictionary(); + Exclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.exclusions")); + Inclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.inclusions")); + GlobalExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.global.exclusions")); + TestExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.test.exclusions")); + TestInclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.test.inclusions")); + GlobalTestExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.global.test.exclusions")); + ParametrizedRules = ReadRuleParameters(); + IgnoreHeaderCommentsCS = ReadBoolean(settings.GetValueOrDefault("sonar.cs.ignoreHeaderComments")); + IgnoreHeaderCommentsVB = ReadBoolean(settings.GetValueOrDefault("sonar.vbnet.ignoreHeaderComments")); + AnalyzeGeneratedCodeCS = ReadBoolean(settings.GetValueOrDefault("sonar.cs.analyzeGeneratedCode")); + AnalyzeGeneratedCodeVB = ReadBoolean(settings.GetValueOrDefault("sonar.vbnet.analyzeGeneratedCode")); } public bool IgnoreHeaderComments(string language) => @@ -77,7 +90,7 @@ language switch && !IsExcluded(globalExclusions, filePath); private static bool IsIncluded(string[] inclusions, string filePath) => - inclusions.Length == 0 || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); + inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); private static bool IsExcluded(string[] exclusions, string filePath) => exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, false)); @@ -101,10 +114,10 @@ private static SonarLintXml ParseContent(SourceText sonarLintXml) ? rules.Where(x => x.Parameters.Any()).ToList() : new(); - private string ReadSettingsProperty(string property) => - sonarLintXml is { Settings: { } settings } - ? settings.Where(x => x.Key.Equals(property)).Select(x => x.Value).FirstOrDefault() - : null; + private Dictionary SettingsToDictionary() => + sonarLintXml is { Settings: { } settingsList } + ? settingsList.ToDictionary(x => x.Key, x => x.Value) + : new(); private static string[] ReadCommaSeparatedArray(string str) => string.IsNullOrEmpty(str) ? Array.Empty() : str.Split(','); From bc92dd68f534b56771a47b1da90fca3843d6fe62 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Fri, 17 Mar 2023 10:42:03 +0100 Subject: [PATCH 09/17] Remove check if SL is already read --- .../SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 0a9c5a716fa..48f331cb2b2 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -18,10 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -using System.Collections.Generic; using System.IO; -using System.Text; -using System.Xml; using System.Xml.Serialization; using Microsoft.CodeAnalysis.Text; @@ -45,11 +42,12 @@ public class SonarLintXmlReader private bool AnalyzeGeneratedCodeCS { get; } private bool AnalyzeGeneratedCodeVB { get; } - public SonarLintXmlReader(SourceText sonarLintXml) + public SonarLintXmlReader(SourceText sonarLintXmlText) { - this.sonarLintXml = sonarLintXml == null ? SonarLintXml.Empty : ParseContent(sonarLintXml); + sonarLintXml = ParseContent(sonarLintXmlText); var settings = SettingsToDictionary(); + Exclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.exclusions")); Inclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.inclusions")); GlobalExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.global.exclusions")); @@ -90,7 +88,7 @@ language switch && !IsExcluded(globalExclusions, filePath); private static bool IsIncluded(string[] inclusions, string filePath) => - inclusions is { Length: 0 } || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); + inclusions.Length == 0 || inclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, true)); private static bool IsExcluded(string[] exclusions, string filePath) => exclusions.Any(x => WildcardPatternMatcher.IsMatch(x, filePath, false)); From 78229f47c6bb90cc0f8da0c8a22e0c2cc330f914 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Fri, 17 Mar 2023 11:05:04 +0100 Subject: [PATCH 10/17] re-arrange methods --- .../SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 48f331cb2b2..29717d492a8 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -107,16 +107,16 @@ private static SonarLintXml ParseContent(SourceText sonarLintXml) } } + private Dictionary SettingsToDictionary() => + sonarLintXml is { Settings: { } settingsList } + ? settingsList.ToDictionary(x => x.Key, x => x.Value) + : new(); + private List ReadRuleParameters() => sonarLintXml is { Rules: { } rules } ? rules.Where(x => x.Parameters.Any()).ToList() : new(); - private Dictionary SettingsToDictionary() => - sonarLintXml is { Settings: { } settingsList } - ? settingsList.ToDictionary(x => x.Key, x => x.Value) - : new(); - private static string[] ReadCommaSeparatedArray(string str) => string.IsNullOrEmpty(str) ? Array.Empty() : str.Split(','); From d9d3f194b3028643753c8d7122844bfcb44e848b Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Mon, 20 Mar 2023 10:14:20 +0100 Subject: [PATCH 11/17] apply pair programming changes --- .../Helpers/SonarLintXmlReader.cs | 71 +++++++++---------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 29717d492a8..1a80a8077fe 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -27,8 +27,10 @@ namespace SonarAnalyzer.Helpers; public class SonarLintXmlReader { public static readonly SonarLintXmlReader Empty = new(null); - - private readonly SonarLintXml sonarLintXml; + private bool ignoreHeaderCommentsCS; + private bool ignoreHeaderCommentsVB; + private bool analyzeGeneratedCodeCS; + private bool analyzeGeneratedCodeVB; public string[] Exclusions { get; } public string[] Inclusions { get; } @@ -37,43 +39,50 @@ public class SonarLintXmlReader public string[] TestInclusions { get; } public string[] GlobalTestExclusions { get; } public List ParametrizedRules { get; } - private bool IgnoreHeaderCommentsCS { get; } - private bool IgnoreHeaderCommentsVB { get; } - private bool AnalyzeGeneratedCodeCS { get; } - private bool AnalyzeGeneratedCodeVB { get; } public SonarLintXmlReader(SourceText sonarLintXmlText) { - sonarLintXml = ParseContent(sonarLintXmlText); + var sonarLintXml = ParseContent(sonarLintXmlText); + var settings = sonarLintXml is { Settings: { } settingsList } + ? settingsList.ToDictionary(x => x.Key, x => x.Value) + : new Dictionary(); + Exclusions = ReadArray("sonar.exclusions"); + Inclusions = ReadArray("sonar.inclusions"); + GlobalExclusions = ReadArray("sonar.global.exclusions"); + TestExclusions = ReadArray("sonar.test.exclusions"); + TestInclusions = ReadArray("sonar.test.inclusions"); + GlobalTestExclusions = ReadArray("sonar.global.test.exclusions"); + ParametrizedRules = ReadRuleParameters(); + ignoreHeaderCommentsCS = ReadBoolean("sonar.cs.ignoreHeaderComments"); + ignoreHeaderCommentsVB = ReadBoolean("sonar.vbnet.ignoreHeaderComments"); + analyzeGeneratedCodeCS = ReadBoolean("sonar.cs.analyzeGeneratedCode"); + analyzeGeneratedCodeVB = ReadBoolean("sonar.vbnet.analyzeGeneratedCode"); - var settings = SettingsToDictionary(); + string[] ReadArray(string key) => + settings.GetValueOrDefault(key) is { } value ? value.Split(',') : Array.Empty(); - Exclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.exclusions")); - Inclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.inclusions")); - GlobalExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.global.exclusions")); - TestExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.test.exclusions")); - TestInclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.test.inclusions")); - GlobalTestExclusions = ReadCommaSeparatedArray(settings.GetValueOrDefault("sonar.global.test.exclusions")); - ParametrizedRules = ReadRuleParameters(); - IgnoreHeaderCommentsCS = ReadBoolean(settings.GetValueOrDefault("sonar.cs.ignoreHeaderComments")); - IgnoreHeaderCommentsVB = ReadBoolean(settings.GetValueOrDefault("sonar.vbnet.ignoreHeaderComments")); - AnalyzeGeneratedCodeCS = ReadBoolean(settings.GetValueOrDefault("sonar.cs.analyzeGeneratedCode")); - AnalyzeGeneratedCodeVB = ReadBoolean(settings.GetValueOrDefault("sonar.vbnet.analyzeGeneratedCode")); + bool ReadBoolean(string key) => + bool.TryParse(settings.GetValueOrDefault(key), out var value) && value; + + List ReadRuleParameters() => + sonarLintXml is { Rules: { } rules } + ? rules.Where(x => x.Parameters.Any()).ToList() + : new(); } public bool IgnoreHeaderComments(string language) => language switch { - LanguageNames.CSharp => IgnoreHeaderCommentsCS, - LanguageNames.VisualBasic => IgnoreHeaderCommentsVB, + LanguageNames.CSharp => ignoreHeaderCommentsCS, + LanguageNames.VisualBasic => ignoreHeaderCommentsVB, _ => throw new UnexpectedLanguageException(language) }; public bool AnalyzeGeneratedCode(string language) => language switch { - LanguageNames.CSharp => AnalyzeGeneratedCodeCS, - LanguageNames.VisualBasic => AnalyzeGeneratedCodeVB, + LanguageNames.CSharp => analyzeGeneratedCodeCS, + LanguageNames.VisualBasic => analyzeGeneratedCodeVB, _ => throw new UnexpectedLanguageException(language) }; @@ -106,20 +115,4 @@ private static SonarLintXml ParseContent(SourceText sonarLintXml) return SonarLintXml.Empty; } } - - private Dictionary SettingsToDictionary() => - sonarLintXml is { Settings: { } settingsList } - ? settingsList.ToDictionary(x => x.Key, x => x.Value) - : new(); - - private List ReadRuleParameters() => - sonarLintXml is { Rules: { } rules } - ? rules.Where(x => x.Parameters.Any()).ToList() - : new(); - - private static string[] ReadCommaSeparatedArray(string str) => - string.IsNullOrEmpty(str) ? Array.Empty() : str.Split(','); - - private static bool ReadBoolean(string str, bool defaultValue = false) => - bool.TryParse(str, out var propertyValue) ? propertyValue : defaultValue; } From de5dd42fc50bb67c4b5317cef2ee385f3de12aa8 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Mon, 20 Mar 2023 10:15:20 +0100 Subject: [PATCH 12/17] make bool fields readonly --- .../SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 1a80a8077fe..cf1ceb5da97 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -27,10 +27,10 @@ namespace SonarAnalyzer.Helpers; public class SonarLintXmlReader { public static readonly SonarLintXmlReader Empty = new(null); - private bool ignoreHeaderCommentsCS; - private bool ignoreHeaderCommentsVB; - private bool analyzeGeneratedCodeCS; - private bool analyzeGeneratedCodeVB; + private readonly bool ignoreHeaderCommentsCS; + private readonly bool ignoreHeaderCommentsVB; + private readonly bool analyzeGeneratedCodeCS; + private readonly bool analyzeGeneratedCodeVB; public string[] Exclusions { get; } public string[] Inclusions { get; } From 017ac16a7fbba974f88c7a8bb7841f0317dba913 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Mon, 20 Mar 2023 11:04:49 +0100 Subject: [PATCH 13/17] fix UTs --- .../Helpers/SonarLintXmlReader.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index cf1ceb5da97..96352fb6853 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -43,9 +43,7 @@ public class SonarLintXmlReader public SonarLintXmlReader(SourceText sonarLintXmlText) { var sonarLintXml = ParseContent(sonarLintXmlText); - var settings = sonarLintXml is { Settings: { } settingsList } - ? settingsList.ToDictionary(x => x.Key, x => x.Value) - : new Dictionary(); + var settings = sonarLintXml.Settings?.ToDictionary(x => x.Key, x => x.Value) ?? new Dictionary(); Exclusions = ReadArray("sonar.exclusions"); Inclusions = ReadArray("sonar.inclusions"); GlobalExclusions = ReadArray("sonar.global.exclusions"); @@ -59,15 +57,15 @@ public SonarLintXmlReader(SourceText sonarLintXmlText) analyzeGeneratedCodeVB = ReadBoolean("sonar.vbnet.analyzeGeneratedCode"); string[] ReadArray(string key) => - settings.GetValueOrDefault(key) is { } value ? value.Split(',') : Array.Empty(); + settings.GetValueOrDefault(key) is string value && !string.IsNullOrEmpty(value) + ? value.Split(',') + : Array.Empty(); bool ReadBoolean(string key) => bool.TryParse(settings.GetValueOrDefault(key), out var value) && value; List ReadRuleParameters() => - sonarLintXml is { Rules: { } rules } - ? rules.Where(x => x.Parameters.Any()).ToList() - : new(); + sonarLintXml.Rules?.Where(x => x.Parameters.Any()).ToList() ?? new(); } public bool IgnoreHeaderComments(string language) => From 0424e304bd781101aa92f0547f94f38fd330a92f Mon Sep 17 00:00:00 2001 From: Mary Georgiou <89914005+mary-georgiou-sonarsource@users.noreply.github.com> Date: Mon, 20 Mar 2023 12:22:12 +0100 Subject: [PATCH 14/17] Update condition Co-authored-by: Pavel Mikula <57188685+pavel-mikula-sonarsource@users.noreply.github.com> --- .../src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 96352fb6853..95e6965c6f4 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -57,7 +57,7 @@ public SonarLintXmlReader(SourceText sonarLintXmlText) analyzeGeneratedCodeVB = ReadBoolean("sonar.vbnet.analyzeGeneratedCode"); string[] ReadArray(string key) => - settings.GetValueOrDefault(key) is string value && !string.IsNullOrEmpty(value) + settings.GetValueOrDefault(key) is { } value && !string.IsNullOrEmpty(value) ? value.Split(',') : Array.Empty(); From 00c54dc8c54eae4edc7b627ed7061d0f56fd93ea Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Tue, 21 Mar 2023 14:11:12 +0100 Subject: [PATCH 15/17] cover case of duplicate keys in sonarlint xml --- .../Helpers/SonarLintXmlReader.cs | 2 +- .../Helpers/SonarLintXmlReaderTest.cs | 16 ++++++++++ .../Duplicated_Properties/SonarLint.xml | 29 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 analyzers/tests/SonarAnalyzer.UnitTest/ResourceTests/SonarLintXml/Duplicated_Properties/SonarLint.xml diff --git a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs index 95e6965c6f4..0428e42dbf4 100644 --- a/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs +++ b/analyzers/src/SonarAnalyzer.Common/Helpers/SonarLintXmlReader.cs @@ -43,7 +43,7 @@ public class SonarLintXmlReader public SonarLintXmlReader(SourceText sonarLintXmlText) { var sonarLintXml = ParseContent(sonarLintXmlText); - var settings = sonarLintXml.Settings?.ToDictionary(x => x.Key, x => x.Value) ?? new Dictionary(); + var settings = sonarLintXml.Settings?.GroupBy(x => x.Key).ToDictionary(x => x.Key, x => x.First().Value) ?? new Dictionary(); Exclusions = ReadArray("sonar.exclusions"); Inclusions = ReadArray("sonar.inclusions"); GlobalExclusions = ReadArray("sonar.global.exclusions"); diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs b/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs index 5caa7a84e9e..1158a3f91d8 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs @@ -82,6 +82,22 @@ public void SonarLintXmlReader_PropertiesCSharpTrueVBNetFalse_ExpectedValues() sut.AnalyzeGeneratedCode(LanguageNames.VisualBasic).Should().BeFalse(); } + [TestMethod] + public void SonarLintXmlReader_DuplicatedProperties_DoesNotFail() + { + try + { + _ = CreateSonarLintXmlReader("ResourceTests\\SonarLintXml\\Duplicated_Properties\\SonarLint.xml"); + } + catch (ArgumentException ex) + { + if (ex.Message.Contains("An item with the same key has already been added.")) + { + Assert.Fail("Expected no exception, but got: " + ex.Message); + } + } + } + [DataTestMethod] [DataRow("")] [DataRow("this is not an xml")] diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/ResourceTests/SonarLintXml/Duplicated_Properties/SonarLint.xml b/analyzers/tests/SonarAnalyzer.UnitTest/ResourceTests/SonarLintXml/Duplicated_Properties/SonarLint.xml new file mode 100644 index 00000000000..8467c593275 --- /dev/null +++ b/analyzers/tests/SonarAnalyzer.UnitTest/ResourceTests/SonarLintXml/Duplicated_Properties/SonarLint.xml @@ -0,0 +1,29 @@ + + + + + sonar.cs.ignoreHeaderComments + true + + + sonar.cs.ignoreHeaderComments + true + + + sonar.cs.analyzeGeneratedCode + true + + + sonar.cs.analyzeGeneratedCode + false + + + sonar.exclusions + Fake/Exclusions/**/*,Fake/Exclusions/Second*/**/* + + + sonar.exclusions + Fake/Inclusions/**/* + + + From f3adb1c2b57ec0545c2df119053885bc4fe1bbbd Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Tue, 21 Mar 2023 14:39:17 +0100 Subject: [PATCH 16/17] test not throwing with action and make all paths verbatim strings --- .../Helpers/SonarLintXmlReaderTest.cs | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs b/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs index 1158a3f91d8..2d32b977647 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs @@ -32,7 +32,7 @@ public class SonarLintXmlReaderTest [DataRow(LanguageNames.VisualBasic, "vbnet")] public void SonarLintXmlReader_WhenAllValuesAreSet_ExpectedValues(string language, string xmlLanguageName) { - var sut = CreateSonarLintXmlReader($"ResourceTests\\SonarLintXml\\All_Properties_{xmlLanguageName}\\SonarLint.xml"); + var sut = CreateSonarLintXmlReader(@$"ResourceTests\SonarLintXml\All_Properties_{xmlLanguageName}\SonarLint.xml"); sut.IgnoreHeaderComments(language).Should().BeTrue(); sut.AnalyzeGeneratedCode(language).Should().BeFalse(); AssertArrayContent(sut.Exclusions, nameof(sut.Exclusions)); @@ -60,7 +60,7 @@ static void AssertArrayContent(string[] array, string folder) [TestMethod] public void SonarLintXmlReader_PartiallyMissingProperties_ExpectedAndDefaultValues() { - var sut = CreateSonarLintXmlReader("ResourceTests\\SonarLintXml\\Partially_missing_properties\\SonarLint.xml"); + var sut = CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\Partially_missing_properties\SonarLint.xml"); sut.IgnoreHeaderComments(LanguageNames.CSharp).Should().BeFalse(); sut.AnalyzeGeneratedCode(LanguageNames.CSharp).Should().BeTrue(); AssertArrayContent(sut.Exclusions, nameof(sut.Exclusions)); @@ -75,7 +75,7 @@ public void SonarLintXmlReader_PartiallyMissingProperties_ExpectedAndDefaultValu [TestMethod] public void SonarLintXmlReader_PropertiesCSharpTrueVBNetFalse_ExpectedValues() { - var sut = CreateSonarLintXmlReader("ResourceTests\\SonarLintXml\\PropertiesCSharpTrueVbnetFalse\\SonarLint.xml"); + var sut = CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\PropertiesCSharpTrueVbnetFalse\SonarLint.xml"); sut.IgnoreHeaderComments(LanguageNames.CSharp).Should().BeTrue(); sut.IgnoreHeaderComments(LanguageNames.VisualBasic).Should().BeFalse(); sut.AnalyzeGeneratedCode(LanguageNames.CSharp).Should().BeTrue(); @@ -83,20 +83,8 @@ public void SonarLintXmlReader_PropertiesCSharpTrueVBNetFalse_ExpectedValues() } [TestMethod] - public void SonarLintXmlReader_DuplicatedProperties_DoesNotFail() - { - try - { - _ = CreateSonarLintXmlReader("ResourceTests\\SonarLintXml\\Duplicated_Properties\\SonarLint.xml"); - } - catch (ArgumentException ex) - { - if (ex.Message.Contains("An item with the same key has already been added.")) - { - Assert.Fail("Expected no exception, but got: " + ex.Message); - } - } - } + public void SonarLintXmlReader_DuplicatedProperties_DoesNotFail() => + ((Action)(() => CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\Duplicated_Properties\SonarLint.xml"))).Should().NotThrow(); [DataTestMethod] [DataRow("")] @@ -107,11 +95,11 @@ public void SonarLintXmlReader_DuplicatedProperties_DoesNotFail() [TestMethod] public void SonarLintXmlReader_MissingProperties_DefaultBehaviour() => - CheckSonarLintXmlReaderDefaultValues(CreateSonarLintXmlReader("ResourceTests\\SonarLintXml\\Missing_properties\\SonarLint.xml")); + CheckSonarLintXmlReaderDefaultValues(CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\Missing_propertiesSonarLint.xml")); [TestMethod] public void SonarLintXmlReader_WithIncorrectValueType_DefaultBehaviour() => - CheckSonarLintXmlReaderDefaultValues(CreateSonarLintXmlReader("ResourceTests\\SonarLintXml\\Incorrect_value_type\\SonarLint.xml")); + CheckSonarLintXmlReaderDefaultValues(CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\Incorrect_value_type\SonarLint.xml")); [TestMethod] public void SonarLintXmlReader_CheckEmpty_DefaultBehaviour() => @@ -120,7 +108,7 @@ public void SonarLintXmlReader_DuplicatedProperties_DoesNotFail() [TestMethod] public void SonarLintXmlReader_LanguageDoesNotExist_Throws() { - var sut = CreateSonarLintXmlReader($"ResourceTests\\SonarLintXml\\All_Properties_cs\\SonarLint.xml"); + var sut = CreateSonarLintXmlReader(@$"ResourceTests\SonarLintXmlAll_Properties_csSonarLint.xml"); sut.Invoking(x => x.IgnoreHeaderComments(LanguageNames.FSharp)).Should().Throw().WithMessage("Unexpected language: F#"); sut.Invoking(x => x.AnalyzeGeneratedCode(LanguageNames.FSharp)).Should().Throw().WithMessage("Unexpected language: F#"); } From 1cf7c284a5eaf7f506c399fffef5399464921c22 Mon Sep 17 00:00:00 2001 From: mary-georgiou-sonarsource Date: Tue, 21 Mar 2023 15:33:02 +0100 Subject: [PATCH 17/17] fix paths --- .../SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs b/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs index 2d32b977647..f7da4574353 100644 --- a/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs +++ b/analyzers/tests/SonarAnalyzer.UnitTest/Helpers/SonarLintXmlReaderTest.cs @@ -95,7 +95,7 @@ public void SonarLintXmlReader_PropertiesCSharpTrueVBNetFalse_ExpectedValues() [TestMethod] public void SonarLintXmlReader_MissingProperties_DefaultBehaviour() => - CheckSonarLintXmlReaderDefaultValues(CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\Missing_propertiesSonarLint.xml")); + CheckSonarLintXmlReaderDefaultValues(CreateSonarLintXmlReader(@"ResourceTests\SonarLintXml\Missing_properties\SonarLint.xml")); [TestMethod] public void SonarLintXmlReader_WithIncorrectValueType_DefaultBehaviour() => @@ -108,7 +108,7 @@ public void SonarLintXmlReader_PropertiesCSharpTrueVBNetFalse_ExpectedValues() [TestMethod] public void SonarLintXmlReader_LanguageDoesNotExist_Throws() { - var sut = CreateSonarLintXmlReader(@$"ResourceTests\SonarLintXmlAll_Properties_csSonarLint.xml"); + var sut = CreateSonarLintXmlReader(@$"ResourceTests\SonarLintXml\All_Properties_cs\SonarLint.xml"); sut.Invoking(x => x.IgnoreHeaderComments(LanguageNames.FSharp)).Should().Throw().WithMessage("Unexpected language: F#"); sut.Invoking(x => x.AnalyzeGeneratedCode(LanguageNames.FSharp)).Should().Throw().WithMessage("Unexpected language: F#"); }