1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Fixed generic inner type alias with type extensions

This commit is contained in:
Brian Fiete 2020-06-23 11:54:28 -07:00
parent 8169587b4c
commit 0154b75923
4 changed files with 62 additions and 8 deletions

View file

@ -1704,7 +1704,7 @@ public:
BfTypeInstance* GetOuterType(BfType* type); BfTypeInstance* GetOuterType(BfType* type);
bool IsInnerType(BfType* checkInnerType, BfType* checkOuterType); bool IsInnerType(BfType* checkInnerType, BfType* checkOuterType);
bool IsInnerType(BfTypeDef* checkInnerType, BfTypeDef* checkOuterType); bool IsInnerType(BfTypeDef* checkInnerType, BfTypeDef* checkOuterType);
bool TypeHasParent(BfTypeDef* checkChildTypeDef, BfTypeDef* checkParentTypeDef); bool TypeHasParentOrEquals(BfTypeDef* checkChildTypeDef, BfTypeDef* checkParentTypeDef);
BfTypeDef* FindCommonOuterType(BfTypeDef* type, BfTypeDef* type2); BfTypeDef* FindCommonOuterType(BfTypeDef* type, BfTypeDef* type2);
bool TypeIsSubTypeOf(BfTypeInstance* srcType, BfTypeInstance* wantType, bool checkAccessibility = true); bool TypeIsSubTypeOf(BfTypeInstance* srcType, BfTypeInstance* wantType, bool checkAccessibility = true);
int GetTypeDistance(BfType* fromType, BfType* toType); int GetTypeDistance(BfType* fromType, BfType* toType);

View file

@ -215,7 +215,10 @@ bool BfModule::ValidateGenericConstraints(BfTypeReference* typeRef, BfTypeInstan
{ {
auto underlyingType = genericTypeInst->GetUnderlyingType(); auto underlyingType = genericTypeInst->GetUnderlyingType();
if ((underlyingType != NULL) && (underlyingType->IsGenericTypeInstance())) if ((underlyingType != NULL) && (underlyingType->IsGenericTypeInstance()))
{
PopulateType(underlyingType, BfPopulateType_Declaration);
return ValidateGenericConstraints(typeRef, (BfTypeInstance*)underlyingType, ignoreErrors); return ValidateGenericConstraints(typeRef, (BfTypeInstance*)underlyingType, ignoreErrors);
}
return true; return true;
} }
@ -5278,7 +5281,7 @@ BfType* BfModule::ResolveInnerType(BfType* outerType, BfTypeReference* typeRef,
{ {
bool isFailurePass = pass == 1; bool isFailurePass = pass == 1;
bool allowPrivate = (mCurTypeInstance != NULL) && bool allowPrivate = (mCurTypeInstance != NULL) &&
((mCurTypeInstance == outerTypeInstance) || TypeHasParent(mCurTypeInstance->mTypeDef, outerTypeInstance->mTypeDef)); ((mCurTypeInstance == outerTypeInstance) || TypeHasParentOrEquals(mCurTypeInstance->mTypeDef, outerTypeInstance->mTypeDef));
bool allowProtected = allowPrivate;/*(mCurTypeInstance != NULL) && bool allowProtected = allowPrivate;/*(mCurTypeInstance != NULL) &&
(allowPrivate || (mCurTypeInstance->mSkipTypeProtectionChecks) || TypeIsSubTypeOf(mCurTypeInstance, outerTypeInstance));*/ (allowPrivate || (mCurTypeInstance->mSkipTypeProtectionChecks) || TypeIsSubTypeOf(mCurTypeInstance, outerTypeInstance));*/
@ -7771,7 +7774,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
BfTypeDef* outerType = mSystem->GetCombinedPartial(typeDef->mOuterType); BfTypeDef* outerType = mSystem->GetCombinedPartial(typeDef->mOuterType);
BF_ASSERT(!outerType->mIsPartial); BF_ASSERT(!outerType->mIsPartial);
if (TypeHasParent(mCurTypeInstance->mTypeDef, outerType)) if (TypeHasParentOrEquals(mCurTypeInstance->mTypeDef, outerType))
{ {
BfType* checkCurType = mCurTypeInstance; BfType* checkCurType = mCurTypeInstance;
if (checkCurType->IsBoxed()) if (checkCurType->IsBoxed())
@ -10482,15 +10485,28 @@ BfTypedValue BfModule::GetIntCoercible(const BfTypedValue& typedValue)
return BfTypedValue(val, intType); return BfTypedValue(val, intType);
} }
bool BfModule::TypeHasParent(BfTypeDef* checkChildTypeDef, BfTypeDef* checkParentTypeDef) bool BfModule::TypeHasParentOrEquals(BfTypeDef* checkChildTypeDef, BfTypeDef* checkParentTypeDef)
{ {
BfTypeDef* checkType = checkChildTypeDef; BfTypeDef* checkType = checkChildTypeDef;
while (checkType != NULL)
{ if (checkType->mNestDepth < checkParentTypeDef->mNestDepth)
if (checkType == checkParentTypeDef) return false;
return true;
while (checkType->mNestDepth > checkParentTypeDef->mNestDepth)
checkType = checkType->mOuterType; checkType = checkType->mOuterType;
if (checkType == checkParentTypeDef)
return true;
if (checkType->mNameEx != checkParentTypeDef->mNameEx)
return false;
if (checkType->mIsPartial)
{
for (auto partial : checkParentTypeDef->mPartials)
if (partial == checkType)
return true;
} }
return false; return false;
} }

View file

@ -1,4 +1,6 @@
using System; using System;
using System.Collections;
namespace LibA namespace LibA
{ {
interface IVal interface IVal
@ -26,6 +28,11 @@ namespace LibA
let t = new T(); let t = new T();
delete t; delete t;
} }
public static bool DictEquals(Dictionary<String, int> lhs, Dictionary<String, int> rhs)
{
return lhs == rhs;
}
} }
} }

View file

@ -1,6 +1,7 @@
#pragma warning disable 168 #pragma warning disable 168
using System; using System;
using System.Collections;
namespace System.Collections namespace System.Collections
{ {
@ -16,6 +17,26 @@ namespace System.Collections
return total; return total;
} }
} }
extension Dictionary<K, V>
{
public static bool operator==(Self lhs, Self rhs) where K : IOpEquals where V : IOpEquals
{
if (lhs.mCount != rhs.mCount)
return false;
for (var kv in ref lhs)
{
if (rhs.TryGetValue(kv.key, var rhsVal))
{
if (*kv.valueRef != rhsVal)
return false;
}
else
return false;
}
return true;
}
}
} }
namespace System.Collections namespace System.Collections
@ -161,6 +182,16 @@ namespace Tests
Test.Assert(val == 110); Test.Assert(val == 110);
} }
[Test]
public static void TestDictionary()
{
Dictionary<String, int> dictLhs = scope .() {("Abc", 123), ("Def", 234) };
Dictionary<String, int> dictrhs = scope .() {(scope:: String("Abc"), 123), ("Def", 234) };
Test.Assert(dictLhs == dictrhs);
Test.Assert(!LibA.LibA0.DictEquals(dictLhs, dictrhs));
}
[Test] [Test]
public static void TestSharedData() public static void TestSharedData()
{ {