From 5a6f661535dc06e718d4af907ef590e617497e47 Mon Sep 17 00:00:00 2001 From: Periapsises <94928308+Periapsises@users.noreply.github.com> Date: Thu, 27 Aug 2026 18:15:56 -0400 Subject: [PATCH 1/3] Fix nested array types not matching their empty equivalent --- Crater/SemanticAnalysis/Types/ArrayType.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Crater/SemanticAnalysis/Types/ArrayType.cs b/Crater/SemanticAnalysis/Types/ArrayType.cs index c0a6765..778b703 100644 --- a/Crater/SemanticAnalysis/Types/ArrayType.cs +++ b/Crater/SemanticAnalysis/Types/ArrayType.cs @@ -16,6 +16,9 @@ public override bool CanHold(Type other) if (other is EmptyArrayType) return true; + if (other is ArrayType otherArray) + return ElementType.CanHold(otherArray.ElementType); + return IsSameType(other); } From b684875ce7d5008a705cc085e4f8e0ed865aff70 Mon Sep 17 00:00:00 2001 From: Periapsises <94928308+Periapsises@users.noreply.github.com> Date: Thu, 27 Aug 2026 18:30:25 -0400 Subject: [PATCH 2/3] Fix nested arrays being covariant --- Crater/SemanticAnalysis/Types/ArrayType.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Crater/SemanticAnalysis/Types/ArrayType.cs b/Crater/SemanticAnalysis/Types/ArrayType.cs index 778b703..5318441 100644 --- a/Crater/SemanticAnalysis/Types/ArrayType.cs +++ b/Crater/SemanticAnalysis/Types/ArrayType.cs @@ -16,10 +16,16 @@ public override bool CanHold(Type other) if (other is EmptyArrayType) return true; - if (other is ArrayType otherArray) - return ElementType.CanHold(otherArray.ElementType); + if (other is not ArrayType otherArray) + return false; - return IsSameType(other); + if (otherArray.ElementType is EmptyArrayType) + return true; + + if (ElementType is ArrayType selfElement && otherArray.ElementType is ArrayType otherElement) + return selfElement.CanHold(otherElement); + + return ElementType.IsSameType(otherArray.ElementType); } public override bool IsSameType(Type other) From 9b87ebc099ab7a72ae922ae1c9424a52862e9dee Mon Sep 17 00:00:00 2001 From: Periapsises <94928308+Periapsises@users.noreply.github.com> Date: Thu, 27 Aug 2026 18:30:43 -0400 Subject: [PATCH 3/3] Add more tests for nested arrays --- Tests/ArrayTypeTests.cs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Tests/ArrayTypeTests.cs b/Tests/ArrayTypeTests.cs index 0db783f..9dbe3c7 100644 --- a/Tests/ArrayTypeTests.cs +++ b/Tests/ArrayTypeTests.cs @@ -58,4 +58,41 @@ public void CanIndexRecursiveArrays() Assert.That(innerResult, Is.Not.Null); Assert.That(innerResult.IsSameType(new NullableType(TypeRegistry.NumberType))); } + + [Test] + public void CanHoldNestedEmptyArray() + { + var numberArray = new ArrayType(TypeRegistry.NumberType, TypeRegistry.AnyType); + var nestedNumberArray = new ArrayType(numberArray, TypeRegistry.AnyType); + var nestedEmptyArray = new ArrayType(new EmptyArrayType(), TypeRegistry.AnyType); + + Assert.That(nestedNumberArray.CanHold(nestedEmptyArray)); + } + + [Test] + public void CanHoldDeeplyNestedEmptyArray() + { + var numberArray = new ArrayType(TypeRegistry.NumberType, TypeRegistry.AnyType); + var nestedNumberArray = new ArrayType(numberArray, TypeRegistry.AnyType); + var deeplyNestedNumberArray = new ArrayType(nestedNumberArray, TypeRegistry.AnyType); + + var emptyArray = new EmptyArrayType(); + var nestedEmptyArray = new ArrayType(emptyArray, TypeRegistry.AnyType); + var deeplyNestedEmptyArray = new ArrayType(nestedEmptyArray, TypeRegistry.AnyType); + + Assert.That(deeplyNestedNumberArray.CanHold(deeplyNestedEmptyArray)); + } + + [Test] + public void EmptyNestedArrayCannotHoldConcreteNestedArray() + { + var emptyArray = new EmptyArrayType(); + var nestedEmptyArray = new ArrayType(emptyArray, TypeRegistry.AnyType); + var emptyNestedArray = new ArrayType(nestedEmptyArray, TypeRegistry.AnyType); + + var numberArray = new ArrayType(TypeRegistry.NumberType, TypeRegistry.AnyType); + var nestedNumberArray = new ArrayType(numberArray, TypeRegistry.AnyType); + + Assert.That(!emptyNestedArray.CanHold(nestedNumberArray)); + } }