| 9081 | } |
| 9082 | |
| 9083 | BfType* BfModule::ResolveGenericType(BfType* unspecializedType, BfTypeVector* typeGenericArguments, BfTypeVector* methodGenericArguments, BfType* selfType, bool allowFail) |
| 9084 | { |
| 9085 | if (unspecializedType->IsGenericParam()) |
| 9086 | { |
| 9087 | auto genericParam = (BfGenericParamType*)unspecializedType; |
| 9088 | if ((genericParam->mGenericParamKind == BfGenericParamKind_Type) && (typeGenericArguments != NULL)) |
| 9089 | { |
| 9090 | if (genericParam->mGenericParamIdx < (int)typeGenericArguments->size()) |
| 9091 | return FixIntUnknown((*typeGenericArguments)[genericParam->mGenericParamIdx]); |
| 9092 | BF_ASSERT(allowFail); |
| 9093 | } |
| 9094 | if ((genericParam->mGenericParamKind == BfGenericParamKind_Method) && (methodGenericArguments != NULL)) |
| 9095 | { |
| 9096 | if (genericParam->mGenericParamIdx < (int)methodGenericArguments->size()) |
| 9097 | { |
| 9098 | auto resolvedType = FixIntUnknown((*methodGenericArguments)[genericParam->mGenericParamIdx]); |
| 9099 | if ((resolvedType != NULL) && (resolvedType->IsGenericParam())) |
| 9100 | { |
| 9101 | auto genericParamType = (BfGenericParamType*)resolvedType; |
| 9102 | //BF_ASSERT(genericParamType->mGenericParamKind != BfGenericParamKind_Method); |
| 9103 | } |
| 9104 | return resolvedType; |
| 9105 | } |
| 9106 | BF_ASSERT(allowFail); |
| 9107 | } |
| 9108 | return unspecializedType; |
| 9109 | } |
| 9110 | |
| 9111 | if ((unspecializedType->IsSelf()) && (selfType != NULL)) |
| 9112 | return selfType; |
| 9113 | |
| 9114 | if (!unspecializedType->IsUnspecializedType()) |
| 9115 | { |
| 9116 | return unspecializedType; |
| 9117 | } |
| 9118 | |
| 9119 | if (unspecializedType->IsUnknownSizedArrayType()) |
| 9120 | { |
| 9121 | auto* arrayType = (BfUnknownSizedArrayType*)unspecializedType; |
| 9122 | auto elementType = ResolveGenericType(arrayType->mElementType, typeGenericArguments, methodGenericArguments, selfType, allowFail); |
| 9123 | if (elementType == NULL) |
| 9124 | return NULL; |
| 9125 | if (elementType->IsVar()) |
| 9126 | return elementType; |
| 9127 | auto sizeType = ResolveGenericType(arrayType->mElementCountSource, typeGenericArguments, methodGenericArguments, selfType, allowFail); |
| 9128 | if (sizeType == NULL) |
| 9129 | return NULL; |
| 9130 | if (sizeType->IsConstExprValue()) |
| 9131 | { |
| 9132 | return CreateSizedArrayType(elementType, ((BfConstExprValueType*)sizeType)->mValue.mInt32); |
| 9133 | } |
| 9134 | return CreateUnknownSizedArrayType(elementType, sizeType); |
| 9135 | } |
| 9136 | |
| 9137 | if (unspecializedType->IsSizedArray()) |
| 9138 | { |
| 9139 | auto* arrayType = (BfSizedArrayType*)unspecializedType; |
| 9140 | auto elementType = ResolveGenericType(arrayType->mElementType, typeGenericArguments, methodGenericArguments, selfType, allowFail); |
nothing calls this directly
no test coverage detected