2
0
Эх сурвалжийг харах

Fixed issue with local methods in generic types

Brian Fiete 5 жил өмнө
parent
commit
ee4ae8f9ed

+ 9 - 5
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -19315,12 +19315,16 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod
 		}
 
 		// Valueless types always compare as 'equal'
-		if ((leftValue.mType == rightValue.mType) && (leftValue.mType->IsValuelessType()))
+		if (leftValue.mType == rightValue.mType)
 		{
-			auto boolType = mModule->GetPrimitiveType(BfTypeCode_Boolean);
-			bool isEqual = (binaryOp == BfBinaryOp_Equality) || (binaryOp == BfBinaryOp_StrictEquality);
-			mResult = BfTypedValue(mModule->GetConstValue(isEqual ? 1 : 0, boolType), boolType);
-			return;
+			mModule->PopulateType(leftValue.mType);
+			if (leftValue.mType->IsValuelessType())
+			{
+				auto boolType = mModule->GetPrimitiveType(BfTypeCode_Boolean);
+					bool isEqual = (binaryOp == BfBinaryOp_Equality) || (binaryOp == BfBinaryOp_StrictEquality);
+					mResult = BfTypedValue(mModule->GetConstValue(isEqual ? 1 : 0, boolType), boolType);
+					return;
+			}
 		}
 	}
 

+ 4 - 4
IDEHelper/Compiler/BfModule.cpp

@@ -9474,14 +9474,14 @@ BfMethodInstance* BfModule::GetRawMethodByName(BfTypeInstance* typeInstance, con
 }
 
 BfMethodInstance* BfModule::GetUnspecializedMethodInstance(BfMethodInstance* methodInstance, bool useUnspecializedType)
-{
+{	
 	if ((methodInstance->mMethodInfoEx != NULL) && (methodInstance->mMethodInfoEx->mMethodGenericArguments.size() != 0))
 		methodInstance = methodInstance->mMethodInstanceGroup->mDefault;
 	
 	auto owner = methodInstance->mMethodInstanceGroup->mOwner;
 
 	if (!useUnspecializedType)	
-		return GetRawMethodInstanceAtIdx(owner, methodInstance->mMethodDef->mIdx);	
+		return methodInstance;	
 
 	if (!owner->IsGenericTypeInstance())
 		return methodInstance;
@@ -17320,9 +17320,9 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup)
 		methodState.mGenericTypeBindings = &methodInstance->GetMethodInfoEx()->mGenericTypeBindings;
 	}
 	else if ((((methodInstance->mMethodInfoEx != NULL) && ((int)methodInstance->mMethodInfoEx->mMethodGenericArguments.size() > dependentGenericStartIdx)) || 
-		((mCurTypeInstance->IsGenericTypeInstance()) && (!isGenericVariation))))
+		((mCurTypeInstance->IsGenericTypeInstance()) && (!isGenericVariation) && (!methodInstance->mMethodDef->mIsLocalMethod))))
 	{		
-		unspecializedMethodInstance = GetUnspecializedMethodInstance(methodInstance);
+		unspecializedMethodInstance = GetUnspecializedMethodInstance(methodInstance, !methodInstance->mMethodDef->mIsLocalMethod);
 		
 		BF_ASSERT(unspecializedMethodInstance != methodInstance);
 		if (!unspecializedMethodInstance->mHasBeenProcessed)

+ 22 - 0
IDEHelper/Tests/src/LocalFunctions.bf

@@ -6,6 +6,25 @@ namespace Tests
 {
 	class LocalFunctions
 	{
+		class ClassA<T>
+		{
+			public int Get<T2>()
+			{
+				int LocalA()
+				{
+				   return 123;
+				}
+
+				int LocalB<T3>(T3 val) where T3 : IHashable
+				{
+					val.GetHashCode();
+					return 234;
+				}
+
+				return LocalA() + LocalB(1.2f);
+			}
+		}
+
 		[Test]
 		static void TestA()
 		{
@@ -23,6 +42,9 @@ namespace Tests
 
 			FuncA();
 			Test.Assert(a == 101);
+
+			ClassA<int> ca = scope .();
+			Test.Assert(ca.Get<int16>() == 357);
 		}
 
 		[Test]