summaryrefslogtreecommitdiffstats
path: root/source/slang/syntax.cpp
diff options
context:
space:
mode:
authorYong He <yongh@outlook.com>2018-01-09 13:26:42 -0800
committerYong He <yonghe@outlook.com>2018-01-12 23:55:38 -0500
commit4b284daeb0cc3f6df0835befad4326c81abeb374 (patch)
treead8d29e14cc483f2eb66bcae7b0f7ffdfd574b86 /source/slang/syntax.cpp
parentdf6eeb93c1718334779ae328db277cdf7a9d7b04 (diff)
Support nested generics
fixes #362
Diffstat (limited to 'source/slang/syntax.cpp')
-rw-r--r--source/slang/syntax.cpp61
1 files changed, 39 insertions, 22 deletions
diff --git a/source/slang/syntax.cpp b/source/slang/syntax.cpp
index c63dfc781..cdcb623ff 100644
--- a/source/slang/syntax.cpp
+++ b/source/slang/syntax.cpp
@@ -1194,6 +1194,7 @@ void Type::accept(IValVisitor* visitor, void* extra)
auto substSubst = new GenericSubstitution();
substSubst->genericDecl = genericDecl;
substSubst->args = substArgs;
+ substSubst->outer = outerSubst.As<GenericSubstitution>();
return substSubst;
}
@@ -1897,27 +1898,9 @@ void Type::accept(IValVisitor* visitor, void* extra)
SubstitutionSet substituteSubstitutions(SubstitutionSet oldSubst, SubstitutionSet subst, int * ioDiff)
{
- if (oldSubst)
- oldSubst = oldSubst.substituteImpl(subst, ioDiff);
-
- // if oldSubst does not have ThisTypeSubst (which means `this_type` is free variable)
- // and subst has a ThisTypeSubst (which means `this_type` is bound to a type),
- // then copy that ThisTypeSubst over (to bind the this_type to the specified type)
- SubstitutionSet newSubst = oldSubst;
- insertGlobalGenericSubstitutions(newSubst, subst, ioDiff);
- /*if (!hasThisTypeSubstitutions(oldSubst))
- {
- auto thisTypeSubst = findThisTypeSubst(subst);
- if (thisTypeSubst)
- {
- auto cpyThisTypeSubst = new ThisTypeSubstitution();
- cpyThisTypeSubst->sourceType = thisTypeSubst->sourceType;
- insertSubstAtBottom(newSubst, cpyThisTypeSubst);
- *ioDiff = 1;
- }
- }*/
- return newSubst;
+ return oldSubst.substituteImpl(subst, ioDiff);
}
+
bool SubstitutionSet::Equals(SubstitutionSet substSet) const
{
if (genericSubstitutions)
@@ -1951,8 +1934,8 @@ void Type::accept(IValVisitor* visitor, void* extra)
rs.globalGenParamSubstitutions = globalGenParamSubstitutions->SubstituteImpl(subst, ioDiff).As<GlobalGenericParamSubstitution>();
if (thisTypeSubstitution)
rs.thisTypeSubstitution = thisTypeSubstitution->SubstituteImpl(subst, ioDiff).As<ThisTypeSubstitution>();
- else
- rs.thisTypeSubstitution = subst.thisTypeSubstitution;
+
+ insertGlobalGenericSubstitutions(rs, subst, ioDiff);
return rs;
}
int SubstitutionSet::GetHashCode() const
@@ -1966,5 +1949,39 @@ void Type::accept(IValVisitor* visitor, void* extra)
rs = combineHash(rs, globalGenParamSubstitutions->GetHashCode());
return rs;
}
+
+ RefPtr<Substitutions> cloneSubstitutionNonRecursive(RefPtr<Substitutions> subst)
+ {
+ if (!subst)
+ return nullptr;
+ if (auto genSubst = dynamic_cast<GenericSubstitution*>(subst.Ptr()))
+ {
+ RefPtr<GenericSubstitution> newSubst = new GenericSubstitution();
+ newSubst->genericDecl = genSubst->genericDecl;
+
+ for (auto arg : genSubst->args)
+ {
+ newSubst->args.Add(arg);
+ }
+ return newSubst;
+ }
+ else if (auto thisSubst = dynamic_cast<ThisTypeSubstitution*>(subst.Ptr()))
+ {
+ RefPtr<ThisTypeSubstitution> newSubst = new ThisTypeSubstitution();
+ newSubst->sourceType = thisSubst->sourceType;
+ return newSubst;
+ }
+ else if (auto genTypeSubst = dynamic_cast<GlobalGenericParamSubstitution*>(subst.Ptr()))
+ {
+ RefPtr<GlobalGenericParamSubstitution> newSubst = new GlobalGenericParamSubstitution();
+ newSubst->actualType = genTypeSubst->actualType;
+ newSubst->paramDecl = genTypeSubst->paramDecl;
+ newSubst->witnessTables = genTypeSubst->witnessTables;
+ return newSubst;
+ }
+ else
+ SLANG_UNREACHABLE("unimplemented cloneSubstitution");
+ UNREACHABLE_RETURN(nullptr);
+ }
}