| 3225 | } |
| 3226 | |
| 3227 | void BfModule::PopulateUsingFieldData(BfTypeInstance* typeInstance) |
| 3228 | { |
| 3229 | if (typeInstance->mTypeInfoEx == NULL) |
| 3230 | typeInstance->mTypeInfoEx = new BfTypeInfoEx(); |
| 3231 | |
| 3232 | BfUsingFieldData* usingFieldData; |
| 3233 | if (typeInstance->mTypeInfoEx->mUsingFieldData != NULL) |
| 3234 | { |
| 3235 | usingFieldData = typeInstance->mTypeInfoEx->mUsingFieldData; |
| 3236 | Array<BfTypeInstance*> populatedTypes; |
| 3237 | |
| 3238 | for (auto checkType : usingFieldData->mAwaitingPopulateSet) |
| 3239 | { |
| 3240 | if (checkType->mDefineState >= BfTypeDefineState_Defined) |
| 3241 | populatedTypes.Add(checkType); |
| 3242 | } |
| 3243 | |
| 3244 | if (populatedTypes.IsEmpty()) |
| 3245 | return; |
| 3246 | |
| 3247 | for (auto type : populatedTypes) |
| 3248 | usingFieldData->mAwaitingPopulateSet.Remove(type); |
| 3249 | usingFieldData->mEntries.Clear(); |
| 3250 | usingFieldData->mMethods.Clear(); |
| 3251 | } |
| 3252 | else |
| 3253 | { |
| 3254 | usingFieldData = new BfUsingFieldData(); |
| 3255 | typeInstance->mTypeInfoEx->mUsingFieldData = usingFieldData; |
| 3256 | } |
| 3257 | |
| 3258 | HashSet<BfTypeInstance*> checkedTypeSet; |
| 3259 | Array<BfUsingFieldData::MemberRef> memberRefs; |
| 3260 | std::function<void(BfTypeInstance*, bool)> _CheckType = [&](BfTypeInstance* usingType, bool staticOnly) |
| 3261 | { |
| 3262 | if (!checkedTypeSet.Add(usingType)) |
| 3263 | return; |
| 3264 | defer( |
| 3265 | { |
| 3266 | checkedTypeSet.Remove(usingType); |
| 3267 | }); |
| 3268 | |
| 3269 | for (auto fieldDef : usingType->mTypeDef->mFields) |
| 3270 | { |
| 3271 | if ((staticOnly) && (!fieldDef->mIsStatic)) |
| 3272 | continue; |
| 3273 | |
| 3274 | memberRefs.Add(BfUsingFieldData::MemberRef(usingType, fieldDef)); |
| 3275 | defer( |
| 3276 | { |
| 3277 | memberRefs.pop_back(); |
| 3278 | }); |
| 3279 | |
| 3280 | if (memberRefs.Count() > 1) |
| 3281 | { |
| 3282 | BfUsingFieldData::Entry* entry = NULL; |
| 3283 | usingFieldData->mEntries.TryAdd(fieldDef->mName, NULL, &entry); |
| 3284 | SizedArray<BfUsingFieldData::MemberRef, 1> lookup; |
no test coverage detected