| 13002 | } |
| 13003 | |
| 13004 | BfType* BfModule::ResolveTypeRefAllowUnboundGenerics(BfTypeReference* typeRef, BfPopulateType populateType, BfResolveTypeRefFlags resolveFlags, bool resolveGenericParam) |
| 13005 | { |
| 13006 | if (auto genericTypeRef = BfNodeDynCast<BfGenericInstanceTypeRef>(typeRef)) |
| 13007 | { |
| 13008 | if (genericTypeRef->mGenericArguments.size() == 0) |
| 13009 | { |
| 13010 | auto genericTypeDef = ResolveGenericInstanceDef(genericTypeRef); |
| 13011 | if (genericTypeDef == NULL) |
| 13012 | return NULL; |
| 13013 | |
| 13014 | BfTypeVector typeVector; |
| 13015 | for (int i = 0; i < (int)genericTypeDef->mGenericParamDefs.size(); i++) |
| 13016 | typeVector.push_back(GetGenericParamType(BfGenericParamKind_Type, i)); |
| 13017 | auto result = ResolveTypeDef(genericTypeDef, typeVector, populateType, resolveFlags); |
| 13018 | if ((result != NULL) && (genericTypeRef->mCommas.size() + 1 != genericTypeDef->mGenericParamDefs.size())) |
| 13019 | { |
| 13020 | SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurTypeInstance, result->ToTypeInstance()); |
| 13021 | SetAndRestoreValue<BfMethodInstance*> prevMethodInstance(mCurMethodInstance, NULL); |
| 13022 | Fail(StrFormat("Type '%s' requires %d generic arguments", TypeToString(result).c_str(), genericTypeDef->mGenericParamDefs.size()), typeRef); |
| 13023 | } |
| 13024 | return result; |
| 13025 | } |
| 13026 | } |
| 13027 | |
| 13028 | return ResolveTypeRef(typeRef, populateType, resolveGenericParam ? (BfResolveTypeRefFlags)0 : BfResolveTypeRefFlag_NoResolveGenericParam); |
| 13029 | } |
| 13030 | |
| 13031 | // This finds non-default unspecialized generic type instances and converts them into a BfUnspecializedGenericTypeVariation |
| 13032 | BfType* BfModule::CheckUnspecializedGenericType(BfTypeInstance* genericTypeInst, BfPopulateType populateType) |
no test coverage detected