Skip to content

Commit 65e66b2

Browse files
Fix 6 SonarCloud code smell issues (S927, S3267, S3776, S3261) (#74)
* Initial plan * Fix 6 SonarCloud code smell issues (S927, S3267, S3776, S3261) Agent-Logs-Url: https://github.com/304NotModified/SLNX-validator/sessions/6df1aa82-2af8-4187-b1f3-29b91d96cf94 Co-authored-by: 304NotModified <5808377+304NotModified@users.noreply.github.com> * Delete src/SLNX-validator.Core/SonarQubeReporting/SonarRuleSeverity.cs --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: 304NotModified <5808377+304NotModified@users.noreply.github.com>
1 parent 93275aa commit 65e66b2

6 files changed

Lines changed: 71 additions & 87 deletions

File tree

src/SLNX-validator.Core/SarifReporting/SarifReporter.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@ public sealed class SarifReporter(IFileSystem fileSystem) : ReporterBase(fileSys
1212
private const string ToolName = "slnx-validator";
1313
private static readonly string ToolInformationUri = ThisAssembly.Info.RepositoryUrl;
1414

15-
public override async Task WriteReportAsync(ReportResults reportResults, Stream outputStream)
15+
public override async Task WriteReportAsync(ReportResults results, Stream outputStream)
1616
{
17-
var usedCodes = reportResults.UsedCodes;
17+
var usedCodes = results.UsedCodes;
1818

1919
var rules = usedCodes
20-
.Select(c => BuildRule(c, reportResults.Overrides))
20+
.Select(c => BuildRule(c, results.Overrides))
2121
.ToList();
2222

23-
var sarifResults = reportResults.Results
23+
var sarifResults = results.Results
2424
.SelectMany(r => r.Errors
25-
.Where(e => !reportResults.Overrides.IsIgnored(e.Code))
26-
.Select(e => BuildResult(r.File, e, reportResults.Overrides)))
25+
.Where(e => !results.Overrides.IsIgnored(e.Code))
26+
.Select(e => BuildResult(r.File, e, results.Overrides)))
2727
.ToList();
2828

2929
var log = new SarifLog

src/SLNX-validator.Core/SonarQubeReporting/SonarReporter.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ namespace JulianVerdurmen.SlnxValidator.Core.SonarQubeReporting;
77

88
public sealed class SonarReporter(IFileSystem fileSystem) : ReporterBase(fileSystem), ISonarReporter
99
{
10-
public override async Task WriteReportAsync(ReportResults reportResults, Stream outputStream)
10+
public override async Task WriteReportAsync(ReportResults results, Stream outputStream)
1111
{
12-
var usedCodes = reportResults.UsedCodes;
12+
var usedCodes = results.UsedCodes;
1313

14-
var rules = usedCodes.Select(c => BuildRule(c, reportResults.Overrides)).ToList();
14+
var rules = usedCodes.Select(c => BuildRule(c, results.Overrides)).ToList();
1515

16-
var issues = reportResults.Results
16+
var issues = results.Results
1717
.SelectMany(r => r.Errors
18-
.Where(e => !reportResults.Overrides.IsIgnored(e.Code))
18+
.Where(e => !results.Overrides.IsIgnored(e.Code))
1919
.Select(e => BuildIssue(r.File, e)))
2020
.ToList();
2121

src/SLNX-validator.Core/SonarQubeReporting/SonarRuleSeverity.cs

Lines changed: 0 additions & 3 deletions
This file was deleted.

src/SLNX-validator.Core/Validation/RequiredFilesChecker.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,14 @@ public IReadOnlyList<ValidationError> CheckInSlnx(
3535
SlnxFile slnxFile)
3636
{
3737
var errors = new List<ValidationError>();
38-
foreach (var requiredPath in requiredAbsolutePaths)
38+
foreach (var requiredPath in requiredAbsolutePaths.Where(p => !slnxFile.Files.Contains(p, StringComparer.OrdinalIgnoreCase)))
3939
{
40-
if (!slnxFile.Files.Contains(requiredPath, StringComparer.OrdinalIgnoreCase))
41-
{
42-
var relativePath = Path.GetRelativePath(slnxFile.SlnxDirectory, requiredPath).Replace('\\', '/');
43-
errors.Add(new ValidationError(
44-
ValidationErrorCode.RequiredFileNotReferencedInSolution,
45-
$"Required file is not referenced in the solution: {requiredPath}" +
46-
$" — add: <File Path=\"{relativePath}\" />",
47-
ShortMessage: $"Required file is not referenced in the solution — add: <File Path=\"{relativePath}\" />"));
48-
}
40+
var relativePath = Path.GetRelativePath(slnxFile.SlnxDirectory, requiredPath).Replace('\\', '/');
41+
errors.Add(new ValidationError(
42+
ValidationErrorCode.RequiredFileNotReferencedInSolution,
43+
$"Required file is not referenced in the solution: {requiredPath}" +
44+
$" — add: <File Path=\"{relativePath}\" />",
45+
ShortMessage: $"Required file is not referenced in the solution — add: <File Path=\"{relativePath}\" />"));
4946
}
5047

5148
return errors;

src/SLNX-validator.Core/Validation/SlnxFile.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,8 @@ private static SlnxFileEntry ParseFileEntry(XElement el)
105105
private static IReadOnlyList<string> ComputeAbsoluteFiles(SlnxSolution solution, string slnxDirectory)
106106
{
107107
var refs = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
108-
foreach (var entry in solution.AllFiles())
108+
foreach (var path in solution.AllFiles().Where(entry => !string.IsNullOrEmpty(entry.Path)).Select(entry => entry.Path))
109109
{
110-
var path = entry.Path;
111-
if (string.IsNullOrEmpty(path))
112-
continue;
113-
114110
var fullPath = Path.IsPathRooted(path)
115111
? Path.GetFullPath(path)
116112
: Path.GetFullPath(Path.Combine(slnxDirectory, path));

src/SLNX-validator/SlnxCollector.cs

Lines changed: 52 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -17,75 +17,69 @@ public async Task<IReadOnlyList<FileValidationResult>> CollectAsync(
1717
var results = new List<FileValidationResult>(files.Count);
1818

1919
foreach (var file in files)
20-
{
21-
if (!fileSystem.FileExists(file))
22-
{
23-
results.Add(Error(file, ValidationErrorCode.FileNotFound, $"File not found: {file}",
24-
shortMessage: "The specified .slnx file does not exist"));
25-
continue;
26-
}
20+
results.Add(await ProcessFileAsync(file, requiredFilesOptions, cancellationToken));
2721

28-
if (!string.Equals(Path.GetExtension(file), ".slnx", StringComparison.OrdinalIgnoreCase))
29-
{
30-
results.Add(Error(file, ValidationErrorCode.InvalidExtension,
31-
$"Expected a .slnx file, but got: {Path.GetFileName(file)}"));
32-
continue;
33-
}
22+
return results;
23+
}
3424

35-
if (IsBinaryFile(file))
36-
{
37-
results.Add(Error(file, ValidationErrorCode.NotATextFile,
38-
$"File is not a text file: {Path.GetFileName(file)}"));
39-
continue;
40-
}
25+
private async Task<FileValidationResult> ProcessFileAsync(
26+
string file,
27+
RequiredFilesOptions? requiredFilesOptions,
28+
CancellationToken cancellationToken)
29+
{
30+
if (!fileSystem.FileExists(file))
31+
return Error(file, ValidationErrorCode.FileNotFound, $"File not found: {file}",
32+
shortMessage: "The specified .slnx file does not exist");
4133

42-
var content = await fileSystem.ReadAllTextAsync(file, cancellationToken);
43-
var directory = Path.GetDirectoryName(file)!;
34+
if (!string.Equals(Path.GetExtension(file), ".slnx", StringComparison.OrdinalIgnoreCase))
35+
return Error(file, ValidationErrorCode.InvalidExtension,
36+
$"Expected a .slnx file, but got: {Path.GetFileName(file)}");
4437

45-
XDocument doc;
46-
try
47-
{
48-
doc = XDocument.Parse(content, LoadOptions.SetLineInfo);
49-
}
50-
catch (XmlException ex)
51-
{
52-
results.Add(Error(file, ValidationErrorCode.InvalidXml, $"Invalid XML: {ex.Message}",
53-
line: ex.LineNumber, column: ex.LinePosition));
54-
continue;
55-
}
38+
if (IsBinaryFile(file))
39+
return Error(file, ValidationErrorCode.NotATextFile,
40+
$"File is not a text file: {Path.GetFileName(file)}");
41+
42+
var content = await fileSystem.ReadAllTextAsync(file, cancellationToken);
43+
var directory = Path.GetDirectoryName(file)!;
44+
45+
XDocument doc;
46+
try
47+
{
48+
doc = XDocument.Parse(content, LoadOptions.SetLineInfo);
49+
}
50+
catch (XmlException ex)
51+
{
52+
return Error(file, ValidationErrorCode.InvalidXml, $"Invalid XML: {ex.Message}",
53+
line: ex.LineNumber, column: ex.LinePosition);
54+
}
5655

57-
var slnxFile = SlnxFile.FromDocument(doc, content, directory);
58-
var validationResult = await validator.ValidateAsync(slnxFile, cancellationToken);
59-
var allErrors = validationResult.Errors.ToList();
56+
var slnxFile = SlnxFile.FromDocument(doc, content, directory);
57+
var validationResult = await validator.ValidateAsync(slnxFile, cancellationToken);
58+
var allErrors = validationResult.Errors.ToList();
6059

61-
if (requiredFilesOptions is not null)
60+
if (requiredFilesOptions is not null)
61+
{
62+
var matched = requiredFilesOptions.MatchedPaths;
63+
if (matched is null || matched.Count == 0)
6264
{
63-
var matched = requiredFilesOptions.MatchedPaths;
64-
if (matched is null || matched.Count == 0)
65-
{
66-
allErrors.Add(new ValidationError(
67-
ValidationErrorCode.RequiredFileDoesntExistOnSystem,
68-
$"Required file does not exist on the system. No files matched: {requiredFilesOptions.Pattern}"));
69-
}
70-
else
71-
{
72-
var hasXsdErrors = allErrors.Any(e => e.Code == ValidationErrorCode.XsdViolation);
73-
if (!hasXsdErrors)
74-
{
75-
allErrors.AddRange(requiredFilesChecker.CheckInSlnx(matched, slnxFile));
76-
}
77-
}
65+
allErrors.Add(new ValidationError(
66+
ValidationErrorCode.RequiredFileDoesntExistOnSystem,
67+
$"Required file does not exist on the system. No files matched: {requiredFilesOptions.Pattern}"));
7868
}
79-
80-
results.Add(new FileValidationResult
69+
else
8170
{
82-
File = file,
83-
HasErrors = allErrors.Count > 0,
84-
Errors = allErrors,
85-
});
71+
var hasXsdErrors = allErrors.Any(e => e.Code == ValidationErrorCode.XsdViolation);
72+
if (!hasXsdErrors)
73+
allErrors.AddRange(requiredFilesChecker.CheckInSlnx(matched, slnxFile));
74+
}
8675
}
8776

88-
return results;
77+
return new FileValidationResult
78+
{
79+
File = file,
80+
HasErrors = allErrors.Count > 0,
81+
Errors = allErrors,
82+
};
8983
}
9084

9185
private static FileValidationResult Error(string file, ValidationErrorCode code, string message,

0 commit comments

Comments
 (0)