From e5f280de328afc1af00bbcd24dd265da8b039b78 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 22 Feb 2022 08:42:41 -0800 Subject: [PATCH] Fix for unbound generic type lookups --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 8 +++++++- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 11 +++++++---- IDEHelper/Compiler/BfResolvedTypeUtils.h | 4 +++- IDEHelper/Tests/src/Generics.bf | 3 +++ 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 9adf97c3..e022a1b6 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -10552,6 +10552,12 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags); } + if ((lookupCtx.mIsUnboundGeneric) && (lookupCtx.mRootTypeDef != NULL)) + { + mContext->mResolvedTypes.RemoveEntry(resolvedEntry); + return ResolveTypeResult(typeRef, ResolveTypeDef(lookupCtx.mRootTypeDef), populateType, resolveFlags); + } + if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0) { mContext->mResolvedTypes.RemoveEntry(resolvedEntry); @@ -10785,7 +10791,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula { int wantNumGenericParams = genericTypeInstRef->GetGenericArgCount(); BfTypeDef* ambiguousTypeDef = NULL; - + Array genericArguments; std::function _GetTypeRefs = [&](BfTypeReference* typeRef) { diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index a44c3c0a..87d8169c 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -3146,11 +3146,13 @@ void BfResolvedTypeSet::HashGenericArguments(BfTypeReference* typeRef, LookupCon { for (int genericIdx = 0; genericIdx < BF_MAX(genericTypeRef->mGenericArguments.mSize, genericTypeRef->mCommas.mSize + 1); genericIdx++) { + bool allowUnboundGeneric = ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0) && (typeRef == ctx->mRootTypeRef); + BfAstNode* genericArgTypeRef = NULL; if (genericIdx < genericTypeRef->mGenericArguments.mSize) genericArgTypeRef = genericTypeRef->mGenericArguments[genericIdx]; - if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0) + if (allowUnboundGeneric) { if (BfNodeIsExact(genericArgTypeRef)) genericArgTypeRef = NULL; @@ -3160,14 +3162,15 @@ void BfResolvedTypeSet::HashGenericArguments(BfTypeReference* typeRef, LookupCon if (genericArgTypeRef != NULL) { argHashVal = Hash(genericArgTypeRef, ctx, BfHashFlag_AllowGenericParamConstValue, hashSeed + 1); - if ((ctx->mResolveFlags & BfResolveTypeRefFlag_ForceUnboundGeneric) != 0) + if ((allowUnboundGeneric) && ((ctx->mResolveFlags & BfResolveTypeRefFlag_ForceUnboundGeneric) != 0)) genericArgTypeRef = NULL; } if (genericArgTypeRef == NULL) { - if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0) - { + if (allowUnboundGeneric) + { + ctx->mIsUnboundGeneric = true; argHashVal = (((int)BfGenericParamKind_Type + 0xB00) << 8) ^ (genericIdx + 1); argHashVal = HASH_MIX(argHashVal, hashSeed + 1); } diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 58c72a63..fc3ad699 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -2607,7 +2607,8 @@ public: BfResolveTypeRefFlags mResolveFlags; BfCallingConvention mCallingConvention; bool mHadVar; - bool mFailed; + bool mFailed; + bool mIsUnboundGeneric; public: LookupContext() @@ -2619,6 +2620,7 @@ public: mRootResolvedType = NULL; mFailed = false; mHadVar = false; + mIsUnboundGeneric = false; mResolveFlags = BfResolveTypeRefFlag_None; mCallingConvention = BfCallingConvention_Unspecified; } diff --git a/IDEHelper/Tests/src/Generics.bf b/IDEHelper/Tests/src/Generics.bf index dd2c642b..af72a40c 100644 --- a/IDEHelper/Tests/src/Generics.bf +++ b/IDEHelper/Tests/src/Generics.bf @@ -487,6 +487,9 @@ namespace Tests b = Foo.value > val; b = Foo.Inner.value2 < 1.2f; b = Foo.Inner.value2 > 2.3f; + + var t = typeof(Array2<>); + t = typeof(Dictionary<,>.Enumerator); } } }