| 119 | } |
| 120 | |
| 121 | bool BfModule::InitGenericParams(BfType* resolvedTypeRef) |
| 122 | { |
| 123 | BfTypeState typeState; |
| 124 | typeState.mPrevState = mContext->mCurTypeState; |
| 125 | typeState.mResolveKind = BfTypeState::ResolveKind_BuildingGenericParams; |
| 126 | typeState.mType = resolvedTypeRef; |
| 127 | SetAndRestoreValue<BfTypeState*> prevTypeState(mContext->mCurTypeState, &typeState); |
| 128 | |
| 129 | BF_ASSERT(mCurMethodInstance == NULL); |
| 130 | |
| 131 | auto genericTypeInst = resolvedTypeRef->ToGenericTypeInstance(); |
| 132 | genericTypeInst->mGenericTypeInfo->mInitializedGenericParams = true; |
| 133 | |
| 134 | if (genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.IsEmpty()) |
| 135 | return true; |
| 136 | |
| 137 | if (genericTypeInst->mGenericTypeInfo->mTypeGenericArguments[0]->IsGenericParam()) |
| 138 | { |
| 139 | BF_ASSERT(genericTypeInst->mGenericTypeInfo->mIsUnspecialized); |
| 140 | } |
| 141 | |
| 142 | auto typeDef = genericTypeInst->mTypeDef; |
| 143 | int startDefGenericParamIdx = (int)genericTypeInst->mGenericTypeInfo->mGenericParams.size(); |
| 144 | for (int paramIdx = startDefGenericParamIdx; paramIdx < (int)genericTypeInst->mGenericTypeInfo->mTypeGenericArguments.size(); paramIdx++) |
| 145 | { |
| 146 | auto genericParamInstance = new BfGenericTypeParamInstance(typeDef, paramIdx); |
| 147 | genericParamInstance->mExternType = GetGenericParamType(BfGenericParamKind_Type, paramIdx); |
| 148 | genericTypeInst->mGenericTypeInfo->mGenericParams.push_back(genericParamInstance); |
| 149 | } |
| 150 | |
| 151 | for (int externConstraintIdx = 0; externConstraintIdx < (int)typeDef->mExternalConstraints.size(); externConstraintIdx++) |
| 152 | { |
| 153 | auto genericParamInstance = new BfGenericTypeParamInstance(typeDef, externConstraintIdx + (int)typeDef->mGenericParamDefs.size()); |
| 154 | genericTypeInst->mGenericTypeInfo->mGenericParams.push_back(genericParamInstance); |
| 155 | } |
| 156 | |
| 157 | return true; |
| 158 | } |
| 159 | |
| 160 | bool BfModule::FinishGenericParams(BfType* resolvedTypeRef) |
| 161 | { |
nothing calls this directly
no test coverage detected