From 8f5f06bdb10584e11b5496cbf3bd5566bddc0a33 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 19 Jan 2021 13:12:32 -0800 Subject: [PATCH] Enhanced InferGenericArguments to include generic arg constraints --- IDEHelper/Compiler/BfExprEvaluator.cpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 88d92db1..f85d5f1e 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -608,6 +608,22 @@ bool BfGenericInferContext::InferGenericArguments(BfMethodInstance* methodInstan for (auto ifaceEntry : typeInstance->mInterfaces) InferGenericArgument(methodInstance, ifaceEntry.mInterfaceType, ifaceConstraint, BfIRValue()); } + + if (srcGenericArg->IsGenericParam()) + { + auto genericParamType = (BfGenericParamType*)srcGenericArg; + + BfGenericParamInstance* genericParam = NULL; + if (genericParamType->mGenericParamKind == BfGenericParamKind_Method) + genericParam = methodInstance->mMethodInfoEx->mGenericParams[genericParamType->mGenericParamIdx]; + else + genericParam = mModule->GetGenericParamInstance(genericParamType); + + if (genericParam->mTypeConstraint != NULL) + InferGenericArgument(methodInstance, genericParam->mTypeConstraint, ifaceConstraint, BfIRValue()); + for (auto argIfaceConstraint : genericParam->mInterfaceConstraints) + InferGenericArgument(methodInstance, argIfaceConstraint, ifaceConstraint, BfIRValue()); + } } } @@ -14440,11 +14456,13 @@ BfModuleMethodInstance BfExprEvaluator::GetSelectedMethod(BfAstNode* targetSrc, if (genericArg == NULL) { failed = true; - mModule->Fail(StrFormat("Unable to determine generic argument '%s'", methodDef->mGenericParams[checkGenericIdx]->mName.c_str()).c_str(), targetSrc); + BfError* error = mModule->Fail(StrFormat("Unable to determine generic argument '%s'", methodDef->mGenericParams[checkGenericIdx]->mName.c_str()).c_str(), targetSrc); if ((genericParam->mTypeConstraint != NULL) && (!genericParam->mTypeConstraint->IsUnspecializedType())) genericArg = genericParam->mTypeConstraint; else genericArg = mModule->mContext->mBfObjectType; + if (error != NULL) + mModule->mCompiler->mPassInstance->MoreInfo(StrFormat("See method declaration"), unspecializedMethod->mMethodDef->GetRefNode()); } }