diff options
Diffstat (limited to 'source/slang/slang-ast-val.cpp')
| -rw-r--r-- | source/slang/slang-ast-val.cpp | 161 |
1 files changed, 159 insertions, 2 deletions
diff --git a/source/slang/slang-ast-val.cpp b/source/slang/slang-ast-val.cpp index 1d5a875dd..e222e86e1 100644 --- a/source/slang/slang-ast-val.cpp +++ b/source/slang/slang-ast-val.cpp @@ -205,7 +205,7 @@ Val* maybeSubstituteGenericParam(Val* paramVal, Decl* paramDecl, SubstitutionSet (*ioDiff)++; return args[argIndex]; } - else if (const auto typeParam = as<GenericTypeParamDecl>(m)) + else if (const auto typeParam = as<GenericTypeParamDeclBase>(m)) { argIndex++; } @@ -272,6 +272,163 @@ void TypeEqualityWitness::_toTextOverride(StringBuilder& out) out << toSlice("TypeEqualityWitness(") << getSub() << toSlice(")"); } +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TypePackSubtypeWitness !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +Val* TypePackSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) +{ + int diff = 0; + ShortList<SubtypeWitness*> newWitnesses; + for (Index i = 0; i < getCount(); i++) + { + auto witness = getWitness(i); + auto newWitness = as<SubtypeWitness>(witness->substituteImpl(astBuilder, subst, &diff)); + newWitnesses.add(newWitness); + } + auto newSub = as<Type>(getSub()->substituteImpl(astBuilder, subst, &diff)); + auto newSup = as<Type>(getSup()->substituteImpl(astBuilder, subst, &diff)); + if (!diff) + return this; + (*ioDiff)++; + return getCurrentASTBuilder()->getSubtypeWitnessPack(newSub, newSup, newWitnesses.getArrayView().arrayView); +} + +Val* TypePackSubtypeWitness::_resolveImplOverride() +{ + int diff = 0; + ShortList<SubtypeWitness*> newWitnesses; + for (Index i = 0; i < getCount(); i++) + { + auto witness = getWitness(i); + auto newWitness = as<SubtypeWitness>(witness->resolve()); + if (witness != newWitness) + diff++; + newWitnesses.add(newWitness); + } + auto newSub = as<Type>(getSub()->resolve()); + if (newSub != getSub()) + diff++; + auto newSup = as<Type>(getSup()->resolve()); + if (newSup != getSup()) + diff++; + + if (!diff) + return this; + return getCurrentASTBuilder()->getSubtypeWitnessPack(newSub, newSup, newWitnesses.getArrayView().arrayView); +} + +void TypePackSubtypeWitness::_toTextOverride(StringBuilder& out) +{ + out << toSlice("Pack("); + for (Index i = 0; i < getCount(); i++) + { + if (i != 0) + out << toSlice(", "); + getWitness(i)->toText(out); + } + out << toSlice(")"); +} + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ExpandSubtypeWitness !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +Val* ExpandSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) +{ + int diff = 0; + auto newSub = as<Type>(getSub()->substituteImpl(astBuilder, subst, &diff)); + auto newSup = as<Type>(getSup()->substituteImpl(astBuilder, subst, &diff)); + if (!diff) + return this; + if (auto subTypePack = as<ConcreteTypePack>(newSub)) + { + // If sub is substituted into a concrete type pack, we should return a + // TypePackSubtypeWitness. + ShortList<SubtypeWitness*> newWitnesses; + for (Index i = 0; i < subTypePack->getTypeCount(); i++) + { + auto elementType = subTypePack->getElementType(i); + subst.packExpansionIndex = i; + auto elementWitness = as<SubtypeWitness>(getPatternTypeWitness()->substituteImpl(astBuilder, subst, &diff)); + auto newWitness = getCurrentASTBuilder()->getExpandSubtypeWitness(elementType, newSup, elementWitness); + newWitnesses.add(as<SubtypeWitness>(newWitness)); + } + (*ioDiff)++; + return getCurrentASTBuilder()->getSubtypeWitnessPack(newSub, newSup, newWitnesses.getArrayView().arrayView); + } + + (*ioDiff)++; + auto newPatternWitness = as<SubtypeWitness>(getPatternTypeWitness()->substituteImpl(astBuilder, subst, &diff)); + return getCurrentASTBuilder()->getExpandSubtypeWitness(newSub, newSup, newPatternWitness); +} + +Val* ExpandSubtypeWitness::_resolveImplOverride() +{ + int diff = 0; + auto newPatternWitness = as<SubtypeWitness>(getPatternTypeWitness()->resolve()); + if (newPatternWitness != getPatternTypeWitness()) + diff++; + auto newSub = as<Type>(getSub()->resolve()); + if (newSub != getSub()) + diff++; + auto newSup = as<Type>(getSup()->resolve()); + if (newSup != getSup()) + diff++; + if (!diff) + return this; + return getCurrentASTBuilder()->getExpandSubtypeWitness(newSub, newSup, newPatternWitness); +} + +void ExpandSubtypeWitness::_toTextOverride(StringBuilder& out) +{ + out << toSlice("ExpandWitness("); + getPatternTypeWitness()->toText(out); + out << toSlice(")"); +} + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EachSubtypeWitness !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +Val* EachSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) +{ + int diff = 0; + auto newPatternWitness = as<SubtypeWitness>(getPatternTypeWitness()->substituteImpl(astBuilder, subst, &diff)); + if (auto witnessPack = as<TypePackSubtypeWitness>(newPatternWitness)) + { + if (subst.packExpansionIndex >= 0 && subst.packExpansionIndex < witnessPack->getCount()) + { + auto newWitness = witnessPack->getWitness(subst.packExpansionIndex); + (*ioDiff)++; + return newWitness; + } + } + auto newSub = as<Type>(getSub()->substituteImpl(astBuilder, subst, &diff)); + auto newSup = as<Type>(getSup()->substituteImpl(astBuilder, subst, &diff)); + if (!diff) + return this; + return getCurrentASTBuilder()->getEachSubtypeWitness(newSub, newSup, newPatternWitness); +} + +Val* EachSubtypeWitness::_resolveImplOverride() +{ + int diff = 0; + auto newPatternWitness = as<SubtypeWitness>(getPatternTypeWitness()->resolve()); + if (newPatternWitness != getPatternTypeWitness()) + diff++; + auto newSub = as<Type>(getSub()->resolve()); + if (newSub != getSub()) + diff++; + auto newSup = as<Type>(getSup()->resolve()); + if (newSup != getSup()) + diff++; + if (!diff) + return this; + return getCurrentASTBuilder()->getEachSubtypeWitness(newSub, newSup, newPatternWitness); +} + +void EachSubtypeWitness::_toTextOverride(StringBuilder& out) +{ + out << toSlice("EachWitness("); + getPatternTypeWitness()->toText(out); + out << toSlice(")"); +} + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DeclaredSubtypeWitness !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Val* DeclaredSubtypeWitness::_resolveImplOverride() @@ -336,7 +493,7 @@ Val* DeclaredSubtypeWitness::_substituteImplOverride(ASTBuilder* astBuilder, Sub } if (found) { - auto ordinaryParamCount = genericDecl->getMembersOfType<GenericTypeParamDecl>().getCount() + + auto ordinaryParamCount = genericDecl->getMembersOfType<GenericTypeParamDeclBase>().getCount() + genericDecl->getMembersOfType<GenericValueParamDecl>().getCount(); if (index + ordinaryParamCount < args.getCount()) { |
