rd-net/Lifetimes/Diagnostics/StringInterpolation/JetDefaultInterpolatedStringHandler.cs (91 lines of code) (raw):
using System;
using System.Runtime.CompilerServices;
using System.Text;
namespace JetBrains.Diagnostics.StringInterpolation;
internal struct JetDefaultInterpolatedStringHandler
{
private StringBuilder? myBuffer;
public JetDefaultInterpolatedStringHandler(int literalLength, int formattedCount)
{
myBuffer = new StringBuilder(literalLength + formattedCount * 11);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public string ToStringAndClear()
{
var result = ToString();
myBuffer = null;
return result;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AppendLiteral(string? value)
{
myBuffer ??= new StringBuilder();
myBuffer.Append(value);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private string? ToStringFormatted<T>(T value, string? format)
{
// ReSharper disable once MergeCastWithTypeCheck
return value is IFormattable
? ((IFormattable)value).ToString(format, null) // explicit cast is required to prevent boxing
: value?.ToString();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AppendFormatted<T>(T value, string? format)
{
myBuffer ??= new StringBuilder();
string? s = ToStringFormatted(value, format);
if (s is not null)
{
AppendLiteral(s);
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AppendFormatted<T>(T value, int alignment)
{
myBuffer ??= new StringBuilder();
AppendFormatted(value, alignment, format: null);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AppendFormatted<T>(T value)
{
myBuffer ??= new StringBuilder();
AppendFormatted(value, format: null);
}
public override string ToString()
{
return myBuffer?.ToString() ?? "";
}
public void AppendFormatted<T>(T value, int alignment, string? format)
{
myBuffer ??= new StringBuilder();
if (alignment == 0)
{
AppendFormatted(value, format);
return;
}
if (alignment < 0)
{
alignment = -alignment;
var oldPos = myBuffer.Length;
AppendFormatted(value, format);
var newPos = myBuffer.Length;
var written = newPos - oldPos;
var padding = alignment - written;
if (padding > 0)
myBuffer.Append(' ', padding);
}
else
{
var val = ToStringFormatted(value, format);
if (val == null)
{
myBuffer.Append(' ', alignment);
return;
}
var padding = alignment - val.Length;
if (padding > 0)
myBuffer.Append(' ', padding);
myBuffer.Append(val);
}
}
}