mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Fixed lambda bind to delegate type with outer generic
This commit is contained in:
parent
58370d2c8c
commit
16cd9f7a77
4 changed files with 16 additions and 5 deletions
|
@ -10455,10 +10455,9 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr)
|
||||||
|
|
||||||
Val128 hash128 = hashCtx.Finish128();
|
Val128 hash128 = hashCtx.Finish128();
|
||||||
BfClosureType* checkClosureType = new BfClosureType(delegateTypeInstance, hash128);
|
BfClosureType* checkClosureType = new BfClosureType(delegateTypeInstance, hash128);
|
||||||
checkClosureType->mContext = mModule->mContext;
|
checkClosureType->mContext = mModule->mContext;
|
||||||
|
|
||||||
checkClosureType->mBaseType = delegateTypeInstance;
|
checkClosureType->mBaseType = delegateTypeInstance;
|
||||||
BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_Identity);
|
BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_TypeDef);
|
||||||
closureTypeInst = (BfClosureType*)resolvedClosureType;
|
closureTypeInst = (BfClosureType*)resolvedClosureType;
|
||||||
if (checkClosureType == resolvedClosureType)
|
if (checkClosureType == resolvedClosureType)
|
||||||
{
|
{
|
||||||
|
@ -11413,7 +11412,7 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam
|
||||||
BfClosureType* checkClosureType = new BfClosureType(delegateTypeInstance, hash128);
|
BfClosureType* checkClosureType = new BfClosureType(delegateTypeInstance, hash128);
|
||||||
checkClosureType->mContext = mModule->mContext;
|
checkClosureType->mContext = mModule->mContext;
|
||||||
checkClosureType->mBaseType = delegateTypeInstance;
|
checkClosureType->mBaseType = delegateTypeInstance;
|
||||||
BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_Identity);
|
BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_TypeDef);
|
||||||
closureTypeInst = (BfClosureType*)resolvedClosureType;
|
closureTypeInst = (BfClosureType*)resolvedClosureType;
|
||||||
if (checkClosureType == resolvedClosureType)
|
if (checkClosureType == resolvedClosureType)
|
||||||
{
|
{
|
||||||
|
|
|
@ -982,6 +982,9 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType
|
||||||
if (!resolvedTypeRef->IsIncomplete())
|
if (!resolvedTypeRef->IsIncomplete())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (populateType <= BfPopulateType_TypeDef)
|
||||||
|
return;
|
||||||
|
|
||||||
auto typeInstance = resolvedTypeRef->ToTypeInstance();
|
auto typeInstance = resolvedTypeRef->ToTypeInstance();
|
||||||
CheckInjectNewRevision(typeInstance);
|
CheckInjectNewRevision(typeInstance);
|
||||||
|
|
||||||
|
|
|
@ -2289,7 +2289,8 @@ void BfClosureType::Init(BfProject* bfProject)
|
||||||
mTypeDef->mProject = bfProject;
|
mTypeDef->mProject = bfProject;
|
||||||
mTypeDef->mTypeCode = srcTypeDef->mTypeCode;
|
mTypeDef->mTypeCode = srcTypeDef->mTypeCode;
|
||||||
mTypeDef->mName = system->GetAtom(srcTypeDef->mName->mString + mNameAdd);
|
mTypeDef->mName = system->GetAtom(srcTypeDef->mName->mString + mNameAdd);
|
||||||
mTypeDef->mOuterType = srcTypeDef->mOuterType;
|
// Purposely leave out 'mOuterType' - this fails if the outer type is generic
|
||||||
|
//mTypeDef->mOuterType = srcTypeDef->mOuterType;
|
||||||
mTypeDef->mNamespace = srcTypeDef->mNamespace;
|
mTypeDef->mNamespace = srcTypeDef->mNamespace;
|
||||||
system->AddNamespaceUsage(mTypeDef->mNamespace, mTypeDef->mProject);
|
system->AddNamespaceUsage(mTypeDef->mNamespace, mTypeDef->mProject);
|
||||||
mTypeDef->mHash = srcTypeDef->mHash;
|
mTypeDef->mHash = srcTypeDef->mHash;
|
||||||
|
|
|
@ -98,6 +98,11 @@ namespace Tests
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ClassB<T>
|
||||||
|
{
|
||||||
|
public delegate int DelegateB(T val);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public static void TestBasics()
|
public static void TestBasics()
|
||||||
{
|
{
|
||||||
|
@ -138,6 +143,9 @@ namespace Tests
|
||||||
val1.TestLambda();
|
val1.TestLambda();
|
||||||
ClassA ca = scope .();
|
ClassA ca = scope .();
|
||||||
ca.TestLambda();
|
ca.TestLambda();
|
||||||
|
|
||||||
|
ClassB<int8>.DelegateB dlg2 = scope (val) => val + 123;
|
||||||
|
Test.Assert(dlg2(3) == 126);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Modify(ref int a, ref Splattable b)
|
public static void Modify(ref int a, ref Splattable b)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue