summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-syntax.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-syntax.cpp')
-rw-r--r--source/slang/slang-syntax.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/source/slang/slang-syntax.cpp b/source/slang/slang-syntax.cpp
index d24fd239d..ed2ce048b 100644
--- a/source/slang/slang-syntax.cpp
+++ b/source/slang/slang-syntax.cpp
@@ -245,6 +245,22 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt
return m_obj.as<WitnessTable>();
}
+ RefPtr<WitnessTable> WitnessTable::specialize(ASTBuilder* astBuilder, SubstitutionSet const& subst)
+ {
+ auto newBaseType = baseType->substitute(astBuilder, subst);
+ auto newWitnessedType = witnessedType->substitute(astBuilder, subst);
+ if (newBaseType == baseType && newWitnessedType == witnessedType)
+ return this;
+ RefPtr<WitnessTable> result = new WitnessTable();
+ result->baseType = as<Type>(newBaseType);
+ result->witnessedType = as<Type>(newWitnessedType);
+ for (auto requirement : m_requirements)
+ {
+ auto newRequirement = requirement.value.specialize(astBuilder, subst);
+ result->add(requirement.key, newRequirement);
+ }
+ return result;
+ }
RequirementWitness RequirementWitness::specialize(ASTBuilder* astBuilder, SubstitutionSet const& subst)
{
@@ -256,8 +272,7 @@ Index getFilterCountImpl(const ReflectClassInfo& clsInfo, MemberFilterStyle filt
return RequirementWitness();
case RequirementWitness::Flavor::witnessTable:
- SLANG_ASSERT(!subst);
- return *this;
+ return RequirementWitness(this->getWitnessTable()->specialize(astBuilder, subst));
case RequirementWitness::Flavor::declRef:
{