mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Self
is type alias definition now refers to outer type
This commit is contained in:
parent
ea5e5fd82a
commit
ea8b80497d
1 changed files with 39 additions and 25 deletions
|
@ -9153,17 +9153,22 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
if (findName == "Self")
|
if (findName == "Self")
|
||||||
{
|
{
|
||||||
BfType* selfType = mCurTypeInstance;
|
BfType* selfType = mCurTypeInstance;
|
||||||
if (selfType->IsInterface()) // For interfaces, 'Self' refers to the identity of the implementing type, so we use a placeholder
|
if (selfType->IsTypeAlias())
|
||||||
return GetPrimitiveType(BfTypeCode_Self);
|
selfType = GetOuterType(selfType);
|
||||||
else
|
if (selfType != NULL)
|
||||||
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource);
|
|
||||||
|
|
||||||
if (selfType->IsBoxed())
|
|
||||||
selfType = selfType->GetUnderlyingType();
|
|
||||||
if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0)
|
|
||||||
{
|
{
|
||||||
if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation()))
|
if (selfType->IsInterface()) // For interfaces, 'Self' refers to the identity of the implementing type, so we use a placeholder
|
||||||
selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType);
|
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)
|
if (selfType != NULL)
|
||||||
{
|
{
|
||||||
|
@ -9181,14 +9186,18 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
else if (findName == "SelfBase")
|
else if (findName == "SelfBase")
|
||||||
{
|
{
|
||||||
BfType* selfType = mCurTypeInstance;
|
BfType* selfType = mCurTypeInstance;
|
||||||
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource);
|
if (selfType->IsTypeAlias())
|
||||||
|
selfType = GetOuterType(selfType);
|
||||||
if (selfType->IsBoxed())
|
if (selfType != NULL)
|
||||||
selfType = selfType->GetUnderlyingType();
|
|
||||||
if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0)
|
|
||||||
{
|
{
|
||||||
if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation()))
|
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource);
|
||||||
selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType);
|
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;
|
BfType* baseType = NULL;
|
||||||
if (selfType != NULL)
|
if (selfType != NULL)
|
||||||
|
@ -9213,15 +9222,20 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
|
||||||
else if (findName == "SelfOuter")
|
else if (findName == "SelfOuter")
|
||||||
{
|
{
|
||||||
BfType* selfType = mCurTypeInstance;
|
BfType* selfType = mCurTypeInstance;
|
||||||
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource);
|
if (selfType->IsTypeAlias())
|
||||||
if (selfType->IsBoxed())
|
selfType = GetOuterType(selfType);
|
||||||
selfType = selfType->GetUnderlyingType();
|
if (selfType != NULL)
|
||||||
if ((resolveFlags & BfResolveTypeRefFlag_NoResolveGenericParam) != 0)
|
|
||||||
{
|
{
|
||||||
if ((selfType->IsSpecializedType()) || (selfType->IsUnspecializedTypeVariation()))
|
resolveFlags = (BfResolveTypeRefFlags)(resolveFlags | BfResolveTypeRefFlag_FromIndirectSource);
|
||||||
selfType = ResolveTypeDef(selfType->ToTypeInstance()->mTypeDef, populateType);
|
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)
|
if (selfType == NULL)
|
||||||
Fail("'SelfOuter' type is not usable here", typeRef);
|
Fail("'SelfOuter' type is not usable here", typeRef);
|
||||||
return ResolveTypeResult(typeRef, selfType, populateType, resolveFlags);
|
return ResolveTypeResult(typeRef, selfType, populateType, resolveFlags);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue