| 9686 | } |
| 9687 | |
| 9688 | void BfModule::GetActiveTypeGenericParamInstances(SizedArray<BfGenericParamInstance*, 4>& genericParamInstances) |
| 9689 | { |
| 9690 | // When we're evaluating a method, make sure the params refer back to that method context |
| 9691 | auto curTypeInstance = mCurTypeInstance; |
| 9692 | if (mCurMethodInstance != NULL) |
| 9693 | curTypeInstance = mCurMethodInstance->mMethodInstanceGroup->mOwner; |
| 9694 | |
| 9695 | BfTypeInstance* genericTypeInst = curTypeInstance->ToGenericTypeInstance(); |
| 9696 | if ((genericTypeInst->IsIncomplete()) && (genericTypeInst->mGenericTypeInfo->mGenericParams.size() == 0)) |
| 9697 | { |
| 9698 | // Set this to NULL so we don't recurse infinitely |
| 9699 | SetAndRestoreValue<BfTypeInstance*> prevTypeInst(mCurTypeInstance, NULL); |
| 9700 | PopulateType(genericTypeInst, BfPopulateType_Declaration); |
| 9701 | } |
| 9702 | |
| 9703 | if (genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo != NULL) |
| 9704 | { |
| 9705 | // Note: original version had useMixinDecl set. Was there a reason for that? Causes issue 2118 |
| 9706 | auto activeTypeDef = GetActiveTypeDef(NULL); |
| 9707 | |
| 9708 | if ((activeTypeDef->mTypeDeclaration != genericTypeInst->mTypeDef->mTypeDeclaration) && (activeTypeDef->IsExtension())) |
| 9709 | { |
| 9710 | BfTypeDef* lookupTypeDef = activeTypeDef; |
| 9711 | while (lookupTypeDef->mNestDepth > genericTypeInst->mTypeDef->mNestDepth) |
| 9712 | lookupTypeDef = lookupTypeDef->mOuterType; |
| 9713 | |
| 9714 | BfGenericExtensionEntry* genericExEntry; |
| 9715 | if (genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo->mExtensionMap.TryGetValue(lookupTypeDef, &genericExEntry)) |
| 9716 | { |
| 9717 | for (auto entry : genericExEntry->mGenericParams) |
| 9718 | genericParamInstances.Add(entry); |
| 9719 | |
| 9720 | auto genericTypeInfo = genericTypeInst->mGenericTypeInfo; |
| 9721 | |
| 9722 | // Add root extern constraints - they don't get extended |
| 9723 | for (int genericParamIdx = (int)genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size(); genericParamIdx < genericTypeInst->mGenericTypeInfo->mGenericParams.size(); genericParamIdx++) |
| 9724 | genericParamInstances.Add(genericTypeInst->mGenericTypeInfo->mGenericParams[genericParamIdx]); |
| 9725 | return; |
| 9726 | } |
| 9727 | else |
| 9728 | { |
| 9729 | if ((mCompiler->mResolvePassData == NULL) || (mCompiler->mResolvePassData->mAutoComplete == NULL)) |
| 9730 | { |
| 9731 | BFMODULE_FATAL(this, "Invalid GetGenericParamInstance with extension"); |
| 9732 | } |
| 9733 | } |
| 9734 | } |
| 9735 | } |
| 9736 | |
| 9737 | BF_ASSERT(genericTypeInst != NULL); |
| 9738 | for (auto entry : genericTypeInst->mGenericTypeInfo->mGenericParams) |
| 9739 | genericParamInstances.Add(entry); |
| 9740 | } |
| 9741 | |
| 9742 | BfGenericParamInstance* BfModule::GetMergedGenericParamData(BfType* type, BfGenericParamFlags& outFlags, BfType*& outTypeConstraint) |
| 9743 | { |
no test coverage detected