From f2c9c889ef7007728bf65d4db727e3cc26fddee5 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 27 May 2022 10:24:01 -0700 Subject: [PATCH] Fixed some FindTypeDef caching errors --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 4d02735c..5b0c156c 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9702,6 +9702,12 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric BfTypeInstance* typeInstance = (typeInstanceOverride != NULL) ? typeInstanceOverride : mCurTypeInstance; auto useTypeDef = GetActiveTypeDef(typeInstanceOverride, true); + if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL)) + typeInstance = mCurMethodState->mMixinState->mMixinMethodInstance->GetOwner(); + + if (useTypeDef != NULL) + useTypeDef = useTypeDef->GetDefinition(); + if ((typeInstance == NULL) && (useTypeDef == NULL)) { BfProject* project = NULL; @@ -9746,7 +9752,7 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric return result; } - if ((mCompiler->mResolvePassData != NULL) && (mCompiler->mResolvePassData->mAutoComplete != NULL) && (typeInstance != NULL)) + if ((mCompiler->mResolvePassData != NULL) && (typeInstance != NULL)) { if (mCompiler->mResolvePassData->mAutoCompleteTempTypes.Contains(useTypeDef)) return FindTypeDefRaw(findName, numGenericArgs, typeInstance, useTypeDef, error, NULL, resolveFlags); @@ -9761,6 +9767,22 @@ BfTypeDef* BfModule::FindTypeDef(const BfAtomComposite& findName, int numGeneric BfTypeLookupResult* resultPtr = NULL; if ((typeInstance != NULL) && (typeInstance->mLookupResults.TryAdd(typeLookupEntry, &typeLookupEntryPtr, &resultPtr))) { + BF_ASSERT(!useTypeDef->IsEmitted()); + + bool isValid; + if (useTypeDef->mIsPartial) + isValid = typeInstance->mTypeDef->GetDefinition()->ContainsPartial(useTypeDef); + else + isValid = typeInstance->mTypeDef->GetDefinition() == useTypeDef; + + if ((!isValid) && (mCurMethodInstance != NULL) && (mCurMethodInstance->mIsForeignMethodDef)) + { + BF_ASSERT(mCurMethodInstance->mIsForeignMethodDef); + isValid = mCurMethodInstance->mMethodDef->mDeclaringType == useTypeDef; + } + + BF_ASSERT(isValid); + typeLookupEntryPtr->mAtomUpdateIdx = typeLookupEntry.mName.GetAtomUpdateIdx(); // FindTypeDefRaw may re-enter when finding base types, so we need to expect that resultPtr can change