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:
parent
4ea28022bf
commit
1db184e7d8
2 changed files with 62 additions and 31 deletions
|
@ -3499,6 +3499,10 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
|||
return 0;
|
||||
}
|
||||
|
||||
int typeAliasHash = 0;
|
||||
|
||||
bool isInnerTypeAlias = false;
|
||||
|
||||
// Don't translate aliases for the root type, just element types
|
||||
if (ctx->mRootTypeRef == typeRef)
|
||||
{
|
||||
|
@ -3507,34 +3511,11 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
|||
}
|
||||
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;
|
||||
int hashVal = elementTypeDef->mHash;
|
||||
|
||||
|
@ -3582,7 +3563,12 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
|||
if (outerType != NULL)
|
||||
{
|
||||
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
|
||||
|
@ -3602,12 +3588,46 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
|||
auto parentTypeInstance = checkTypeInstance;
|
||||
int numParentGenericParams = (int)commonOuterType->mGenericParamDefs.size();
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,15 @@ namespace Tests
|
|||
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>()
|
||||
{
|
||||
T LocalA(int16 a)
|
||||
|
@ -60,6 +69,8 @@ namespace Tests
|
|||
|
||||
var t2 = (1.2f, 3.4);
|
||||
ClassA<float>.AliasA6<double> v3 = t2;
|
||||
|
||||
ClassB<double>.MethodB0(scope List<(double a, float b, int c)>());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue