From 4b284daeb0cc3f6df0835befad4326c81abeb374 Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 9 Jan 2018 13:26:42 -0800 Subject: Support nested generics fixes #362 --- source/slang/syntax.cpp | 61 +++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 22 deletions(-) (limited to 'source/slang/syntax.cpp') 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(); 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(); if (thisTypeSubstitution) rs.thisTypeSubstitution = thisTypeSubstitution->SubstituteImpl(subst, ioDiff).As(); - 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 cloneSubstitutionNonRecursive(RefPtr subst) + { + if (!subst) + return nullptr; + if (auto genSubst = dynamic_cast(subst.Ptr())) + { + RefPtr newSubst = new GenericSubstitution(); + newSubst->genericDecl = genSubst->genericDecl; + + for (auto arg : genSubst->args) + { + newSubst->args.Add(arg); + } + return newSubst; + } + else if (auto thisSubst = dynamic_cast(subst.Ptr())) + { + RefPtr newSubst = new ThisTypeSubstitution(); + newSubst->sourceType = thisSubst->sourceType; + return newSubst; + } + else if (auto genTypeSubst = dynamic_cast(subst.Ptr())) + { + RefPtr 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); + } } -- cgit v1.2.3