1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 20:12:21 +02:00

Fixed nested generic type alias type reference

This commit is contained in:
Brian Fiete 2022-07-16 14:28:18 -04:00
parent 4ea28022bf
commit 1db184e7d8
2 changed files with 62 additions and 31 deletions

View file

@ -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)
{ {
@ -3507,34 +3511,11 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
} }
else if (elementTypeDef->mTypeCode == BfTypeCode_TypeAlias) else if (elementTypeDef->mTypeCode == BfTypeCode_TypeAlias)
{ {
BfTypeVector genericArgs; isInnerTypeAlias = true;
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;
}
}
} }
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;
} }

View file

@ -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)>());
} }
} }
} }