public static string GetFnPtrFullName(FnPtrSig sig) { if (sig == null) { return(string.Empty); } var methodSig = sig.MethodSig; if (methodSig == null) { return(GetFnPtrName(sig)); } var sb = new StringBuilder(); sb.Append("method "); FullNameCreator.FullNameSB(methodSig.RetType, false, null, null, null, sb); sb.Append(" *("); PrintArgs(sb, methodSig.Params, true); if (methodSig.ParamsAfterSentinel != null) { if (methodSig.Params.Count > 0) { sb.Append(","); } sb.Append("...,"); PrintArgs(sb, methodSig.ParamsAfterSentinel, false); } sb.Append(")"); return(sb.ToString()); }
static void PrintArgs(StringBuilder sb, IList <TypeSig> args, bool isFirst) { foreach (var arg in args) { if (!isFirst) { sb.Append(","); } isFirst = false; FullNameCreator.FullNameSB(arg, false, null, null, null, sb); } }
static void AppendTypeName(StringBuilder b, TypeSig type) { if (type == null) { return; } if (type is GenericInstSig giType) { AppendTypeNameWithArguments(b, giType.GenericType == null ? null : giType.GenericType.TypeDefOrRef, giType.GenericArguments); return; } if (type is ArraySigBase arrayType) { AppendTypeName(b, arrayType.Next); b.Append('['); var lowerBounds = arrayType.GetLowerBounds(); var sizes = arrayType.GetSizes(); for (int i = 0; i < arrayType.Rank; i++) { if (i > 0) { b.Append(','); } if (i < lowerBounds.Count && i < sizes.Count) { b.Append(lowerBounds[i]); b.Append(':'); b.Append(sizes[i] + lowerBounds[i] - 1); } } b.Append(']'); return; } if (type is ByRefSig refType) { AppendTypeName(b, refType.Next); b.Append('@'); return; } if (type is PtrSig ptrType) { AppendTypeName(b, ptrType.Next); b.Append('*'); return; } if (type is GenericSig gp) { b.Append('`'); if (gp.IsMethodVar) { b.Append('`'); } b.Append(gp.Number); } else { var typeRef = type.ToTypeDefOrRef(); if (typeRef.DeclaringType != null) { AppendTypeName(b, typeRef.DeclaringType.ToTypeSig()); b.Append('.'); b.Append(typeRef.Name); } else { FullNameCreator.FullNameSB(type, false, null, null, null, b); } } }