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;
|
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,33 +3511,10 @@ 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)
|
BfTypeVector typeAliasGenericArgs;
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool fullyQualified = false;
|
bool fullyQualified = false;
|
||||||
int hashVal = elementTypeDef->mHash;
|
int hashVal = elementTypeDef->mHash;
|
||||||
|
@ -3582,9 +3563,14 @@ 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)
|
||||||
|
{
|
||||||
|
if (isInnerTypeAlias)
|
||||||
|
typeAliasGenericArgs.Add(genericArg);
|
||||||
|
else
|
||||||
hashVal = HASH_MIX(hashVal, Hash(genericArg, ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
|
hashVal = HASH_MIX(hashVal, Hash(genericArg, ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Do we need to add generic arguments from an in-context outer class?
|
// Do we need to add generic arguments from an in-context outer class?
|
||||||
|
@ -3602,11 +3588,45 @@ 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++)
|
||||||
|
{
|
||||||
|
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));
|
hashVal = HASH_MIX(hashVal, Hash(parentTypeInstance->mGenericTypeInfo->mTypeGenericArguments[i], ctx, Beefy::BfResolvedTypeSet::BfHashFlag_None, hashSeed + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
HashGenericArguments(genericInstTypeRef, ctx, hashVal, hashSeed);
|
||||||
|
|
||||||
return hashVal;
|
return hashVal;
|
||||||
|
|
|
@ -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)>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue