diff --git a/IDEHelper/Compiler/BfContext.cpp b/IDEHelper/Compiler/BfContext.cpp index 102675e7..121fa099 100644 --- a/IDEHelper/Compiler/BfContext.cpp +++ b/IDEHelper/Compiler/BfContext.cpp @@ -1156,9 +1156,11 @@ void BfContext::TypeDataChanged(BfDependedType* dType, bool isNonStaticDataChang { bool hadChange = false; - if ((dependencyFlags & BfDependencyMap::DependencyFlag_DerivedFrom) || - (dependencyFlags & BfDependencyMap::DependencyFlag_ValueTypeMemberData) || - (dependencyFlags & BfDependencyMap::DependencyFlag_NameReference)) + if ((dependencyFlags & + (BfDependencyMap::DependencyFlag_DerivedFrom | + BfDependencyMap::DependencyFlag_ValueTypeMemberData) | + BfDependencyMap::DependencyFlag_NameReference | + BfDependencyMap::DependencyFlag_ValueTypeSizeDep) != 0) { hadChange = true; } diff --git a/IDEHelper/Compiler/BfContext.h b/IDEHelper/Compiler/BfContext.h index c9ab4227..4a7622ec 100644 --- a/IDEHelper/Compiler/BfContext.h +++ b/IDEHelper/Compiler/BfContext.h @@ -131,6 +131,7 @@ public: ResolveKind_UnionInnerType, ResolveKind_LocalVariable, ResolveKind_Attributes, + ResolveKind_FieldType, ResolveKind_ConstField }; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 1abf8306..8bc96038 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4422,7 +4422,7 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar } mModule->PopulateType(resolvedFieldType, BfPopulateType_Data); - mModule->AddDependency(curCheckType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_ReadFields); + mModule->AddDependency(curCheckType, mModule->mCurTypeInstance, field->mIsConst ? BfDependencyMap::DependencyFlag_ConstValue : BfDependencyMap::DependencyFlag_ReadFields); if (fieldInstance->mHadConstEval) { mModule->AddDependency(curCheckType, mModule->mCurTypeInstance, BfDependencyMap::DependencyFlag_ConstEvalConstField); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 8d16f171..78e52180 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -3365,6 +3365,12 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap if (usedType == userType) return; + if (((flags & BfDependencyMap::DependencyFlag_ConstValue) != 0) && (mContext->mCurTypeState != NULL) && (mContext->mCurTypeState->mResolveKind == BfTypeState::ResolveKind_FieldType)) + { + // This can be an `int32[UsedType.cVal]` type reference + flags = (BfDependencyMap::DependencyFlags)(flags | BfDependencyMap::DependencyFlag_ValueTypeSizeDep); + } + if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mIsAutocompleteMethod)) { if (userType->IsMethodRef()) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 97171a1c..4efe1eb4 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -2597,6 +2597,8 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy DoTypeInstanceMethodProcessing(typeInstance); return true; } + if (typeInstance->mDefineState == BfTypeDefineState_DefinedAndMethodsSlotted) + return true; return false; }; @@ -3641,6 +3643,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy continue; SetAndRestoreValue prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field); + SetAndRestoreValue prevResolveKind(mContext->mCurTypeState->mResolveKind, BfTypeState::ResolveKind_FieldType); BfType* resolvedFieldType = NULL; @@ -4427,6 +4430,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy CheckAddFailType(); BF_ASSERT_REL(typeInstance->mDefineState != BfTypeDefineState_DefinedAndMethodsSlotting); + BF_ASSERT_REL(typeInstance->mDefineState != BfTypeDefineState_DefinedAndMethodsSlotted); BfLogSysM("Setting mNeedsMethodProcessing=true on %p\n", typeInstance); typeInstance->mNeedsMethodProcessing = true; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 0d799f89..c83f85f0 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -115,6 +115,7 @@ public: DependencyFlag_NameReference = 0x1000000, DependencyFlag_VirtualCall = 0x2000000, DependencyFlag_WeakReference = 0x4000000, // Keeps alive but won't rebuild + DependencyFlag_ValueTypeSizeDep = 0x8000000, // IE: int32[DepType.cVal] DependencyFlag_DependentUsageMask = ~(DependencyFlag_UnspecializedType | DependencyFlag_MethodGenericArg | DependencyFlag_GenericArgRef) };