private TypeUsage GetNewType(TypeUsage type) { if (TypeUtils.IsStructuredType(type)) { return(this.GetTypeInfo(type).FlattenedTypeUsage); } TypeUsage elementType; if (TypeHelpers.TryGetCollectionElementType(type, out elementType)) { TypeUsage newType = this.GetNewType(elementType); if (newType.EdmEquals((MetadataItem)elementType)) { return(type); } return(TypeHelpers.CreateCollectionTypeUsage(newType)); } if (TypeUtils.IsEnumerationType(type)) { return(TypeHelpers.CreateEnumUnderlyingTypeUsage(type)); } if (TypeSemantics.IsStrongSpatialType(type)) { return(TypeHelpers.CreateSpatialUnionTypeUsage(type)); } return(type); }
/// <summary> /// Determines if a common super type (LUB) exists between type1 and type2. /// </summary> /// <param name="type1"></param> /// <param name="type2"></param> /// <param name="commonType"></param> /// <returns> /// true if a common super type between type1 and type2 exists and out commonType represents the common super type. /// false otherwise along with commonType as null /// </returns> internal static bool TryGetCommonType(TypeUsage type1, TypeUsage type2, out TypeUsage commonType) { Debug.Assert(type1 != null, "type1 must not be NULL"); Debug.Assert(type2 != null, "type2 must not be NULL"); commonType = null; if (type1.EdmEquals(type2)) { commonType = ForgetConstraints(type2); return true; } if (Helper.IsPrimitiveType(type1.EdmType) && Helper.IsPrimitiveType(type2.EdmType)) { return TryGetCommonPrimitiveType(type1, type2, out commonType); } EdmType commonEdmType; if (TryGetCommonType(type1.EdmType, type2.EdmType, out commonEdmType)) { commonType = ForgetConstraints(TypeUsage.Create(commonEdmType)); return true; } commonType = null; return false; }
/// <summary> /// determines if subType is equal to or a sub-type of superType. /// </summary> /// <param name="subType"></param> /// <param name="superType"></param> /// <returns>true if subType is equal to or a sub-type of superType, false otherwise</returns> internal static bool IsSubTypeOf(TypeUsage subType, TypeUsage superType) { Debug.Assert(subType != null, "subType must not be NULL"); Debug.Assert(superType != null, "superType must not be NULL"); if (subType.EdmEquals(superType)) { return true; } if (Helper.IsPrimitiveType(subType.EdmType) && Helper.IsPrimitiveType(superType.EdmType)) { return IsPrimitiveTypeSubTypeOf(subType, superType); } return subType.IsSubtypeOf(superType); }
/// <summary> /// determines if subType is equal to or a sub-type of superType. /// </summary> /// <param name="subType"> </param> /// <param name="superType"> </param> /// <returns> true if subType is equal to or a sub-type of superType, false otherwise </returns> internal static bool IsSubTypeOf(TypeUsage subType, TypeUsage superType) { DebugCheck.NotNull(subType); DebugCheck.NotNull(superType); if (subType.EdmEquals(superType)) { return true; } if (Helper.IsPrimitiveType(subType.EdmType) && Helper.IsPrimitiveType(superType.EdmType)) { return IsPrimitiveTypeSubTypeOf(subType, superType); } return subType.IsSubtypeOf(superType); }
/// <summary> /// Determines if a common super type (LUB) exists between type1 and type2. /// </summary> /// <param name="type1"> </param> /// <param name="type2"> </param> /// <param name="commonType"> </param> /// <returns> true if a common super type between type1 and type2 exists and out commonType represents the common super type. false otherwise along with commonType as null </returns> internal static bool TryGetCommonType(TypeUsage type1, TypeUsage type2, out TypeUsage commonType) { DebugCheck.NotNull(type1); DebugCheck.NotNull(type2); commonType = null; if (type1.EdmEquals(type2)) { commonType = ForgetConstraints(type2); return true; } if (Helper.IsPrimitiveType(type1.EdmType) && Helper.IsPrimitiveType(type2.EdmType)) { return TryGetCommonPrimitiveType(type1, type2, out commonType); } EdmType commonEdmType; if (TryGetCommonType(type1.EdmType, type2.EdmType, out commonEdmType)) { commonType = ForgetConstraints(TypeUsage.Create(commonEdmType)); return true; } commonType = null; return false; }