public static bool IsStruct(this TypeSig typeSig) { var typeDef = typeSig.TryGetTypeDef(); if (typeDef == null) { return(typeSig.IsValueType && !typeSig.IsPrimitive); } else { return(typeDef.IsValueType && !typeDef.IsPrimitive && !typeDef.IsEnum); } }
public static StackValueKind GetStackValueKind(this TypeSig typeSig) { var typeDef = typeSig.TryGetTypeDef(); if (typeDef != null && typeDef.IsEnum) { return(GetStackValueKind(typeDef.GetEnumUnderlyingType())); } switch (typeSig.ElementType) { case ElementType.Boolean: case ElementType.Char: case ElementType.I1: case ElementType.U1: case ElementType.I2: case ElementType.U2: case ElementType.I4: case ElementType.U4: return(StackValueKind.Int32); case ElementType.I8: case ElementType.U8: return(StackValueKind.Int64); case ElementType.R4: case ElementType.R8: return(StackValueKind.Float); case ElementType.Ptr: case ElementType.I: return(StackValueKind.NativeInt); case ElementType.ValueType: return(StackValueKind.ValueType); case ElementType.Class: case ElementType.Array: case ElementType.SZArray: case ElementType.String: return(StackValueKind.ObjRef); case ElementType.ByRef: return(StackValueKind.ByRef); default: return(StackValueKind.Unknown); } }
static string GetTypeFullNameFromType(TypeSig typeSig) { string fullName = typeSig.FullName; var typeDef = typeSig.TryGetTypeDef(); if (typeDef != null && typeDef.IsNested) { fullName = fullName.ReplaceLastOccurrence("/", "."); } if (typeSig.IsSingleOrMultiDimensionalArray) { fullName = typeSig.ReflectionFullName.ReplaceLastOccurrence("+", "."); } return(fullName); }
private TypeSig RemapGenericType(TypeSig reference) { var typeDef = reference.TryGetTypeDef(); if (typeDef != null) { if (reference.DefinitionAssembly != null && reference.DefinitionAssembly == Module.Assembly) { return(reference); } } var genericInstSig = reference.ToGenericInstSig(); if (genericInstSig != null) { return(RemapGenericInstSig(genericInstSig)); } throw new NotImplementedException(); }
public static string ParsedTypeSignatureStr(this TypeSig typeSig, bool useValueTypes = true, string context = null, bool typesOnly = false) { switch (typeSig.ElementType) { case ElementType.Object: return("DLL2SDK::mscorlib::System::Object"); case ElementType.String: return("DLL2SDK::mscorlib::System::String"); case ElementType.Void when useValueTypes: return("void"); case ElementType.Boolean when useValueTypes: return("bool"); case ElementType.Char when useValueTypes: return("wchar_t"); case ElementType.I1 when useValueTypes: return("int8_t"); case ElementType.U1 when useValueTypes: return("uint8_t"); case ElementType.I2 when useValueTypes: return("int16_t"); case ElementType.U2 when useValueTypes: return("uint16_t"); case ElementType.I4 when useValueTypes: return("int32_t"); case ElementType.U4 when useValueTypes: return("uint32_t"); case ElementType.I8 when useValueTypes: return("int64_t"); case ElementType.U8 when useValueTypes: return("uint64_t"); case ElementType.R4 when useValueTypes: return("float"); case ElementType.R8 when useValueTypes: return("double"); case ElementType.I when useValueTypes: return("intptr_t"); case ElementType.U when useValueTypes: return("uintptr_t"); } var underlying = typeSig.GetNonNestedTypeRefScope().ResolveTypeDef(); if (underlying?.IsEnum ?? false) { return(underlying.ParsedFullName()); } if (typeSig.IsArray || typeSig.IsSZArray) { return($"DLL2SDK::Array<{typeSig.Next.ParsedReferenceTypeDefinition(context: context)}>"); } if (typeSig.IsGenericParameter) { return(typeSig.ToGenericSig().GenericParam.Name.String.Parseable()); } var genericCtx = new List <string>(); if (typeSig.IsGenericInstanceType) { var gi = typeSig.ToGenericInstSig(); genericCtx = new List <string>(gi.GenericArguments.Count); foreach (var t in gi.GenericArguments) { genericCtx.Add(t.ParsedReferenceTypeDefinition(context: context)); } } var typeDef = typeSig.TryGetTypeDef(); if (typeDef?.HasGenericParameters ?? false) { var gi = typeDef.GenericParameters; genericCtx = new List <string>(gi.Count); foreach (var t in gi) { genericCtx.Add(t.Name.String.Parseable()); } } if (genericCtx.Count > 0) { var builder = new StringBuilder(); if (!typesOnly) { builder.Append(typeSig.ToTypeDefOrRef().ParsedFullName()); } if (context == null) { builder.Append("<"); builder.Append(string.Join(", ", genericCtx)); builder.Append(">"); } else { builder.Append(context); } return(builder.ToString()); } if (typeSig.IsByRef || typeSig.IsPointer) { return($"{typeSig.Next.ParsedTypeSignatureStr(context: context)}"); } return(typeSig.ToTypeDefOrRef().ParsedFullName()); }