From 1db184e7d87f16a86c9f16add7d17bcfe3e169a5 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 16 Jul 2022 14:28:18 -0400 Subject: [PATCH] Fixed nested generic type alias type reference --- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 82 ++++++++++++++-------- IDEHelper/Tests/src/Aliases.bf | 11 +++ 2 files changed, 62 insertions(+), 31 deletions(-) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 99637081..5c088f1f 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -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) { @@ -3506,35 +3510,12 @@ int BfResolvedTypeSet::DoHash(BfTypeReference* typeRef, LookupContext* ctx, BfHa ctx->mRootTypeDef = elementTypeDef; } 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; } diff --git a/IDEHelper/Tests/src/Aliases.bf b/IDEHelper/Tests/src/Aliases.bf index bbf92e82..cac802a5 100644 --- a/IDEHelper/Tests/src/Aliases.bf +++ b/IDEHelper/Tests/src/Aliases.bf @@ -25,6 +25,15 @@ namespace Tests public delegate T Zag(); } + class ClassB + { + typealias AliasB0 = (T a, T2 b, int c); + + public static void MethodB0(List> val) + { + } + } + public static void Test() { T LocalA(int16 a) @@ -60,6 +69,8 @@ namespace Tests var t2 = (1.2f, 3.4); ClassA.AliasA6 v3 = t2; + + ClassB.MethodB0(scope List<(double a, float b, int c)>()); } } }