diff options
| author | Yong He <yongh@outlook.com> | 2018-01-09 13:26:42 -0800 |
|---|---|---|
| committer | Yong He <yonghe@outlook.com> | 2018-01-12 23:55:38 -0500 |
| commit | 4b284daeb0cc3f6df0835befad4326c81abeb374 (patch) | |
| tree | ad8d29e14cc483f2eb66bcae7b0f7ffdfd574b86 /source/slang/syntax.cpp | |
| parent | df6eeb93c1718334779ae328db277cdf7a9d7b04 (diff) | |
Support nested generics
fixes #362
Diffstat (limited to 'source/slang/syntax.cpp')
| -rw-r--r-- | source/slang/syntax.cpp | 61 |
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); + } } |
