summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ast-val.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-11-29 11:29:14 -0800
committerGitHub <noreply@github.com>2023-11-29 11:29:14 -0800
commit4fb3b10b81cf8c976ebd1ebb7fcde7708f022957 (patch)
tree394a08e5b744fa85ac98c0b8758e994b0aab3a34 /source/slang/slang-ast-val.cpp
parent62426e94ef11fd6baa213757f87114ec174b406e (diff)
Improve generic type argument inference. (#3370)
* Improve generic type argument inference. * Fix. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ast-val.cpp')
-rw-r--r--source/slang/slang-ast-val.cpp29
1 files changed, 29 insertions, 0 deletions
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<GenericTypeConstraintDecl>())
@@ -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<ConjunctionSubtypeWitness>(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(";