diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 9f20adee..3abb832f 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1942,7 +1942,7 @@ public: BfType* ResolveSelfType(BfType* type, BfType* selfType); bool IsUnboundGeneric(BfType* type); BfGenericParamInstance* GetGenericTypeParamInstance(int paramIdx); - BfGenericParamInstance* GetGenericParamInstance(BfGenericParamType* type, bool checkMixinBind = false); + BfGenericParamInstance* GetGenericParamInstance(BfGenericParamType* type, bool checkMixinBind = false, BfFailHandleKind failHandleKind = BfFailHandleKind_Normal); void GetActiveTypeGenericParamInstances(SizedArray& genericParamInstance); BfGenericParamInstance* GetMergedGenericParamData(BfGenericParamType* type, BfGenericParamFlags& outFlags, BfType*& outTypeConstraint); BfTypeInstance* GetBaseType(BfTypeInstance* typeInst); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 73067537..2e0d9dc7 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -5494,7 +5494,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy else if (resolvedFieldType->IsGenericParam()) { SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, fieldDef); - auto genericParamInstance = GetGenericParamInstance((BfGenericParamType*)resolvedFieldType); + auto genericParamInstance = GetGenericParamInstance((BfGenericParamType*)resolvedFieldType, false, BfFailHandleKind_Soft); if (genericParamInstance != NULL) { if (((genericParamInstance->mGenericParamFlags & BfGenericParamFlag_Class) == 0) && @@ -9461,7 +9461,7 @@ BfGenericParamInstance* BfModule::GetMergedGenericParamData(BfGenericParamType* return genericParam; } -BfGenericParamInstance* BfModule::GetGenericParamInstance(BfGenericParamType* type, bool checkMixinBind) +BfGenericParamInstance* BfModule::GetGenericParamInstance(BfGenericParamType* type, bool checkMixinBind, BfFailHandleKind failHandleKind) { if (type->mGenericParamKind == BfGenericParamKind_Method) { @@ -9474,7 +9474,10 @@ BfGenericParamInstance* BfModule::GetGenericParamInstance(BfGenericParamType* ty if ((curGenericMethodInstance == NULL) || (curGenericMethodInstance->mMethodInfoEx == NULL) || (type->mGenericParamIdx >= curGenericMethodInstance->mMethodInfoEx->mGenericParams.mSize)) { - FatalError("Invalid GetGenericParamInstance method generic param"); + if (failHandleKind == Beefy::BfFailHandleKind_Normal) + FatalError("Invalid GetGenericParamInstance method generic param"); + else if (failHandleKind == Beefy::BfFailHandleKind_Soft) + InternalError("Invalid GetGenericParamInstance method generic param"); return NULL; } return curGenericMethodInstance->mMethodInfoEx->mGenericParams[type->mGenericParamIdx]; @@ -15874,7 +15877,7 @@ void BfModule::DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameF } } - auto genericParamInstance = GetGenericParamInstance(genericParam); + auto genericParamInstance = GetGenericParamInstance(genericParam, false, BfFailHandleKind_Soft); if (genericParamInstance == NULL) { str += StrFormat("@M%d", genericParam->mGenericParamIdx); diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index c0609167..ebb9613f 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -166,6 +166,13 @@ struct BfAtomCompositeEquals } }; +enum BfFailHandleKind +{ + BfFailHandleKind_Normal, + BfFailHandleKind_Soft, + BfFailHandleKind_Ignore +}; + enum BfWhileSpecializingFlags : int8 { BfWhileSpecializingFlag_None = 0,