Skip to content

Commit a62d90a

Browse files
authored
Handle mixed multidimensional/jagged arrays properly (fixes dotnet#2893) (dotnet#2894)
* Generate proper typename for mixed composition arrays * Generate proper display name for mixed composition arrays * Add test to check for mixed composition array display name * Remove trailing whitespace from ArgumentsTests
1 parent d8265b7 commit a62d90a

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

src/BenchmarkDotNet/Code/ArrayParam.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,29 @@ namespace BenchmarkDotNet.Code
99
{
1010
internal static class ArrayParam
1111
{
12+
private static (string BaseElementTypeRepr, string InnerDimensions) GetDisplayString(Type arrayType)
13+
{
14+
var elemType = arrayType.GetElementType();
15+
16+
if (elemType.IsArray)
17+
{
18+
var (baseElementTypeRepr, innerDimensions) = GetDisplayString(elemType);
19+
20+
return (baseElementTypeRepr, $"[{new string(',', arrayType.GetArrayRank() - 1)}]{innerDimensions}");
21+
}
22+
23+
return (elemType.GetDisplayName(), $"[{new string(',', arrayType.GetArrayRank() - 1)}]");
24+
}
25+
1226
public static string GetDisplayString(Array array)
1327
{
1428
string dimensionRepr = string.Join(", ", Enumerable.Range(0, array.Rank).Select(array.GetLength));
1529

16-
return $"{array.GetType().GetElementType()?.GetDisplayName()}[{dimensionRepr}]";
30+
var (baseElementTypeRepr, innerDimensions) = GetDisplayString(array.GetType());
31+
32+
innerDimensions = string.Join("", innerDimensions.Split([']'], count: 2).Skip(1));
33+
34+
return $"{baseElementTypeRepr}[{dimensionRepr}]{innerDimensions}";
1735
}
1836
}
1937

src/BenchmarkDotNet/Extensions/ReflectionExtensions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,16 @@ internal static string GetCorrectCSharpTypeName(this Type type, bool includeName
5757
return type.Name;
5858

5959
if (type.IsArray)
60-
return GetCorrectCSharpTypeName(type.GetElementType()) + "[" + new string(',', type.GetArrayRank() - 1) + "]";
60+
{
61+
var typeName = GetCorrectCSharpTypeName(type.GetElementType());
62+
var parts = typeName.Split(['['], count: 2);
63+
64+
string repr = parts[0] + '[' + new string(',', type.GetArrayRank() - 1) + ']';
65+
66+
if (parts.Length == 2) return repr + '[' + parts[1];
67+
68+
return repr;
69+
}
6170

6271
return prefix + string.Join(".", GetNestedTypeNames(type, includeGenericArgumentsNamespace).Reverse());
6372
}

tests/BenchmarkDotNet.IntegrationTests/ArgumentsTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,33 @@ public void AcceptsMultidimensionalArray(int[,] arr)
692692
}
693693
}
694694

695+
[Theory, MemberData(nameof(GetToolchains), DisableDiscoveryEnumeration = true)]
696+
public void MultidimensionalAndJaggedArraysCanBeMixed(IToolchain toolchain)
697+
{
698+
var summary = CanExecute<WithMixedJaggedAndMultidimensionalArrays>(toolchain);
699+
700+
Assert.Equal(
701+
"Int32[0, 0][][,][]",
702+
summary.Table.Columns.Where(col => col.Header == "arr").First().Content[0]
703+
);
704+
}
705+
706+
public class WithMixedJaggedAndMultidimensionalArrays
707+
{
708+
public IEnumerable<int[,][][,][]> GetArrays()
709+
{
710+
yield return new int[,][][,][] { };
711+
}
712+
713+
[Benchmark]
714+
[ArgumentsSource(nameof(GetArrays))]
715+
public void AcceptsMixedArray(int[,][][,][] arr)
716+
{
717+
if (arr.Length > 0)
718+
throw new ArgumentException("Incorrect length");
719+
}
720+
}
721+
695722
[Theory, MemberData(nameof(GetToolchains), DisableDiscoveryEnumeration = true)]
696723
public void VeryBigIntegersAreSupported(IToolchain toolchain) => CanExecute<WithVeryBigInteger>(toolchain);
697724

0 commit comments

Comments
 (0)