Skip to content

Commit 8d3a046

Browse files
committed
fix: in rare cases, compare could be called on partial initialized object
1 parent 3e05dd3 commit 8d3a046

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

Catglobe.ResXFileCodeGenerator.Tests/Catglobe.ResXFileCodeGenerator.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>net9.0</TargetFramework>

Catglobe.ResXFileCodeGenerator.Tests/GroupResxFilesTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,26 @@ public void FileGrouping()
171171
}
172172
}
173173

174+
[Fact]
175+
public void ResxFile_EqualityOperators_ShouldWorkCorrectly()
176+
{
177+
var file1 = new ResxFile("Base1", null, null, SourceText.From("Content1"), ImmutableEquatableArray<byte>.Empty, new AdditionalTextStub("Path1"));
178+
var file2 = new ResxFile("Base1", null, null, SourceText.From("Content1"), ImmutableEquatableArray<byte>.Empty, new AdditionalTextStub("Path1"));
179+
var file3 = new ResxFile("Base2", null, null, SourceText.From("Content2"), ImmutableEquatableArray<byte>.Empty, new AdditionalTextStub("Path2"));
180+
ResxFile? fileNull = null;
181+
182+
(file1 == file2).ShouldBeTrue();
183+
(file1 == file3).ShouldBeFalse();
184+
(file1 != file3).ShouldBeTrue();
185+
(file1 != file2).ShouldBeFalse();
186+
187+
// Null checks
188+
(file1 == fileNull).ShouldBeFalse();
189+
(file1 != fileNull).ShouldBeTrue();
190+
(fileNull == null).ShouldBeTrue();
191+
(fileNull != null).ShouldBeFalse();
192+
}
193+
174194
}
175195

176196

Catglobe.ResXFileCodeGenerator/ResxFile.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Catglobe.ResXFileCodeGenerator;
44

5-
internal sealed record ResxFile(string Basename, CultureInfo? Culture, string? CultureIso, SourceText Content, ImmutableEquatableArray<byte> ContentHash, AdditionalText File) : IEquatable<ResxFile>
5+
internal sealed record ResxFile(string Basename, CultureInfo? Culture, string? CultureIso, SourceText Content, ImmutableEquatableArray<byte> ContentHash, AdditionalText File)
66
{
77
public bool Equals(ResxFile? other)
88
{
@@ -29,7 +29,7 @@ public override int GetHashCode()
2929
return hashCode;
3030
}
3131
}
32-
32+
3333
public override string ToString() => $"{nameof(Basename)}: {Basename}, {nameof(CultureIso)}: {CultureIso}, {nameof(Culture)}: {Culture?.LCID}";
3434

3535
public static ResxFile? From(AdditionalText file, CancellationToken ct = default)

Catglobe.ResXFileCodeGenerator/ResxGroup.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ internal sealed record ResxGroup
2020
isEnabledByDefault: true
2121
);
2222

23+
private readonly ResxFile? _mainFile;
24+
2325
/// <summary>
2426
/// Basename is the name of the file without culture and filetype
2527
/// </summary>
@@ -28,7 +30,7 @@ internal sealed record ResxGroup
2830
/// <summary>
2931
/// MainFile is the file without culture
3032
/// </summary>
31-
public ResxFile MainFile { get; }
33+
public ResxFile MainFile => _mainFile!;
3234

3335
/// <summary>
3436
/// SubFiles are ordered by culture LCID
@@ -42,7 +44,7 @@ internal sealed record ResxGroup
4244

4345
public ResxGroup(IReadOnlyList<ResxFile> resx)
4446
{
45-
MainFile = null!;
47+
_mainFile = null;
4648
SubFiles = ImmutableEquatableArray<ResxFile>.Empty;
4749
try
4850
{
@@ -57,7 +59,7 @@ public ResxGroup(IReadOnlyList<ResxFile> resx)
5759
return;
5860
}
5961

60-
MainFile = mainFile;
62+
_mainFile = mainFile;
6163
}
6264
catch
6365
{
@@ -84,22 +86,22 @@ public bool Equals(ResxGroup? other)
8486
return true;
8587
}
8688

87-
return Basename == other.Basename && MainFile.Equals(other.MainFile) && SubFiles.Equals(other.SubFiles);
89+
return Basename == other.Basename && _mainFile == other._mainFile && SubFiles.Equals(other.SubFiles);
8890
}
8991

9092
public override int GetHashCode()
9193
{
9294
unchecked
9395
{
9496
var hashCode = Basename.GetHashCode();
95-
hashCode = (hashCode * 397) ^ MainFile.GetHashCode();
97+
hashCode = (hashCode * 397) ^ (_mainFile?.GetHashCode() ?? 0);
9698
hashCode = (hashCode * 397) ^ SubFiles.GetHashCode();
9799
return hashCode;
98100
}
99101
}
100102

101103
public override string ToString()
102104
{
103-
return $"{nameof(MainFile)}: {MainFile}, {nameof(SubFiles)}: {string.Join("; ", SubFiles)}";
105+
return $"{nameof(MainFile)}: {_mainFile}, {nameof(SubFiles)}: {string.Join("; ", SubFiles)}";
104106
}
105107
}

0 commit comments

Comments
 (0)