MCPcopy Create free account
hub / github.com/beefytech/Beef / BuildGenericExtensionInfo

Method BuildGenericExtensionInfo

IDEHelper/Compiler/BfModuleTypeUtils.cpp:44–119  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

42USING_NS_BF;
43
44BfGenericExtensionEntry* 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];

Callers 1

Calls 7

IsExtensionMethod · 0.80
CheckTypeRefMethod · 0.80
sizeMethod · 0.45
TryAddMethod · 0.45
push_backMethod · 0.45
GetAutoCompleteMethod · 0.45
IsUnspecializedTypeMethod · 0.45

Tested by

no test coverage detected