예제 #1
0
        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());
        }
예제 #2
0
 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);
     }
 }
예제 #3
0
 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);
         }
     }
 }