Ryujinx/src/Ryujinx.Common/Utilities/MessagePackObjectFormatter.cs
TSRBerry fc20d9b925
[Ryujinx.Common] Address dotnet-format issues (#5358)
* dotnet format style --severity info

Some changes were manually reverted.

* dotnet format analyzers --serverity info

Some changes have been minimally adapted.

* Restore a few unused methods and variables

* Silence dotnet format IDE0060 warnings

* Silence dotnet format IDE0059 warnings

* Address or silence dotnet format IDE1006 warnings

* Address dotnet format CA1816 warnings

* Address or silence dotnet format CA2211 warnings

* Silence CA1806 and CA1834 issues

* Fix formatting for switch expressions

* Address most dotnet format whitespace warnings

* Apply dotnet format whitespace formatting

A few of them have been manually reverted and the corresponding warning was silenced

* Revert formatting changes for while and for-loops

* Format if-blocks correctly

* Run dotnet format whitespace after rebase

* Run dotnet format style after rebase

* Run dotnet format analyzers after rebase

* Run dotnet format after rebase and remove unused usings

- analyzers
- style
- whitespace

* Add comments to disabled warnings

* Remove a few unused parameters

* Replace MmeShadowScratch with Array256<uint>

* Simplify properties and array initialization, Use const when possible, Remove trailing commas

* Run dotnet format after rebase

* Address IDE0251 warnings

* Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas"

This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e.

* dotnet format whitespace after rebase

* First dotnet format pass

* Second dotnet format pass

* Fix build issues

* Fix StructArrayHelpers.cs

* Apply suggestions from code review

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Fix return statements

* Fix naming rule violations

* Update src/Ryujinx.Common/Utilities/StreamUtils.cs

Co-authored-by: Ac_K <Acoustik666@gmail.com>

* Add trailing commas

* Address review feedback

* Address review feedback

* Rename remaining type parameters to TKey and TValue

* Fix manual formatting for logging levels

* Fix spacing before comments

---------

Co-authored-by: Ac_K <Acoustik666@gmail.com>
2023-06-28 18:41:38 +02:00

298 lines
7.6 KiB
C#

using MsgPack;
using System;
using System.Text;
namespace Ryujinx.Common.Utilities
{
public static class MessagePackObjectFormatter
{
public static string ToString(this MessagePackObject obj, bool pretty)
{
if (pretty)
{
return Format(obj);
}
return obj.ToString();
}
public static string Format(MessagePackObject obj)
{
var builder = new IndentedStringBuilder();
FormatMsgPackObj(obj, builder);
return builder.ToString();
}
private static void FormatMsgPackObj(MessagePackObject obj, IndentedStringBuilder builder)
{
if (obj.IsMap || obj.IsDictionary)
{
FormatMsgPackMap(obj, builder);
}
else if (obj.IsArray || obj.IsList)
{
FormatMsgPackArray(obj, builder);
}
else if (obj.IsNil)
{
builder.Append("null");
}
else
{
var literal = obj.ToObject();
if (literal is String)
{
builder.AppendQuotedString(obj.AsStringUtf16());
}
else if (literal is byte[] byteArray)
{
FormatByteArray(byteArray, builder);
}
else if (literal is MessagePackExtendedTypeObject extObject)
{
builder.Append('{');
// Indent
builder.IncreaseIndent()
.AppendLine();
// Print TypeCode field
builder.AppendQuotedString("TypeCode")
.Append(": ")
.Append(extObject.TypeCode)
.AppendLine(",");
// Print Value field
builder.AppendQuotedString("Value")
.Append(": ");
FormatByteArrayAsString(extObject.GetBody(), builder, true);
// Unindent
builder.DecreaseIndent()
.AppendLine();
builder.Append('}');
}
else
{
builder.Append(literal);
}
}
}
private static void FormatByteArray(byte[] arr, IndentedStringBuilder builder)
{
builder.Append("[ ");
foreach (var b in arr)
{
builder.Append("0x");
builder.Append(ToHexChar(b >> 4));
builder.Append(ToHexChar(b & 0xF));
builder.Append(", ");
}
// Remove trailing comma
builder.Remove(builder.Length - 2, 2);
builder.Append(" ]");
}
private static void FormatByteArrayAsString(byte[] arr, IndentedStringBuilder builder, bool withPrefix)
{
builder.Append('"');
if (withPrefix)
{
builder.Append("0x");
}
foreach (var b in arr)
{
builder.Append(ToHexChar(b >> 4));
builder.Append(ToHexChar(b & 0xF));
}
builder.Append('"');
}
private static void FormatMsgPackMap(MessagePackObject obj, IndentedStringBuilder builder)
{
var map = obj.AsDictionary();
builder.Append('{');
// Indent
builder.IncreaseIndent()
.AppendLine();
foreach (var item in map)
{
FormatMsgPackObj(item.Key, builder);
builder.Append(": ");
FormatMsgPackObj(item.Value, builder);
builder.AppendLine(",");
}
// Remove the trailing new line and comma
builder.TrimLastLine()
.Remove(builder.Length - 1, 1);
// Unindent
builder.DecreaseIndent()
.AppendLine();
builder.Append('}');
}
private static void FormatMsgPackArray(MessagePackObject obj, IndentedStringBuilder builder)
{
var arr = obj.AsList();
builder.Append("[ ");
foreach (var item in arr)
{
FormatMsgPackObj(item, builder);
builder.Append(", ");
}
// Remove trailing comma
builder.Remove(builder.Length - 2, 2);
builder.Append(" ]");
}
private static char ToHexChar(int b)
{
if (b < 10)
{
return unchecked((char)('0' + b));
}
return unchecked((char)('A' + (b - 10)));
}
internal class IndentedStringBuilder
{
const string DefaultIndent = " ";
private int _indentCount;
private int _newLineIndex;
private readonly StringBuilder _builder;
public string IndentString { get; set; } = DefaultIndent;
public IndentedStringBuilder(StringBuilder builder)
{
_builder = builder;
}
public IndentedStringBuilder()
: this(new StringBuilder())
{ }
public IndentedStringBuilder(string str)
: this(new StringBuilder(str))
{ }
public IndentedStringBuilder(int length)
: this(new StringBuilder(length))
{ }
public int Length { get => _builder.Length; }
public IndentedStringBuilder IncreaseIndent()
{
_indentCount++;
return this;
}
public IndentedStringBuilder DecreaseIndent()
{
_indentCount--;
return this;
}
public IndentedStringBuilder Append(char value)
{
_builder.Append(value);
return this;
}
public IndentedStringBuilder Append(string value)
{
_builder.Append(value);
return this;
}
public IndentedStringBuilder Append(object value)
{
this.Append(value.ToString());
return this;
}
public IndentedStringBuilder AppendQuotedString(string value)
{
_builder.Append('"');
_builder.Append(value);
_builder.Append('"');
return this;
}
public IndentedStringBuilder AppendLine()
{
_newLineIndex = _builder.Length;
_builder.AppendLine();
for (int i = 0; i < _indentCount; i++)
_builder.Append(IndentString);
return this;
}
public IndentedStringBuilder AppendLine(string value)
{
_builder.Append(value);
this.AppendLine();
return this;
}
public IndentedStringBuilder TrimLastLine()
{
_builder.Remove(_newLineIndex, _builder.Length - _newLineIndex);
return this;
}
public IndentedStringBuilder Remove(int startIndex, int length)
{
_builder.Remove(startIndex, length);
return this;
}
public override string ToString()
{
return _builder.ToString();
}
}
}
}