From 16cd9f7a77b4a62ef08c623c60f4810581004ce1 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 8 Oct 2020 06:45:04 -0700 Subject: [PATCH] Fixed lambda bind to delegate type with outer generic --- IDEHelper/Compiler/BfExprEvaluator.cpp | 7 +++---- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 3 +++ IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 3 ++- IDEHelper/Tests/src/Delegates.bf | 8 ++++++++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index c1527b95..6cc479f5 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -10455,10 +10455,9 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr) Val128 hash128 = hashCtx.Finish128(); BfClosureType* checkClosureType = new BfClosureType(delegateTypeInstance, hash128); - checkClosureType->mContext = mModule->mContext; - + checkClosureType->mContext = mModule->mContext; checkClosureType->mBaseType = delegateTypeInstance; - BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_Identity); + BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_TypeDef); closureTypeInst = (BfClosureType*)resolvedClosureType; if (checkClosureType == resolvedClosureType) { @@ -11413,7 +11412,7 @@ BfLambdaInstance* BfExprEvaluator::GetLambdaInstance(BfLambdaBindExpression* lam BfClosureType* checkClosureType = new BfClosureType(delegateTypeInstance, hash128); checkClosureType->mContext = mModule->mContext; checkClosureType->mBaseType = delegateTypeInstance; - BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_Identity); + BfType* resolvedClosureType = mModule->ResolveType(checkClosureType, BfPopulateType_TypeDef); closureTypeInst = (BfClosureType*)resolvedClosureType; if (checkClosureType == resolvedClosureType) { diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index ef9d5f2a..10d478a7 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -982,6 +982,9 @@ void BfModule::PopulateType(BfType* resolvedTypeRef, BfPopulateType populateType if (!resolvedTypeRef->IsIncomplete()) return; + if (populateType <= BfPopulateType_TypeDef) + return; + auto typeInstance = resolvedTypeRef->ToTypeInstance(); CheckInjectNewRevision(typeInstance); diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index fa0ae208..0b919bfd 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -2289,7 +2289,8 @@ void BfClosureType::Init(BfProject* bfProject) mTypeDef->mProject = bfProject; mTypeDef->mTypeCode = srcTypeDef->mTypeCode; 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; system->AddNamespaceUsage(mTypeDef->mNamespace, mTypeDef->mProject); mTypeDef->mHash = srcTypeDef->mHash; diff --git a/IDEHelper/Tests/src/Delegates.bf b/IDEHelper/Tests/src/Delegates.bf index cbdec401..a8cd9efc 100644 --- a/IDEHelper/Tests/src/Delegates.bf +++ b/IDEHelper/Tests/src/Delegates.bf @@ -98,6 +98,11 @@ namespace Tests } } + class ClassB + { + public delegate int DelegateB(T val); + } + [Test] public static void TestBasics() { @@ -138,6 +143,9 @@ namespace Tests val1.TestLambda(); ClassA ca = scope .(); ca.TestLambda(); + + ClassB.DelegateB dlg2 = scope (val) => val + 123; + Test.Assert(dlg2(3) == 126); } public static void Modify(ref int a, ref Splattable b)