Skip to content

Commit

Permalink
Improve formatting of multidimensional arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
ElektroKill committed Jul 11, 2023
1 parent e40a2fa commit b9652f9
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -158,31 +158,48 @@ void FormatCore(DmdType type, DbgDotNetValue? value, IAdditionalTypeInfoProvider
foreach (var tuple in arrayTypesList) {
var aryType = tuple.type;
var aryValue = tuple.value;
uint elementCount;
if (aryType.IsVariableBoundArray) {
OutputWrite(ARRAY_OPEN_PAREN, DbgTextColor.Punctuation);
int rank = Math.Min(aryType.GetArrayRank(), MAX_ARRAY_RANK);
if (rank <= 0)
OutputWrite("???", DbgTextColor.Error);
else {
if (aryValue is null || aryValue.IsNull || !aryValue.GetArrayInfo(out elementCount, out var dimensionInfos))
dimensionInfos = null;
if (ShowArrayValueSizes && dimensionInfos is not null && dimensionInfos.Length == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0) {
OutputWrite(",", DbgTextColor.Punctuation);
WriteSpace();
bool sizesShown = false;
if (ShowArrayValueSizes) {
if (aryValue is not null && !aryValue.IsNull && aryValue.GetArrayInfo(out _, out var dimensionInfos) && dimensionInfos.Length == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0)
WriteCommaSpace();
if (dimensionInfos[i].BaseIndex == 0)
WriteInt32((int)dimensionInfos[i].Length);
else {
WriteInt32(dimensionInfos[i].BaseIndex);
OutputWrite("..", DbgTextColor.Operator);
WriteInt32(dimensionInfos[i].BaseIndex + (int)dimensionInfos[i].Length - 1);
}
}
if (dimensionInfos[i].BaseIndex == 0)
WriteUInt32(dimensionInfos[i].Length);
else {
WriteInt32(dimensionInfos[i].BaseIndex);
OutputWrite("..", DbgTextColor.Operator);
WriteInt32(dimensionInfos[i].BaseIndex + (int)dimensionInfos[i].Length - 1);
sizesShown = true;
}
else {
var indexes = aryType.GetArrayLowerBounds();
var sizes = aryType.GetArraySizes();
if (sizes.Count == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0)
WriteCommaSpace();
if (i >= indexes.Count || indexes[i] == 0)
WriteInt32(sizes[i]);
else {
WriteInt32(indexes[i]);
OutputWrite("..", DbgTextColor.Operator);
WriteInt32(indexes[i] + sizes[i] - 1);
}
}
sizesShown = true;
}
}
}
else {
if (!sizesShown) {
if (rank == 1)
OutputWrite("*", DbgTextColor.Operator);
OutputWrite(TypeFormatterUtils.GetArrayCommas(rank), DbgTextColor.Punctuation);
Expand All @@ -194,7 +211,7 @@ void FormatCore(DmdType type, DbgDotNetValue? value, IAdditionalTypeInfoProvider
Debug.Assert(aryType.IsSZArray);
OutputWrite(ARRAY_OPEN_PAREN, DbgTextColor.Punctuation);
if (ShowArrayValueSizes && aryValue is not null && !aryValue.IsNull) {
if (aryValue.GetArrayCount(out elementCount))
if (aryValue.GetArrayCount(out uint elementCount))
WriteUInt32(elementCount);
}
OutputWrite(ARRAY_CLOSE_PAREN, DbgTextColor.Punctuation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,31 +157,48 @@ void FormatCore(DmdType type, DbgDotNetValue? value, IAdditionalTypeInfoProvider
foreach (var tuple in arrayTypesList) {
var aryType = tuple.type;
var aryValue = tuple.value;
uint elementCount;
if (aryType.IsVariableBoundArray) {
OutputWrite(ARRAY_OPEN_PAREN, DbgTextColor.Punctuation);
int rank = Math.Min(aryType.GetArrayRank(), MAX_ARRAY_RANK);
if (rank <= 0)
OutputWrite("???", DbgTextColor.Error);
else {
if (aryValue is null || aryValue.IsNull || !aryValue.GetArrayInfo(out elementCount, out var dimensionInfos))
dimensionInfos = null;
if (ShowArrayValueSizes && dimensionInfos is not null && dimensionInfos.Length == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0) {
OutputWrite(",", DbgTextColor.Punctuation);
WriteSpace();
bool sizesShown = false;
if (ShowArrayValueSizes) {
if (aryValue is not null && !aryValue.IsNull && aryValue.GetArrayInfo(out _, out var dimensionInfos) && dimensionInfos.Length == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0)
WriteCommaSpace();
if (dimensionInfos[i].BaseIndex == 0)
WriteUInt32(dimensionInfos[i].Length);
else {
WriteInt32(dimensionInfos[i].BaseIndex);
OutputWrite("..", DbgTextColor.Operator);
WriteInt32(dimensionInfos[i].BaseIndex + (int)dimensionInfos[i].Length - 1);
}
}
if (dimensionInfos[i].BaseIndex == 0)
WriteUInt32(dimensionInfos[i].Length);
else {
WriteInt32(dimensionInfos[i].BaseIndex);
OutputWrite("..", DbgTextColor.Operator);
WriteInt32(dimensionInfos[i].BaseIndex + (int)dimensionInfos[i].Length - 1);
sizesShown = true;
}
else {
var indexes = aryType.GetArrayLowerBounds();
var sizes = aryType.GetArraySizes();
if (sizes.Count == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0)
WriteCommaSpace();
if (i >= indexes.Count || indexes[i] == 0)
WriteInt32(sizes[i]);
else {
WriteInt32(indexes[i]);
OutputWrite("..", DbgTextColor.Operator);
WriteInt32(indexes[i] + sizes[i] - 1);
}
}
sizesShown = true;
}
}
}
else {
if (!sizesShown) {
if (rank == 1)
OutputWrite("*", DbgTextColor.Operator);
OutputWrite(TypeFormatterUtils.GetArrayCommas(rank), DbgTextColor.Punctuation);
Expand All @@ -193,7 +210,7 @@ void FormatCore(DmdType type, DbgDotNetValue? value, IAdditionalTypeInfoProvider
Debug.Assert(aryType.IsSZArray);
OutputWrite(ARRAY_OPEN_PAREN, DbgTextColor.Punctuation);
if (ShowArrayValueSizes && aryValue is not null && !aryValue.IsNull) {
if (aryValue.GetArrayCount(out elementCount))
if (aryValue.GetArrayCount(out uint elementCount))
WriteUInt32(elementCount);
}
OutputWrite(ARRAY_CLOSE_PAREN, DbgTextColor.Punctuation);
Expand Down
8 changes: 4 additions & 4 deletions dnSpy/dnSpy.Decompiler/CSharp/CSharpFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -928,13 +928,13 @@ void Write(TypeSig? type, IList<TypeSig>? typeGenArgs, IList<TypeSig>? methGenAr
else {
var indexes = aryType.GetLowerBounds();
var dims = aryType.GetSizes();
if (ShowArrayValueSizes && (uint)indexes.Count == rank && (uint)dims.Count == rank) {
for (int i = 0; (uint)i < rank; i++) {
if (ShowArrayValueSizes && dims.Count == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0)
WriteCommaSpace();
if (i < indexes.Count && indexes[i] == 0)
if (i >= indexes.Count || indexes[i] == 0)
FormatInt32((int)dims[i]);
else if (i < indexes.Count && i < dims.Count) {
else {
FormatInt32(indexes[i]);
OutputWrite("..", BoxedTextColor.Operator);
FormatInt32((int)(indexes[i] + dims[i] - 1));
Expand Down
8 changes: 4 additions & 4 deletions dnSpy/dnSpy.Decompiler/VisualBasic/VisualBasicFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -891,13 +891,13 @@ void Write(TypeSig? type, IList<TypeSig>? typeGenArgs, IList<TypeSig>? methGenAr
else {
var indexes = aryType.GetLowerBounds();
var dims = aryType.GetSizes();
if (ShowArrayValueSizes && (uint)indexes.Count == rank && (uint)dims.Count == rank) {
for (int i = 0; (uint)i < rank; i++) {
if (ShowArrayValueSizes && dims.Count == rank) {
for (int i = 0; i < rank; i++) {
if (i > 0)
WriteCommaSpace();
if (i < indexes.Count && indexes[i] == 0)
if (i >= indexes.Count || indexes[i] == 0)
FormatInt32((int)dims[i]);
else if (i < indexes.Count && i < dims.Count) {
else {
FormatInt32(indexes[i]);
OutputWrite("..", BoxedTextColor.Operator);
FormatInt32((int)(indexes[i] + dims[i] - 1));
Expand Down

0 comments on commit b9652f9

Please sign in to comment.