Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Crater/SemanticAnalysis/Types/ArrayType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,16 @@ public override bool CanHold(Type other)
if (other is EmptyArrayType)
return true;

return IsSameType(other);
if (other is not ArrayType otherArray)
return false;

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)
Expand Down
37 changes: 37 additions & 0 deletions Tests/ArrayTypeTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
}
Loading