mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed nested generic const value types
This commit is contained in:
parent
ae6287a466
commit
23b777c6f8
3 changed files with 19 additions and 17 deletions
|
@ -3075,7 +3075,8 @@ void BfModule::DoPopulateType_TypeAlias(BfTypeAliasType* typeAlias)
|
||||||
if (!CheckCircularDataError())
|
if (!CheckCircularDataError())
|
||||||
{
|
{
|
||||||
if (typeAliasDecl->mAliasToType != NULL)
|
if (typeAliasDecl->mAliasToType != NULL)
|
||||||
aliasToType = ResolveTypeRef(typeAliasDecl->mAliasToType, BfPopulateType_IdentityNoRemapAlias);
|
aliasToType = ResolveTypeRef(typeAliasDecl->mAliasToType, BfPopulateType_IdentityNoRemapAlias,
|
||||||
|
(BfResolveTypeRefFlags)(BfResolveTypeRefFlag_AllowGenericParamConstValue | BfResolveTypeRefFlag_AllowImplicitConstExpr));
|
||||||
}
|
}
|
||||||
|
|
||||||
BfLogSysM("DoPopulateType_TypeAlias %p %s = %p %s\n", typeAlias, TypeToString(typeAlias).c_str(), aliasToType, (aliasToType != NULL) ? TypeToString(aliasToType).c_str() : NULL);
|
BfLogSysM("DoPopulateType_TypeAlias %p %s = %p %s\n", typeAlias, TypeToString(typeAlias).c_str(), aliasToType, (aliasToType != NULL) ? TypeToString(aliasToType).c_str() : NULL);
|
||||||
|
|
|
@ -3236,16 +3236,20 @@ static int HashNode(BfAstNode* node)
|
||||||
return (int)Hash64(nameStr, node->GetSrcLength());
|
return (int)Hash64(nameStr, node->GetSrcLength());
|
||||||
}
|
}
|
||||||
|
|
||||||
int BfResolvedTypeSet::DirectHash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags, int hashSeed)
|
BfResolveTypeRefFlags BfResolvedTypeSet::GetResolveFlags(BfAstNode* typeRef, LookupContext* ctx, BfHashFlags flags)
|
||||||
{
|
{
|
||||||
bool isHeadType = typeRef == ctx->mRootTypeRef;
|
bool isHeadType = typeRef == ctx->mRootTypeRef;
|
||||||
|
|
||||||
BfResolveTypeRefFlags resolveFlags = ctx->mResolveFlags;
|
BfResolveTypeRefFlags resolveFlags = ctx->mResolveFlags;
|
||||||
if ((flags & BfHashFlag_AllowGenericParamConstValue) != 0)
|
if ((flags & BfHashFlag_AllowGenericParamConstValue) != 0)
|
||||||
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_AllowGenericParamConstValue);
|
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_AllowGenericParamConstValue);
|
||||||
if (!isHeadType)
|
if (!isHeadType)
|
||||||
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags &~ BfResolveTypeRefFlag_Attribute);
|
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags & ~BfResolveTypeRefFlag_Attribute);
|
||||||
auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, resolveFlags);
|
return resolveFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
int BfResolvedTypeSet::DirectHash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags, int hashSeed)
|
||||||
|
{
|
||||||
|
auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, GetResolveFlags(typeRef, ctx, flags));
|
||||||
if (resolvedType == NULL)
|
if (resolvedType == NULL)
|
||||||
{
|
{
|
||||||
ctx->mFailed = true;
|
ctx->mFailed = true;
|
||||||
|
@ -3350,7 +3354,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
if (auto genericInstTypeRef = BfNodeDynCastExact<BfGenericInstanceTypeRef>(typeRef))
|
if (auto genericInstTypeRef = BfNodeDynCastExact<BfGenericInstanceTypeRef>(typeRef))
|
||||||
{
|
{
|
||||||
//BfType* type = NULL;
|
//BfType* type = NULL;
|
||||||
BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef, NULL, ctx->mResolveFlags);
|
BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef, NULL, GetResolveFlags(genericInstTypeRef, ctx, flags));
|
||||||
|
|
||||||
if (elementTypeDef == NULL)
|
if (elementTypeDef == NULL)
|
||||||
{
|
{
|
||||||
|
@ -3369,7 +3373,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
BfTypeVector genericArgs;
|
BfTypeVector genericArgs;
|
||||||
for (auto genericArgTypeRef : genericInstTypeRef->mGenericArguments)
|
for (auto genericArgTypeRef : genericInstTypeRef->mGenericArguments)
|
||||||
{
|
{
|
||||||
auto argType = ctx->mModule->ResolveTypeRef(genericArgTypeRef, NULL, BfPopulateType_Identity, ctx->mResolveFlags);
|
auto argType = ctx->mModule->ResolveTypeRef(genericArgTypeRef, NULL, BfPopulateType_Identity, GetResolveFlags(genericArgTypeRef, ctx, flags));
|
||||||
if (argType != NULL)
|
if (argType != NULL)
|
||||||
genericArgs.Add(argType);
|
genericArgs.Add(argType);
|
||||||
else
|
else
|
||||||
|
@ -3399,11 +3403,6 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
|
|
||||||
BfTypeInstance* outerType = NULL;
|
BfTypeInstance* outerType = NULL;
|
||||||
|
|
||||||
if (genericInstTypeRef->ToString() == "ClassA<T>.AliasA6<float>")
|
|
||||||
{
|
|
||||||
NOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
int checkIdx = 0;
|
int checkIdx = 0;
|
||||||
auto checkTypeRef = genericInstTypeRef->mElementType;
|
auto checkTypeRef = genericInstTypeRef->mElementType;
|
||||||
while (checkTypeRef != NULL)
|
while (checkTypeRef != NULL)
|
||||||
|
@ -3414,7 +3413,8 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
fullyQualified = true;
|
fullyQualified = true;
|
||||||
if ((elementTypeDef->mOuterType != NULL) && (!elementTypeDef->mOuterType->mGenericParamDefs.IsEmpty()))
|
if ((elementTypeDef->mOuterType != NULL) && (!elementTypeDef->mOuterType->mGenericParamDefs.IsEmpty()))
|
||||||
{
|
{
|
||||||
auto resolvedType = ctx->mModule->ResolveTypeRef(checkTypeRef, BfPopulateType_Identity, (BfResolveTypeRefFlags)(ctx->mResolveFlags | BfResolveTypeRefFlag_IgnoreLookupError));
|
auto resolvedType = ctx->mModule->ResolveTypeRef(checkTypeRef, BfPopulateType_Identity,
|
||||||
|
(BfResolveTypeRefFlags)(GetResolveFlags(checkTypeRef, ctx, flags) | BfResolveTypeRefFlag_IgnoreLookupError));
|
||||||
if (resolvedType == NULL)
|
if (resolvedType == NULL)
|
||||||
{
|
{
|
||||||
ctx->mFailed = true;
|
ctx->mFailed = true;
|
||||||
|
@ -3641,7 +3641,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, ctx->mResolveFlags); // To throw an error...
|
ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, GetResolveFlags(typeRef, ctx, flags)); // To throw an error...
|
||||||
ctx->mFailed = true;
|
ctx->mFailed = true;
|
||||||
return 0;
|
return 0;
|
||||||
//return Hash(refType->mElementType, ctx);
|
//return Hash(refType->mElementType, ctx);
|
||||||
|
@ -3674,7 +3674,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
}
|
}
|
||||||
return Hash(rightType, ctx);*/
|
return Hash(rightType, ctx);*/
|
||||||
|
|
||||||
auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, ctx->mResolveFlags);
|
auto resolvedType = ctx->mModule->ResolveTypeRef(typeRef, BfPopulateType_Identity, GetResolveFlags(typeRef, ctx, flags));
|
||||||
if (resolvedType == NULL)
|
if (resolvedType == NULL)
|
||||||
{
|
{
|
||||||
ctx->mFailed = true;
|
ctx->mFailed = true;
|
||||||
|
@ -3704,7 +3704,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
// Only use the HAS_RETTYPE for root-level rettype insertions
|
// Only use the HAS_RETTYPE for root-level rettype insertions
|
||||||
if (ctx->mRootTypeRef != retTypeTypeRef)
|
if (ctx->mRootTypeRef != retTypeTypeRef)
|
||||||
{
|
{
|
||||||
auto type = ctx->mModule->ResolveTypeRef(retTypeTypeRef, BfPopulateType_Identity, ctx->mResolveFlags);
|
auto type = ctx->mModule->ResolveTypeRef(retTypeTypeRef, BfPopulateType_Identity, GetResolveFlags(retTypeTypeRef, ctx, flags));
|
||||||
if ((type != NULL) && (type->IsRef()))
|
if ((type != NULL) && (type->IsRef()))
|
||||||
type = type->GetUnderlyingType();
|
type = type->GetUnderlyingType();
|
||||||
return Hash(type, ctx, flags, hashSeed);
|
return Hash(type, ctx, flags, hashSeed);
|
||||||
|
@ -3900,7 +3900,7 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa
|
||||||
}
|
}
|
||||||
else if (auto dotTypeRef = BfNodeDynCastExact<BfDotTypeReference>(typeRef))
|
else if (auto dotTypeRef = BfNodeDynCastExact<BfDotTypeReference>(typeRef))
|
||||||
{
|
{
|
||||||
ctx->mModule->ResolveTypeRef(dotTypeRef, BfPopulateType_Identity, ctx->mResolveFlags);
|
ctx->mModule->ResolveTypeRef(dotTypeRef, BfPopulateType_Identity, GetResolveFlags(dotTypeRef, ctx, flags));
|
||||||
ctx->mFailed = true;
|
ctx->mFailed = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2651,6 +2651,7 @@ public:
|
||||||
static int DoHash(BfType* type, LookupContext* ctx, bool allowRef, int hashSeed);
|
static int DoHash(BfType* type, LookupContext* ctx, bool allowRef, int hashSeed);
|
||||||
static int Hash(BfType* type, LookupContext* ctx, bool allowRef = false, int hashSeed = 0);
|
static int Hash(BfType* type, LookupContext* ctx, bool allowRef = false, int hashSeed = 0);
|
||||||
static int DirectHash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None, int hashSeed = 0);
|
static int DirectHash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None, int hashSeed = 0);
|
||||||
|
static BfResolveTypeRefFlags GetResolveFlags(BfAstNode* typeRef, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None);
|
||||||
static int DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags, int& hashSeed);
|
static int DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags, int& hashSeed);
|
||||||
static int Hash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None, int hashSeed = 0);
|
static int Hash(BfTypeReference* typeRef, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None, int hashSeed = 0);
|
||||||
static int Hash(BfAstNode* typeRefNode, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None, int hashSeed = 0);
|
static int Hash(BfAstNode* typeRefNode, LookupContext* ctx, BfHashFlags flags = BfHashFlag_None, int hashSeed = 0);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue