diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 0aed0585..fd61dd55 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1467,12 +1467,20 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (typeInstance->mResolvingConstField) return !typeInstance->mTypeFailed; - if (typeInstance->mNeedsMethodProcessing) + auto _CheckTypeDone = [&]() { - if ((canDoMethodProcessing) && (populateType >= BfPopulateType_DataAndMethods)) - DoTypeInstanceMethodProcessing(typeInstance); - return true; - } + if (typeInstance->mNeedsMethodProcessing) + { + BF_ASSERT(typeInstance->mDefineState >= BfTypeDefineState_Defined); + if ((canDoMethodProcessing) && (populateType >= BfPopulateType_DataAndMethods)) + DoTypeInstanceMethodProcessing(typeInstance); + return true; + } + return false; + }; + + if (_CheckTypeDone()) + return true; // Partial population break out point if ((populateType >= BfPopulateType_Identity) && (populateType <= BfPopulateType_IdentityNoRemapAlias)) @@ -1509,6 +1517,9 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy BuildGenericParams(resolvedTypeRef); } + if (_CheckTypeDone()) + return true; + // Don't do TypeToString until down here. Otherwise we can infinitely loop on BuildGenericParams bool isStruct = resolvedTypeRef->IsStruct(); @@ -2108,6 +2119,7 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy } } + BF_ASSERT(!typeInstance->mNeedsMethodProcessing); typeInstance->mDefineState = BfTypeDefineState_HasInterfaces; if (populateType <= BfPopulateType_Interfaces) return true;