Code/Extensions/DisplayInfoExtensions.cs
namespace Nodebox.Extensions;
public static class DisplayInfoExtensions {
extension(DisplayInfo displayInfo) {
public string CompactName {
get {
return displayInfo.Name.Replace(" ", null);
}
}
public static DisplayInfo ForGenericType(Type type) => ForGenericTypeImpl(type);
}
// Weird bug if you don't do this smh... (see commented example below)
public static DisplayInfo ForGenericTypeImpl(Type type) {
if (_genericDisplayInfoCache.TryGetValue(type, out var cached)) {
return cached;
}
var info = DisplayInfo.ForType(type);
var name = info.CompactName;
if (TypeLibrary.GetType(type).IsGenericType) {
Type[] generics;
try {
generics = TypeLibrary.GetGenericArguments(type);
name = $"{name}<{string.Join(", ", generics.Select(x => ForGenericTypeImpl(x).Name))}>";
}
catch {
generics = TypeLibrary.GetType(type).GenericArguments;
name = $"{name}<{string.Join(", ", generics.Select(x => x.Name))}>";
}
Assert.True(generics.Length > 0); // ?
}
info.Name = name;
_genericDisplayInfoCache.Add(type, info);
return info;
}
private readonly static Dictionary<Type, DisplayInfo> _genericDisplayInfoCache = [];
}
// public class Target {
// public string Name { get; set; }
// public Target Child { get; set; }
// }
// public static class FunnyExtensions {
// extension(Target _target) {
// public static Target Compress(Target target) => CompressImpl(target);
// }
// public static Target CompressImpl(Target target) {
// return new Target {
// Name = target.Name + (target.Child != null ? Target.Compress(target.Child).Name : "")
// };
// }
// }