diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 0a555718..41cecb04 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -3060,12 +3060,33 @@ void BfModule::PopulateUsingFieldData(BfTypeInstance* typeInstance) { if (typeInstance->mTypeInfoEx == NULL) typeInstance->mTypeInfoEx = new BfTypeInfoEx(); + + BfUsingFieldData* usingFieldData; + if (typeInstance->mTypeInfoEx->mUsingFieldData != NULL) + { + usingFieldData = typeInstance->mTypeInfoEx->mUsingFieldData; + Array populatedTypes; - BF_ASSERT(typeInstance->mTypeInfoEx->mUsingFieldData == NULL); + for (auto checkType : usingFieldData->mAwaitingPopulateSet) + { + if (checkType->mDefineState >= BfTypeDefineState_Defined) + populatedTypes.Add(checkType); + } - BfUsingFieldData* usingFieldData = new BfUsingFieldData(); - typeInstance->mTypeInfoEx->mUsingFieldData = usingFieldData; + if (populatedTypes.IsEmpty()) + return; + for (auto type : populatedTypes) + usingFieldData->mAwaitingPopulateSet.Remove(type); + usingFieldData->mEntries.Clear(); + usingFieldData->mMethods.Clear(); + } + else + { + usingFieldData = new BfUsingFieldData(); + typeInstance->mTypeInfoEx->mUsingFieldData = usingFieldData; + } + HashSet checkedTypeSet; Array memberRefs; std::function _CheckType = [&](BfTypeInstance* usingType, bool staticOnly) @@ -3103,8 +3124,29 @@ void BfModule::PopulateUsingFieldData(BfTypeInstance* typeInstance) if (usingType->mDefineState < BfTypeDefineState_Defined) { - // We need to populate this type now - PopulateType(usingType); + bool isPopulatingType = false; + + auto checkTypeState = mContext->mCurTypeState; + while (checkTypeState != NULL) + { + if ((checkTypeState->mType == usingType) && (checkTypeState->mPopulateType >= BfPopulateType_Data)) + { + isPopulatingType = true; + break; + } + + checkTypeState = checkTypeState->mPrevState; + } + + if (isPopulatingType) + { + typeInstance->mTypeInfoEx->mUsingFieldData->mAwaitingPopulateSet.Add(usingType); + } + else + { + // We need to populate this type now + PopulateType(usingType); + } } auto fieldInstance = &usingType->mFieldInstances[fieldDef->mIdx]; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index f1eef7f5..a80015e4 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -1884,6 +1884,7 @@ public: public: Dictionary mEntries; Dictionary mMethods; + HashSet mAwaitingPopulateSet; }; class BfTypeInfoEx