Bladeren bron

Fixed lambda bind to delegate type with outer generic

Brian Fiete 5 jaren geleden
bovenliggende
commit
16cd9f7a77

+ 3 - 4
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)
 		{

+ 3 - 0
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);	
 

+ 2 - 1
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;

+ 8 - 0
IDEHelper/Tests/src/Delegates.bf

@@ -98,6 +98,11 @@ namespace Tests
 			}
 		}
 
+		class ClassB<T>
+		{
+			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<int8>.DelegateB dlg2 = scope (val) => val + 123;
+			Test.Assert(dlg2(3) == 126);
 		}
 
 		public static void Modify(ref int a, ref Splattable b)