1
0
mirror of https://github.com/chylex/.NET-Community-Toolkit.git synced 2024-11-25 01:42:46 +01:00
.NET-Community-Toolkit/CommunityToolkit.Diagnostics/Generated/TypeInfo.ttinclude

116 lines
4.0 KiB
Plaintext

<#@ template language="C#"#>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".g.cs"#>
// =====================
// Auto generated file
// =====================
<#+
/// <summary>
/// A model representing the info on an enumerable type
/// </summary>
sealed class EnumerableTypeInfo
{
public EnumerableTypeInfo(
string type,
string xmlType,
string name,
string size,
string destinationType,
string cast)
{
Type = type;
XmlType = xmlType;
Name = name;
Size = size;
DestinationType = destinationType;
Cast = cast;
}
/// <summary>
/// Gets the name of the current type
/// </summary>
public string Type { get; }
/// <summary>
/// Gets the XML-formatted name of the current type (eg. with {T} instead of &lt;T>)
/// </summary>
public string XmlType { get; }
/// <summary>
/// Gets the variable name to use
/// </summary>
public string Name { get; }
/// <summary>
/// Gets the name of the property to use to retrieve the length of the current type
/// </summary>
public string Size { get; }
/// <summary>
/// Gets whether or not the current type has a "Count" property
/// </summary>
public bool HasCountProperty => Size == "Count";
/// <summary>
/// Gets the name of the destination type, when comparing counts across different collections
/// </summary>
public string DestinationType { get; }
/// <summary>
/// Gets the (optional) casting to resolve the diamond problem between different interfaces
/// </summary>
public string Cast { get; }
}
/// <summary>
/// Gets the list of available enumerable types to generate APIs for
/// </summary>
static readonly IReadOnlyList<EnumerableTypeInfo> EnumerableTypes = new[]
{
new EnumerableTypeInfo("Span<T>", "<see cref=\"Span{T}\"/>", "span", "Length", "Span<T>", ""),
new EnumerableTypeInfo("ReadOnlySpan<T>", "<see cref=\"ReadOnlySpan{T}\"/>", "span", "Length", "Span<T>", ""),
new EnumerableTypeInfo("Memory<T>", "<see cref=\"Memory{T}\"/>", "memory", "Length", "Memory<T>", ""),
new EnumerableTypeInfo("ReadOnlyMemory<T>", "<see cref=\"ReadOnlyMemory{T}\"/>", "memory", "Length", "Memory<T>", ""),
new EnumerableTypeInfo("T[]", "<see typeparamref=\"T\"/> array", "array", "Length", "T[]", ""),
new EnumerableTypeInfo("List<T>", "<see cref=\"List{T}\"/>", "list", "Count", "List<T>", "(ICollection<T>)"),
new EnumerableTypeInfo("ICollection<T>", "<see cref=\"ICollection{T}\"/>", "collection", "Count", "ICollection<T>", ""),
new EnumerableTypeInfo("IReadOnlyCollection<T>", "<see cref=\"IReadOnlyCollection{T}\"/>", "collection", "Count", "ICollection<T>", ""),
};
/// <summary>
/// Gets the list of available numeric types to generate APIs for
/// </summary>
static readonly IReadOnlyList<(string Name, string Prefix)> NumericTypes = new[]
{
("byte", "cref"),
("sbyte", "cref"),
("short", "cref"),
("ushort", "cref"),
("char", "cref"),
("int", "cref"),
("uint", "cref"),
("float", "cref"),
("long", "cref"),
("ulong", "cref"),
("double", "cref"),
("decimal", "cref"),
("nint", "langword"),
("nuint", "langword")
};
/// <summary>
/// Generates text for a given sequence of items, automatically adding the necessary spacing
/// </summary>
void GenerateTextForItems<T>(IReadOnlyList<T> items, Action<T> factory)
{
for (int i = 0; i < items.Count; i++)
{
// Insert a blank line after the first item
if (i > 0) WriteLine("");
// Invoke the factory with the current item
factory(items [i]);
}
}
#>