Browse Source

Fixed nested generic type alias type reference

Brian Fiete 3 years ago
parent
commit
1db184e7d8
2 changed files with 62 additions and 31 deletions
  1. 51 31
      IDEHelper/Compiler/BfResolvedTypeUtils.cpp
  2. 11 0
      IDEHelper/Tests/src/Aliases.bf

+ 51 - 31
IDEHelper/Compiler/BfResolvedTypeUtils.cpp

@@ -3499,6 +3499,10 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 			return 0;
 			return 0;
 		}
 		}
 
 
+		int typeAliasHash = 0;
+
+		bool isInnerTypeAlias = false;
+
 		// Don't translate aliases for the root type, just element types
 		// Don't translate aliases for the root type, just element types
 		if (ctx->mRootTypeRef == typeRef)
 		if (ctx->mRootTypeRef == typeRef)
 		{
 		{
@@ -3506,35 +3510,12 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 			ctx->mRootTypeDef = elementTypeDef;
 			ctx->mRootTypeDef = elementTypeDef;
 		}
 		}
 		else if (elementTypeDef->mTypeCode == BfTypeCode_TypeAlias)
 		else if (elementTypeDef->mTypeCode == BfTypeCode_TypeAlias)
-		{			
-			BfTypeVector genericArgs;
-			for (auto genericArgTypeRef : genericInstTypeRef->mGenericArguments)
-			{
-				auto argType = ctx->mModule->ResolveTypeRef(genericArgTypeRef, NULL, BfPopulateType_Identity, GetResolveFlags(genericArgTypeRef, ctx, flags));
-				if (argType != NULL)
-					genericArgs.Add(argType);
-				else
-					ctx->mFailed = true;				
-			}
-
-			if (!ctx->mFailed)
-			{
-				auto resolvedType = ctx->mModule->ResolveTypeDef(elementTypeDef, genericArgs);
-				if ((resolvedType != NULL) && (resolvedType->IsTypeAlias()))
-				{
-					auto underlyingType = resolvedType->GetUnderlyingType();
-					if (underlyingType == NULL)
-					{
-						ctx->mFailed = true;
-						return 0;
-					}
-					int hashVal = Hash(underlyingType, ctx, flags, hashSeed);
-					hashSeed = 0;
-					return hashVal;
-				}
-			}
+		{
+			isInnerTypeAlias = true;			
 		}
 		}
-		
+				
+		BfTypeVector typeAliasGenericArgs;
+
 		bool fullyQualified = false;
 		bool fullyQualified = false;
 		int hashVal = elementTypeDef->mHash;
 		int hashVal = elementTypeDef->mHash;
 		
 		
@@ -3582,7 +3563,12 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 			if (outerType != NULL)
 			if (outerType != NULL)
 			{
 			{
 				for (auto genericArg : outerType->mGenericTypeInfo->mTypeGenericArguments)
 				for (auto genericArg : outerType->mGenericTypeInfo->mTypeGenericArguments)
-					hashVal = HASH_MIX(hashVal, Hash(genericArg, ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
+				{
+					if (isInnerTypeAlias)
+						typeAliasGenericArgs.Add(genericArg);
+					else
+						hashVal = HASH_MIX(hashVal, Hash(genericArg, ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
+				}
 			}
 			}
 		}
 		}
 		else
 		else
@@ -3602,12 +3588,46 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
 					auto parentTypeInstance = checkTypeInstance;
 					auto parentTypeInstance = checkTypeInstance;
 					int numParentGenericParams = (int)commonOuterType->mGenericParamDefs.size();
 					int numParentGenericParams = (int)commonOuterType->mGenericParamDefs.size();
 					for (int i = 0; i < numParentGenericParams; i++)
 					for (int i = 0; i < numParentGenericParams; i++)
-						hashVal = HASH_MIX(hashVal, Hash(parentTypeInstance->mGenericTypeInfo->mTypeGenericArguments[i], ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
+					{
+						if (isInnerTypeAlias)
+							typeAliasGenericArgs.Add(parentTypeInstance->mGenericTypeInfo->mTypeGenericArguments[i]);
+						else
+							hashVal = HASH_MIX(hashVal, Hash(parentTypeInstance->mGenericTypeInfo->mTypeGenericArguments[i], ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
+					}
 				}
 				}
 			}
 			}
 		}
 		}
 
 
-		HashGenericArguments(genericInstTypeRef, ctx, hashVal, hashSeed);
+		if (isInnerTypeAlias)
+		{			
+			for (auto genericArgTypeRef : genericInstTypeRef->mGenericArguments)
+			{
+				auto argType = ctx->mModule->ResolveTypeRef(genericArgTypeRef, NULL, BfPopulateType_Identity, GetResolveFlags(genericArgTypeRef, ctx, flags));
+				if (argType != NULL)
+					typeAliasGenericArgs.Add(argType);
+				else
+					ctx->mFailed = true;
+			}
+
+			if (!ctx->mFailed)
+			{
+				auto resolvedType = ctx->mModule->ResolveTypeDef(elementTypeDef, typeAliasGenericArgs);
+				if ((resolvedType != NULL) && (resolvedType->IsTypeAlias()))
+				{
+					auto underlyingType = resolvedType->GetUnderlyingType();
+					if (underlyingType == NULL)
+					{
+						ctx->mFailed = true;
+						return 0;
+					}
+					int hashVal = Hash(underlyingType, ctx, flags, hashSeed);
+					hashSeed = 0;
+					return hashVal;
+				}
+			}
+		}
+		else
+			HashGenericArguments(genericInstTypeRef, ctx, hashVal, hashSeed);
 
 
 		return hashVal;
 		return hashVal;
 	}
 	}

+ 11 - 0
IDEHelper/Tests/src/Aliases.bf

@@ -25,6 +25,15 @@ namespace Tests
 			public delegate T Zag();
 			public delegate T Zag();
 		}
 		}
 
 
+		class ClassB<T>
+		{
+			typealias AliasB0<T2> = (T a, T2 b, int c);
+
+			public static void MethodB0(List<AliasB0<float>> val)
+			{
+			}
+		}
+
 		public static void Test<T>()
 		public static void Test<T>()
 		{
 		{
 			T LocalA(int16 a)
 			T LocalA(int16 a)
@@ -60,6 +69,8 @@ namespace Tests
 
 
 			var t2 = (1.2f, 3.4);
 			var t2 = (1.2f, 3.4);
 			ClassA<float>.AliasA6<double> v3 = t2;
 			ClassA<float>.AliasA6<double> v3 = t2;
+
+			ClassB<double>.MethodB0(scope List<(double a, float b, int c)>());
 		}
 		}
 	}
 	}
 }
 }