diff options
| author | Yong He <yonghe@outlook.com> | 2023-11-29 11:29:14 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-29 11:29:14 -0800 |
| commit | 4fb3b10b81cf8c976ebd1ebb7fcde7708f022957 (patch) | |
| tree | 394a08e5b744fa85ac98c0b8758e994b0aab3a34 /source/slang/slang-ast-val.cpp | |
| parent | 62426e94ef11fd6baa213757f87114ec174b406e (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.cpp | 29 |
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("; |
