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

Fixed error with generic method call on a static field

Brian Fiete 5 жил өмнө
parent
commit
24aaa22f7a

+ 1 - 1
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -14478,7 +14478,7 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
 			mModule->Fail("Identifier not found", qualifiedName->mLeft);
 			mModule->CheckTypeRefFixit(qualifiedName->mLeft);
 			mModule->CheckIdentifierFixit(qualifiedName->mLeft);
-			thisValue = mModule->GetDefaultTypedValue(mModule->mContext->mBfObjectType);
+			thisValue = mModule->GetDefaultTypedValue(mModule->GetPrimitiveType(BfTypeCode_Var));
 		}
 		if (mResult)
 			CheckResultForReading(mResult);

+ 1 - 1
IDEHelper/Compiler/BfModule.h

@@ -1659,7 +1659,7 @@ public:
 	void FixIntUnknown(BfTypedValue& typedVal, BfType* matchType = NULL);	
 	void FixIntUnknown(BfTypedValue& lhs, BfTypedValue& rhs);
 	bool TypeEquals(BfTypedValue& val, BfType* type);
-	BfTypeDef* ResolveGenericInstanceDef(BfGenericInstanceTypeRef* genericTypeRef, BfType** outType = NULL);
+	BfTypeDef* ResolveGenericInstanceDef(BfGenericInstanceTypeRef* genericTypeRef, BfType** outType = NULL, BfResolveTypeRefFlags resolveFlags = BfResolveTypeRefFlag_None);
 	BfType* ResolveType(BfType* lookupType, BfPopulateType populateType = BfPopulateType_Data);	
 	void ResolveGenericParamConstraints(BfGenericParamInstance* genericParamInstance, bool isUnspecialized);
 	String GenericParamSourceToString(const BfGenericParamSource& genericParamSource);

+ 7 - 5
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -5983,7 +5983,7 @@ BfType* BfModule::ResolveTypeDef(BfTypeDef* typeDef, const BfTypeVector& generic
 
 int checkIdx = 0;
 
-BfTypeDef* BfModule::ResolveGenericInstanceDef(BfGenericInstanceTypeRef* genericTypeRef, BfType** outType)
+BfTypeDef* BfModule::ResolveGenericInstanceDef(BfGenericInstanceTypeRef* genericTypeRef, BfType** outType, BfResolveTypeRefFlags resolveFlags)
 {
 	if (outType != NULL)
 		*outType = NULL;
@@ -6061,13 +6061,14 @@ BfTypeDef* BfModule::ResolveGenericInstanceDef(BfGenericInstanceTypeRef* generic
 				}
 			}
 
-			if (wasGenericParam)
+			if ((wasGenericParam) && ((resolveFlags & BfResolveTypeRefFlag_IgnoreLookupError) == 0))
 				Fail("Cannot use generic param as generic instance type", typeRef);
 		}
 		
 		if (typeDef == NULL)
 		{
-			TypeRefNotFound(typeRef);
+			if ((resolveFlags & BfResolveTypeRefFlag_IgnoreLookupError) == 0)
+				TypeRefNotFound(typeRef);
 			return NULL;
 		}
 	}
@@ -6085,7 +6086,8 @@ BfTypeDef* BfModule::ResolveGenericInstanceDef(BfGenericInstanceTypeRef* generic
 			return typeInst->mTypeDef;
 	}
 
-	Fail("Invalid generic type", typeRef);
+	if ((resolveFlags & BfResolveTypeRefFlag_IgnoreLookupError) == 0)
+		Fail("Invalid generic type", typeRef);
 	return NULL;
 }
 
@@ -8273,7 +8275,7 @@ BfType* BfModule::ResolveTypeRef(BfTypeReference* typeRef, BfPopulateType popula
 	}
 
 	BfResolvedTypeSet::LookupContext lookupCtx;
-	lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & BfResolveTypeRefFlag_NoCreate);
+	lookupCtx.mResolveFlags = (BfResolveTypeRefFlags)(resolveFlags & (BfResolveTypeRefFlag_NoCreate | BfResolveTypeRefFlag_IgnoreLookupError));
 	lookupCtx.mRootTypeRef = typeRef;
 	lookupCtx.mRootTypeDef = typeDef;
 	lookupCtx.mModule = this;

+ 1 - 1
IDEHelper/Compiler/BfResolvedTypeUtils.cpp

@@ -2851,7 +2851,7 @@ int BfResolvedTypeSet::Hash(BfTypeReference* typeRef, LookupContext* ctx, BfHash
 	else if (auto genericInstTypeRef = BfNodeDynCastExact<BfGenericInstanceTypeRef>(typeRef))
 	{
 		//BfType* type = NULL;
-		BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef);
+		BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef, NULL, ctx->mResolveFlags);
 
 		if (elementTypeDef == NULL)
 		{

+ 12 - 0
IDEHelper/Tests/src/Generics.bf

@@ -173,6 +173,16 @@ namespace Tests
 			delete val;
 		}
 
+		public class ClassE
+		{
+		    public static Self Instance = new ClassE() ~ delete _;
+
+		    public int CreateSystem<T>()
+		    {
+		        return 999;
+		    }
+		}
+
 		[Test]
 		public static void TestBasics()
 		{
@@ -207,6 +217,8 @@ namespace Tests
 			ClassD cd = scope .();
 			ClassD cd2 = scope .();
 			Test.Assert(LibA.LibA2.CheckEq(cd, cd2));
+
+			Test.Assert(ClassE.Instance.CreateSystem<int>() == 999);
 		}
 	}