From ea8b80497d1672370f47c4984eb706f7a949e413 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 26 Oct 2021 10:45:45 -0700 Subject: [PATCH] `Self` is type alias definition now refers to outer type --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 64 +++++++++++++++--------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index f618c3b1..7610f050 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -9153,17 +9153,22 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula if (findName == "Self") { BfType* selfType = mCurTypeInstance; - if (selfType->IsInterface()) // For interfaces, 'Self' refers to the identity of the implementing type, so we use a placeholder - return GetPrimitiveType(BfTypeCode_Self); - else - resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource); - - if (selfType->IsBoxed()) - selfType = selfType->GetUnderlyingType(); - if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0) + if (selfType->IsTypeAlias()) + selfType = GetOuterType(selfType); + if (selfType != NULL) { - if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation())) - selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType); + if (selfType->IsInterface()) // For interfaces, 'Self' refers to the identity of the implementing type, so we use a placeholder + return GetPrimitiveType(BfTypeCode_Self); + else + resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource); + + if (selfType->IsBoxed()) + selfType = selfType->GetUnderlyingType(); + if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0) + { + if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation())) + selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType); + } } if (selfType != NULL) { @@ -9180,15 +9185,19 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula } else if (findName == "SelfBase") { - BfType* selfType = mCurTypeInstance; - resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource); - - if (selfType->IsBoxed()) - selfType = selfType->GetUnderlyingType(); - if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0) + BfType* selfType = mCurTypeInstance; + if (selfType->IsTypeAlias()) + selfType = GetOuterType(selfType); + if (selfType != NULL) { - if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation())) - selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType); + resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource); + if (selfType->IsBoxed()) + selfType = selfType->GetUnderlyingType(); + if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0) + { + if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation())) + selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType); + } } BfType* baseType = NULL; if (selfType != NULL) @@ -9213,15 +9222,20 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula else if (findName == "SelfOuter") { BfType* selfType = mCurTypeInstance; - resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource); - if (selfType->IsBoxed()) - selfType = selfType->GetUnderlyingType(); - if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0) + if (selfType->IsTypeAlias()) + selfType = GetOuterType(selfType); + if (selfType != NULL) { - if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation())) - selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType); + resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource); + if (selfType->IsBoxed()) + selfType = selfType->GetUnderlyingType(); + if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0) + { + if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation())) + selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType); + } + selfType = GetOuterType(selfType->ToTypeInstance()); } - selfType = GetOuterType(mCurTypeInstance); if (selfType == NULL) Fail("'SelfOuter' type is not usable here", typeRef); return ResolveTypeResult(typeRef, selfType, populateType, resolveFlags);