| 42 | USING_NS_BF; |
| 43 | |
| 44 | BfGenericExtensionEntry* BfModule::BuildGenericExtensionInfo(BfTypeInstance* genericTypeInst, BfTypeDef* partialTypeDef) |
| 45 | { |
| 46 | if (!partialTypeDef->IsExtension()) |
| 47 | return NULL; |
| 48 | |
| 49 | if (partialTypeDef->mGenericParamDefs.size() != genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size()) |
| 50 | { |
| 51 | AssertErrorState(); |
| 52 | return NULL; |
| 53 | } |
| 54 | |
| 55 | BfGenericExtensionInfo* genericExtensionInfo = genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo; |
| 56 | if (genericExtensionInfo == NULL) |
| 57 | { |
| 58 | genericExtensionInfo = new BfGenericExtensionInfo(); |
| 59 | genericTypeInst->mGenericTypeInfo->mGenericExtensionInfo = genericExtensionInfo; |
| 60 | } |
| 61 | |
| 62 | BfTypeState typeState; |
| 63 | typeState.mPrevState = mContext->mCurTypeState; |
| 64 | typeState.mType = genericTypeInst; |
| 65 | typeState.mCurTypeDef = partialTypeDef; |
| 66 | SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState); |
| 67 | |
| 68 | BfGenericExtensionEntry* genericExEntry; |
| 69 | genericExtensionInfo->mExtensionMap.TryAdd(partialTypeDef, NULL, &genericExEntry); |
| 70 | |
| 71 | int startDefGenericParamIdx = (int)genericExEntry->mGenericParams.size(); |
| 72 | for (int paramIdx = startDefGenericParamIdx; paramIdx < (int)genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size(); paramIdx++) |
| 73 | { |
| 74 | auto genericParamInstance = new BfGenericTypeParamInstance(partialTypeDef, paramIdx); |
| 75 | genericParamInstance->mExternType = GetGenericParamType(BfGenericParamKind_Type, paramIdx); |
| 76 | |
| 77 | auto prevPtr = genericExEntry->mGenericParams.mVals; |
| 78 | genericExEntry->mGenericParams.push_back(genericParamInstance); |
| 79 | } |
| 80 | |
| 81 | for (int externConstraintIdx = 0; externConstraintIdx < (int)partialTypeDef->mExternalConstraints.size(); externConstraintIdx++) |
| 82 | { |
| 83 | auto& genericConstraint = partialTypeDef->mExternalConstraints[externConstraintIdx]; |
| 84 | |
| 85 | auto genericParamInstance = new BfGenericTypeParamInstance(partialTypeDef, externConstraintIdx + (int)partialTypeDef->mGenericParamDefs.size()); |
| 86 | genericParamInstance->mExternType = ResolveTypeRef(genericConstraint.mTypeRef, BfPopulateType_Identity); |
| 87 | |
| 88 | auto autoComplete = mCompiler->GetAutoComplete(); |
| 89 | if (autoComplete != NULL) |
| 90 | autoComplete->CheckTypeRef(genericConstraint.mTypeRef, false); |
| 91 | |
| 92 | if (genericParamInstance->mExternType == NULL) |
| 93 | genericParamInstance->mExternType = GetPrimitiveType(BfTypeCode_Var); |
| 94 | |
| 95 | ResolveGenericParamConstraints(genericParamInstance, genericTypeInst->IsUnspecializedType()); |
| 96 | genericExEntry->mGenericParams.push_back(genericParamInstance); |
| 97 | } |
| 98 | |
| 99 | for (int paramIdx = startDefGenericParamIdx; paramIdx < (int)genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size(); paramIdx++) |
| 100 | { |
| 101 | auto genericParamInstance = genericExEntry->mGenericParams[paramIdx]; |
no test coverage detected