/// <summary> /// Returns a boolean value if we can determine whether the type is managed /// without looking at its fields and Unset otherwise. /// </summary> private static (ThreeState isManaged, bool hasGenerics) IsManagedTypeHelper(NamedTypeSymbol type) { // To match dev10, we treat enums as their underlying types. if (type.IsEnumType()) { type = type.GetEnumUnderlyingType(); } bool hasGenerics = type.TupleUnderlyingTypeOrSelf().GetArity() > 0; // Short-circuit common cases. switch (type.SpecialType) { case SpecialType.System_Void: case SpecialType.System_Boolean: case SpecialType.System_Char: case SpecialType.System_Int8: case SpecialType.System_UInt8: case SpecialType.System_Int16: case SpecialType.System_UInt16: case SpecialType.System_Int32: case SpecialType.System_UInt32: case SpecialType.System_Int64: case SpecialType.System_UInt64: case SpecialType.System_Decimal: case SpecialType.System_Float32: case SpecialType.System_Float64: case SpecialType.System_Int: case SpecialType.System_UInt: case SpecialType.System_TypedReference: case SpecialType.System_ArgIterator: case SpecialType.System_RuntimeArgumentHandle: return(ThreeState.False, hasGenerics); case SpecialType.None: default: // CONSIDER: could provide cases for other common special types. break; // Proceed with additional checks. } switch (type.TypeKind) { case TypeKind.Enum: return(ThreeState.False, hasGenerics); case TypeKind.Struct: return(ThreeState.Unknown, hasGenerics); default: return(ThreeState.True, hasGenerics); } }