From 24aaa22f7a26e46e46ee1e7b5ee7c0b717799213 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Thu, 3 Sep 2020 10:24:42 -0700 Subject: [PATCH] Fixed error with generic method call on a static field --- IDEHelper/Compiler/BfExprEvaluator.cpp | 2 +- IDEHelper/Compiler/BfModule.h | 2 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 12 +++++++----- IDEHelper/Compiler/BfResolvedTypeUtils.cpp | 2 +- IDEHelper/Tests/src/Generics.bf | 12 ++++++++++++ 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 984d53d5..e70ee8de 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/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); diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index a4fb5cb6..1a8ade29 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/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); diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 163d9b83..60c6346a 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/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; diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 7361f738..326765d0 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -2851,7 +2851,7 @@ int BfResolvedTypeSet::Hash(BfTypeReference* typeRef, LookupContext* ctx, BfHash else if (auto genericInstTypeRef = BfNodeDynCastExact(typeRef)) { //BfType* type = NULL; - BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef); + BfTypeDef* elementTypeDef = ctx->mModule->ResolveGenericInstanceDef(genericInstTypeRef, NULL, ctx->mResolveFlags); if (elementTypeDef == NULL) { diff --git a/IDEHelper/Tests/src/Generics.bf b/IDEHelper/Tests/src/Generics.bf index def1d793..1d533f15 100644 --- a/IDEHelper/Tests/src/Generics.bf +++ b/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() + { + 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() == 999); } }