From 4fb3b10b81cf8c976ebd1ebb7fcde7708f022957 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 29 Nov 2023 11:29:14 -0800 Subject: Improve generic type argument inference. (#3370) * Improve generic type argument inference. * Fix. * Fix. --------- Co-authored-by: Yong He --- source/slang/slang-ast-val.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'source/slang/slang-ast-val.cpp') diff --git a/source/slang/slang-ast-val.cpp b/source/slang/slang-ast-val.cpp index e860e1ec6..d1408a3fc 100644 --- a/source/slang/slang-ast-val.cpp +++ b/source/slang/slang-ast-val.cpp @@ -286,6 +286,11 @@ Val* DeclaredSubtypeWitness::_resolveImplOverride() return this; } +ConversionCost DeclaredSubtypeWitness::_getOverloadResolutionCostOverride() +{ + return kConversionCost_GenericParamUpcast; +} + Val* DeclaredSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int * ioDiff) { if (auto genConstraintDeclRef = getDeclRef().as()) @@ -431,6 +436,11 @@ Val* TransitiveSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, S return astBuilder->getTransitiveSubtypeWitness(substSubToMid, substMidToSup); } +ConversionCost TransitiveSubtypeWitness::_getOverloadResolutionCostOverride() +{ + return getSubToMid()->getOverloadResolutionCost() + getMidToSup()->getOverloadResolutionCost(); +} + void TransitiveSubtypeWitness::_toTextOverride(StringBuilder& out) { // Note: we only print the constituent @@ -471,6 +481,17 @@ Val* ExtractFromConjunctionSubtypeWitness::_substituteImplOverride(ASTBuilder* a substSub, substSup, substWitness, getIndexInConjunction()); } +ConversionCost ExtractFromConjunctionSubtypeWitness::_getOverloadResolutionCostOverride() +{ + auto witness = as(getConjunctionWitness()); + if (!witness) + return kConversionCost_None; + auto index = getIndexInConjunction(); + if (index < witness->getComponentCount()) + return witness->getComponentWitness(index)->getOverloadResolutionCost(); + return kConversionCost_None; +} + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ExtractExistentialSubtypeWitness !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! void ExtractExistentialSubtypeWitness::_toTextOverride(StringBuilder& out) @@ -541,6 +562,14 @@ Val* ConjunctionSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, return result; } +ConversionCost ConjunctionSubtypeWitness::_getOverloadResolutionCostOverride() +{ + ConversionCost result = kConversionCost_None; + for (Index i = 0; i < getComponentCount(); i++) + result += getComponentWitness(i)->getOverloadResolutionCost(); + return result; +} + void ExtractFromConjunctionSubtypeWitness::_toTextOverride(StringBuilder& out) { out << "ExtractFromConjunctionSubtypeWitness("; -- cgit v1.2.3