DTLib.Demystifier/ResolvedMethod.cs
2024-09-20 02:23:38 +05:00

143 lines
4.0 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using DTLib.Demystifier.Enumerable;
namespace DTLib.Demystifier;
public class ResolvedMethod
{
public MethodBase? MethodBase { get; set; }
public Type? DeclaringType { get; set; }
public bool IsAsync { get; set; }
public bool IsLambda { get; set; }
public ResolvedParameter? ReturnParameter { get; set; }
public string? Name { get; set; }
public int? Ordinal { get; set; }
public string? GenericArguments { get; set; }
public Type[]? ResolvedGenericArguments { get; set; }
public MethodBase? SubMethodBase { get; set; }
public string? SubMethod { get; set; }
public EnumerableIList<ResolvedParameter> Parameters { get; set; }
public EnumerableIList<ResolvedParameter> SubMethodParameters { get; set; }
public int RecurseCount { get; internal set; }
internal bool IsSequentialEquivalent(ResolvedMethod obj)
{
return
IsAsync == obj.IsAsync &&
DeclaringType == obj.DeclaringType &&
Name == obj.Name &&
IsLambda == obj.IsLambda &&
Ordinal == obj.Ordinal &&
GenericArguments == obj.GenericArguments &&
SubMethod == obj.SubMethod;
}
public override string ToString() => AppendTo(new StringBuilder()).ToString();
public StringBuilder AppendTo(StringBuilder builder, bool fullName = true)
{
if (IsAsync) builder.Append("async ");
if (ReturnParameter is not null)
{
ReturnParameter.Append(builder);
builder.Append(' ');
}
if (DeclaringType is not null)
{
if (Name == ".ctor")
{
if (string.IsNullOrEmpty(SubMethod) && !IsLambda)
builder.Append("new ");
AppendDeclaringTypeName(builder, fullName);
}
else if (Name == ".cctor")
{
builder.Append("static ");
AppendDeclaringTypeName(builder, fullName);
}
else
{
AppendDeclaringTypeName(builder, fullName)
.Append('.')
.Append(Name);
}
}
else builder.Append(Name);
builder.Append(GenericArguments);
builder.Append('(');
if (MethodBase is not null)
{
var isFirst = true;
foreach (var param in Parameters)
{
if (isFirst)
isFirst = false;
else builder.Append(", ");
param.Append(builder);
}
}
else builder.Append('?');
builder.Append(')');
if (!string.IsNullOrEmpty(SubMethod) || IsLambda)
{
builder.Append('+');
builder.Append(SubMethod);
builder.Append('(');
if (SubMethodBase is not null)
{
var isFirst = true;
foreach (var param in SubMethodParameters)
{
if (isFirst)
isFirst = false;
else builder.Append(", ");
param.Append(builder);
}
}
else builder.Append('?');
builder.Append(')');
if (IsLambda)
{
builder.Append(" => { }");
if (Ordinal.HasValue)
{
builder.Append(" [");
builder.Append(Ordinal);
builder.Append(']');
}
}
}
if (RecurseCount > 0) builder.Append($" x {RecurseCount + 1:0}");
return builder;
}
private StringBuilder AppendDeclaringTypeName(StringBuilder builder, bool fullName = true)
{
return DeclaringType is not null ? builder.AppendTypeDisplayName(DeclaringType, fullName, true) : builder;
}
}