diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 678bc798..6684f069 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3304,8 +3304,15 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar startCheckType = target.mType->ToTypeInstance(); } - if ((startCheckType != NULL) && (startCheckType->mBaseType == NULL)) - mModule->PopulateType(startCheckType, BfPopulateType_BaseType); + if ((startCheckType != NULL) && (startCheckType->mBaseType == NULL)) + { + if (startCheckType->mDefineState == BfTypeDefineState_ResolvingBaseType) + { + // Fixes cases where we have something like 'Base[Value]' as a base typeref + return BfTypedValue(); + } + mModule->PopulateType(startCheckType, BfPopulateType_BaseType); + } String findName; int varSkipCount = 0; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 82c1f3c7..93a6fac5 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -1614,7 +1614,7 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (typeDef->mIsCombinedPartial) declTypeDef = typeDef->mPartials.front(); SetAndRestoreValue prevTypeDef(mContext->mCurTypeState->mCurTypeDef, declTypeDef); - + SetAndRestoreValue prevDefineState(typeInstance->mDefineState, BfTypeDefineState_ResolvingBaseType); SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurBaseTypeRef, baseTypeRef); // We ignore errors here to avoid double-errors for type lookups, but this is where data cycles are detected // but that type of error supersedes the mIgnoreErrors setting @@ -1850,6 +1850,7 @@ bool BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy if (typeDef->mIsCombinedPartial) declTypeDef = typeDef->mPartials.front(); SetAndRestoreValue prevTypeDef(mContext->mCurTypeState->mCurTypeDef, declTypeDef); + SetAndRestoreValue prevDefineState(typeInstance->mDefineState, BfTypeDefineState_ResolvingBaseType); bool populateBase = !typeInstance->mTypeFailed; auto checkType = ResolveTypeRef(checkTypeRef, populateBase ? BfPopulateType_Data : BfPopulateType_Declaration); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 799c6b1f..fb9d55f4 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -381,6 +381,7 @@ enum BfTypeDefineState : uint8 { BfTypeDefineState_Undefined, BfTypeDefineState_Declared, + BfTypeDefineState_ResolvingBaseType, BfTypeDefineState_HasInterfaces, BfTypeDefineState_Defined, BfTypeDefineState_DefinedAndMethodsSlotted,