diff options
| author | Yong He <yonghe@outlook.com> | 2022-10-13 13:42:05 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-13 13:42:05 -0700 |
| commit | afa9f4b2786c92e72a563f316e074f62770630cb (patch) | |
| tree | 8b84c53e6ef0eecf7dc16a0ca57055723e2e60a9 /source/slang/slang-ast-val.cpp | |
| parent | 344898b091867e5450a3fa432a207d75255df77a (diff) | |
Fix missing implementations in ConjunctionSubtypeWitness. (#2449)
* Fix missing implementations in ConjunctionSubtypeWitness.
* 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 | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/source/slang/slang-ast-val.cpp b/source/slang/slang-ast-val.cpp index b5291509f..377dee350 100644 --- a/source/slang/slang-ast-val.cpp +++ b/source/slang/slang-ast-val.cpp @@ -558,6 +558,108 @@ Val* TaggedUnionSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, return substWitness; } +bool ConjunctionSubtypeWitness::_equalsValOverride(Val* val) +{ + if (auto other = as<ConjunctionSubtypeWitness>(val)) + { + return other->leftWitness && other->leftWitness->equalsVal(leftWitness) && + other->rightWitness && other->rightWitness->equalsVal(rightWitness); + } + return false; +} + +void ConjunctionSubtypeWitness::_toTextOverride(StringBuilder& out) +{ + out << "ConjunctionSubtypeWitness("; + if (leftWitness) out << leftWitness; + out << ","; + if (rightWitness) out << rightWitness; + out << ")"; +} + +HashCode ConjunctionSubtypeWitness::_getHashCodeOverride() +{ + HashCode result = 0; + if (leftWitness) result = leftWitness->getHashCode(); + if (rightWitness) result = combineHash(result, rightWitness->getHashCode()); + return result; +} + +Val* ConjunctionSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) +{ + int diff = 0; + Val* left = nullptr; + Val* right = nullptr; + + auto substSub = as<Type>(sub->substituteImpl(astBuilder, subst, &diff)); + auto substSup = as<Type>(sup->substituteImpl(astBuilder, subst, &diff)); + + if (leftWitness) + left = leftWitness->substituteImpl(astBuilder, subst, &diff); + if (rightWitness) + right = rightWitness->substituteImpl(astBuilder, subst, &diff); + + *ioDiff += diff; + + if (diff) + { + auto result = astBuilder->create<ConjunctionSubtypeWitness>(); + result->leftWitness = left; + result->rightWitness = right; + result->sub = substSub; + result->sup = substSup; + return result; + } + return this; +} + +bool ExtractFromConjunctionSubtypeWitness::_equalsValOverride(Val* val) +{ + if (auto other = as<ExtractFromConjunctionSubtypeWitness>(val)) + { + return other->conjunctionWitness && other->conjunctionWitness->equalsVal(conjunctionWitness) && + other->indexInConjunction == indexInConjunction; + } + return false; +} + +void ExtractFromConjunctionSubtypeWitness::_toTextOverride(StringBuilder& out) +{ + out << "ExtractFromConjunctionSubtypeWitness("; + if (conjunctionWitness) + out << conjunctionWitness; + out << "," << indexInConjunction; + out << ")"; +} + +HashCode ExtractFromConjunctionSubtypeWitness::_getHashCodeOverride() +{ + return combineHash(indexInConjunction, conjunctionWitness ? conjunctionWitness->getHashCode() : 0); +} + +Val* ExtractFromConjunctionSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) +{ + int diff = 0; + Val* newConjunctionWitness = nullptr; + + auto substSub = as<Type>(sub->substituteImpl(astBuilder, subst, &diff)); + auto substSup = as<Type>(sup->substituteImpl(astBuilder, subst, &diff)); + + if (this->conjunctionWitness) + newConjunctionWitness = conjunctionWitness->substituteImpl(astBuilder, subst, &diff); + *ioDiff += diff; + + if (diff) + { + auto result = astBuilder->create<ExtractFromConjunctionSubtypeWitness>(); + result->conjunctionWitness = newConjunctionWitness; + result->sub = substSub; + result->sup = substSup; + return result; + } + return this; +} + // ModifierVal bool ModifierVal::_equalsValOverride(Val* val) |
