mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 12:02:21 +02:00
Fixed wrappable props and fixed fixed generic binding in MemberRefExpr
This commit is contained in:
parent
4cd8fe7742
commit
b1181a936d
2 changed files with 80 additions and 1 deletions
|
@ -22236,7 +22236,62 @@ void BfExprEvaluator::DoMemberReference(BfMemberReferenceExpression* memberRefEx
|
||||||
if ((isArrowLookup) && (thisValue))
|
if ((isArrowLookup) && (thisValue))
|
||||||
thisValue = TryArrowLookup(thisValue, memberRefExpr->mDotToken);
|
thisValue = TryArrowLookup(thisValue, memberRefExpr->mDotToken);
|
||||||
|
|
||||||
mResult = LookupField(nameRefNode, thisValue, findName);
|
auto nameNode = memberRefExpr->mMemberName;
|
||||||
|
|
||||||
|
if ((thisValue.mType != NULL) && (!thisValue.mType->IsTypeInstance()) && (!thisValue.mType->IsGenericParam()))
|
||||||
|
{
|
||||||
|
if (thisValue.mType->IsSizedArray())
|
||||||
|
{
|
||||||
|
if (thisValue.mType->IsValuelessType())
|
||||||
|
{
|
||||||
|
thisValue.mType = mModule->GetWrappedStructType(thisValue.mType);
|
||||||
|
thisValue.mValue = mModule->mBfIRBuilder->GetFakeVal();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thisValue = mModule->MakeAddressable(thisValue);
|
||||||
|
thisValue.mType = mModule->GetWrappedStructType(thisValue.mType);
|
||||||
|
thisValue.mValue = mModule->mBfIRBuilder->CreateBitCast(thisValue.mValue, mModule->mBfIRBuilder->MapTypeInstPtr(thisValue.mType->ToTypeInstance()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (thisValue.mType->IsPointer())
|
||||||
|
{
|
||||||
|
// Leave alone
|
||||||
|
}
|
||||||
|
else if (thisValue.mType->IsWrappableType())
|
||||||
|
{
|
||||||
|
thisValue.mType = mModule->GetWrappedStructType(thisValue.mType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BfTypedValue lookupVal = thisValue;
|
||||||
|
if (thisValue.mType != NULL)
|
||||||
|
{
|
||||||
|
auto lookupType = BindGenericType(nameNode, thisValue.mType);
|
||||||
|
if ((lookupType->IsGenericParam()) && (!thisValue.mType->IsGenericParam()))
|
||||||
|
{
|
||||||
|
bool prevUseMixinGenerics = false;
|
||||||
|
if (mModule->mCurMethodState->mMixinState != NULL)
|
||||||
|
{
|
||||||
|
prevUseMixinGenerics = mModule->mCurMethodState->mMixinState->mUseMixinGenerics;
|
||||||
|
mModule->mCurMethodState->mMixinState->mUseMixinGenerics = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to lookup from generic binding
|
||||||
|
mResult = LookupField(nameRight, BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), lookupType), findName, BfLookupFieldFlag_BindOnly);
|
||||||
|
|
||||||
|
if (mModule->mCurMethodState->mMixinState != NULL)
|
||||||
|
mModule->mCurMethodState->mMixinState->mUseMixinGenerics = prevUseMixinGenerics;
|
||||||
|
|
||||||
|
if (mPropDef != NULL)
|
||||||
|
{
|
||||||
|
mOrigPropTarget = lookupVal;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mResult = LookupField(nameRefNode, lookupVal, findName);
|
||||||
|
|
||||||
if ((!mResult) && (mPropDef == NULL))
|
if ((!mResult) && (mPropDef == NULL))
|
||||||
{
|
{
|
||||||
|
|
|
@ -432,6 +432,29 @@ namespace Tests
|
||||||
T sum = a + b;
|
T sum = a + b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface IIntVal
|
||||||
|
{
|
||||||
|
int IntVal { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
struct StructC : IIntVal
|
||||||
|
{
|
||||||
|
int IIntVal.IntVal
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 123;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int GetIntVals<T>(T val) where T : IIntVal
|
||||||
|
{
|
||||||
|
int a = (val).[Friend]IntVal;
|
||||||
|
int b = val.IntVal;
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public static void TestDefaults()
|
public static void TestDefaults()
|
||||||
{
|
{
|
||||||
|
@ -473,6 +496,7 @@ namespace Tests
|
||||||
Test.Assert(TestIFaceD2(cg) == 999);
|
Test.Assert(TestIFaceD2(cg) == 999);
|
||||||
|
|
||||||
ClassH ch = scope .();
|
ClassH ch = scope .();
|
||||||
|
Test.Assert(GetIntVals(StructC()) == 246);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue