From 3a8e4ebc9dcb98d60116088763d966db1a4ba209 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 1 Jan 2022 10:39:25 -0500 Subject: [PATCH] Properly add dependencies on operator constraint types --- IDEHelper/Compiler/BfModule.cpp | 26 ++++++++++++++++-------- IDEHelper/Compiler/BfModule.h | 1 + IDEHelper/Compiler/BfModuleTypeUtils.cpp | 20 +++--------------- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index fdc579cc..7c493603 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -3581,6 +3581,23 @@ void BfModule::AddDependency(BfType* usedType, BfType* userType, BfDependencyMap } } +void BfModule::AddDependency(BfGenericParamInstance* genericParam, BfTypeInstance* usingType) +{ + if (!genericParam->mExternType->IsGenericParam()) + AddDependency(genericParam->mExternType, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); + for (auto constraintTypeInst : genericParam->mInterfaceConstraints) + AddDependency(constraintTypeInst, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); + for (auto& operatorConstraint : genericParam->mOperatorConstraints) + { + if (operatorConstraint.mLeftType != NULL) + AddDependency(operatorConstraint.mLeftType, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); + if (operatorConstraint.mRightType != NULL) + AddDependency(operatorConstraint.mRightType, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); + } + if (genericParam->mTypeConstraint != NULL) + AddDependency(genericParam->mTypeConstraint, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); +} + void BfModule::AddCallDependency(BfMethodInstance* methodInstance, bool devirtualized) { if ((mCurMethodState != NULL) && (mCurMethodState->mHotDataReferenceBuilder != NULL)) @@ -22152,14 +22169,7 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool auto constraintType = ResolveTypeRef(typeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_None); for (auto genericParam : methodInstance->mMethodInfoEx->mGenericParams) - { - if (!genericParam->mExternType->IsGenericParam()) - AddDependency(genericParam->mExternType, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - for (auto constraintTypeInst : genericParam->mInterfaceConstraints) - AddDependency(constraintTypeInst, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - if (genericParam->mTypeConstraint != NULL) - AddDependency(genericParam->mTypeConstraint, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - } + AddDependency(genericParam, mCurTypeInstance); } if ((methodInstance->mIsAutocompleteMethod) && (methodDeclaration != NULL) && (!methodInstance->IsSpecializedGenericMethod()) && (methodDef->mIdx >= 0)) diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 153344ab..5832a356 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -1730,6 +1730,7 @@ public: bool CheckDefineMemberProtection(BfProtection protection, BfType* memberType); void CheckMemberNames(BfTypeInstance* typeInst); void AddDependency(BfType* usedType, BfType* userType, BfDependencyMap::DependencyFlags flags); + void AddDependency(BfGenericParamInstance* genericParam, BfTypeInstance* usingType); void AddCallDependency(BfMethodInstance* methodInstance, bool devirtualized = false); void AddFieldDependency(BfTypeInstance* typeInstance, BfFieldInstance* fieldInstance, BfType* fieldType); void TypeFailed(BfTypeInstance* typeInstance); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 0030208b..ea12d5e9 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -108,14 +108,7 @@ BfGenericExtensionEntry* BfModule::BuildGenericExtensionInfo(BfTypeInstance* gen } for (auto genericParam : genericExEntry->mGenericParams) - { - if (!genericParam->mExternType->IsGenericParam()) - AddDependency(genericParam->mExternType, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - for (auto constraintTypeInst : genericParam->mInterfaceConstraints) - AddDependency(constraintTypeInst, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - if (genericParam->mTypeConstraint != NULL) - AddDependency(genericParam->mTypeConstraint, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - } + AddDependency(genericParam, mCurTypeInstance); return genericExEntry; } @@ -301,15 +294,8 @@ bool BfModule::FinishGenericParams(BfType* resolvedTypeRef) for (auto typeRef : deferredResolveTypes) auto constraintType = ResolveTypeRef(typeRef, BfPopulateType_Declaration, BfResolveTypeRefFlag_None); - for (auto genericParam : genericTypeInst->mGenericTypeInfo->mGenericParams) - { - if (!genericParam->mExternType->IsGenericParam()) - AddDependency(genericParam->mExternType, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - for (auto constraintTypeInst : genericParam->mInterfaceConstraints) - AddDependency(constraintTypeInst, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - if (genericParam->mTypeConstraint != NULL) - AddDependency(genericParam->mTypeConstraint, mCurTypeInstance, BfDependencyMap::DependencyFlag_Constraint); - } + for (auto genericParam : genericTypeInst->mGenericTypeInfo->mGenericParams) + AddDependency(genericParam, mCurTypeInstance); return true; }