Pārlūkot izejas kodu

Fix for unbound generic type lookups

Brian Fiete 3 gadi atpakaļ
vecāks
revīzija
e5f280de32

+ 7 - 1
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -10552,6 +10552,12 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 		return ResolveTypeResult(typeRef, resolvedEntry->mValue, populateType, resolveFlags);
 		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)
 	if ((resolveFlags & BfResolveTypeRefFlag_NoCreate) != 0)
 	{
 	{
 		mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
 		mContext->mResolvedTypes.RemoveEntry(resolvedEntry);
@@ -10785,7 +10791,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 	{
 	{
 		int wantNumGenericParams = genericTypeInstRef->GetGenericArgCount();
 		int wantNumGenericParams = genericTypeInstRef->GetGenericArgCount();
 		BfTypeDef* ambiguousTypeDef = NULL;
 		BfTypeDef* ambiguousTypeDef = NULL;
-
+		
 		Array<BfAstNode*> genericArguments;
 		Array<BfAstNode*> genericArguments;
 		std::function<void(BfTypeReference*)> _GetTypeRefs = [&](BfTypeReference* typeRef)
 		std::function<void(BfTypeReference*)> _GetTypeRefs = [&](BfTypeReference* typeRef)
 		{
 		{

+ 7 - 4
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++)
 		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;
 			BfAstNode* genericArgTypeRef = NULL;
 			if (genericIdx < genericTypeRef->mGenericArguments.mSize)			
 			if (genericIdx < genericTypeRef->mGenericArguments.mSize)			
 				genericArgTypeRef = genericTypeRef->mGenericArguments[genericIdx];			
 				genericArgTypeRef = genericTypeRef->mGenericArguments[genericIdx];			
 
 
-			if ((ctx->mResolveFlags & BfResolveTypeRefFlag_AllowUnboundGeneric) != 0)
+			if (allowUnboundGeneric)
 			{
 			{
 				if (BfNodeIsExact<BfWildcardTypeReference>(genericArgTypeRef))
 				if (BfNodeIsExact<BfWildcardTypeReference>(genericArgTypeRef))
 					genericArgTypeRef = NULL;
 					genericArgTypeRef = NULL;
@@ -3160,14 +3162,15 @@ void BfResolvedTypeSet::HashGenericArguments(BfTypeReference* typeRef, LookupCon
 			if (genericArgTypeRef != NULL)
 			if (genericArgTypeRef != NULL)
 			{
 			{
 				argHashVal = Hash(genericArgTypeRef, ctx, BfHashFlag_AllowGenericParamConstValue, hashSeed + 1);
 				argHashVal = Hash(genericArgTypeRef, ctx, BfHashFlag_AllowGenericParamConstValue, hashSeed + 1);
-				if ((ctx->mResolveFlags & BfResolveTypeRefFlag_ForceUnboundGeneric) != 0)
+				if ((allowUnboundGeneric) && ((ctx->mResolveFlags & BfResolveTypeRefFlag_ForceUnboundGeneric) != 0))
 					genericArgTypeRef = NULL;
 					genericArgTypeRef = NULL;
 			}
 			}
 
 
 			if (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 = (((int)BfGenericParamKind_Type + 0xB00) << 8) ^ (genericIdx + 1);
 					argHashVal = HASH_MIX(argHashVal, hashSeed + 1);					
 					argHashVal = HASH_MIX(argHashVal, hashSeed + 1);					
 				}
 				}

+ 3 - 1
IDEHelper/Compiler/BfResolvedTypeUtils.h

@@ -2607,7 +2607,8 @@ public:
 		BfResolveTypeRefFlags mResolveFlags;		
 		BfResolveTypeRefFlags mResolveFlags;		
 		BfCallingConvention mCallingConvention;
 		BfCallingConvention mCallingConvention;
 		bool mHadVar;
 		bool mHadVar;
-		bool mFailed;		
+		bool mFailed;
+		bool mIsUnboundGeneric;
 
 
 	public:
 	public:
 		LookupContext()
 		LookupContext()
@@ -2619,6 +2620,7 @@ public:
 			mRootResolvedType = NULL;
 			mRootResolvedType = NULL;
 			mFailed = false;
 			mFailed = false;
 			mHadVar = false;
 			mHadVar = false;
+			mIsUnboundGeneric = false;
 			mResolveFlags = BfResolveTypeRefFlag_None;
 			mResolveFlags = BfResolveTypeRefFlag_None;
 			mCallingConvention = BfCallingConvention_Unspecified;
 			mCallingConvention = BfCallingConvention_Unspecified;
 		}
 		}

+ 3 - 0
IDEHelper/Tests/src/Generics.bf

@@ -487,6 +487,9 @@ namespace Tests
 			b = Foo<int>.value > val;
 			b = Foo<int>.value > val;
 			b = Foo<int>.Inner<float>.value2 < 1.2f;
 			b = Foo<int>.Inner<float>.value2 < 1.2f;
 			b = Foo<int>.Inner<float>.value2 > 2.3f;
 			b = Foo<int>.Inner<float>.value2 > 2.3f;
+
+			var t = typeof(Array2<>);
+			t = typeof(Dictionary<,>.Enumerator);
 		}
 		}
 	}
 	}
 }
 }