summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-syntax.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-11-10 13:55:14 -0800
committerGitHub <noreply@github.com>2023-11-10 13:55:14 -0800
commit011d4281647e3a2a3cf0dbdda1fa65cc1b8ed881 (patch)
tree70f91655e86d30529eda0a683e15f378eeae2cb5 /source/slang/slang-syntax.cpp
parentbfd3f39d04047d7a46e75206cd125ed87b3f3f99 (diff)
Cleanup builtin arithmetic interfaces. (#3317)
* wip: clean up IArithmetic * wip. * Cleanup builtin arithmetic interfaces. * Fix. * Fixes. * Fix. * Fix. * Fix. --------- Co-authored-by: Yong He <yhe@nvidia.com>
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:
{