diff options
Diffstat (limited to 'source/slang/syntax.h')
| -rw-r--r-- | source/slang/syntax.h | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/source/slang/syntax.h b/source/slang/syntax.h index ab26b1f6d..93e421977 100644 --- a/source/slang/syntax.h +++ b/source/slang/syntax.h @@ -1098,32 +1098,52 @@ namespace Slang // Declarations // + inline ExtensionDecl* GetCandidateExtensions(DeclRef<AggTypeDecl> const& declRef) + { + return declRef.getDecl()->candidateExtensions; + } + inline FilteredMemberRefList<Decl> getMembers(DeclRef<ContainerDecl> const& declRef) { return FilteredMemberRefList<Decl>(declRef.getDecl()->Members, declRef.substitutions); } - template<typename T> - inline FilteredMemberRefList<T> getMembersOfType(DeclRef<ContainerDecl> const& declRef) + // TODO: change this to return a lazy list instead of constructing actual list + inline List<DeclRef<Decl>> getMembersWithExt(DeclRef<ContainerDecl> const& declRef) { - return FilteredMemberRefList<T>(declRef.getDecl()->Members, declRef.substitutions); + List<DeclRef<Decl>> rs; + for (auto d : FilteredMemberRefList<Decl>(declRef.getDecl()->Members, declRef.substitutions)) + rs.Add(d); + if (auto aggDeclRef = declRef.As<AggTypeDecl>()) + { + for (auto ext = GetCandidateExtensions(aggDeclRef); ext; ext = ext->nextCandidateExtension) + { + for (auto mbr : getMembers(DeclRef<ContainerDecl>(ext, declRef.substitutions))) + rs.Add(mbr); + } + } + return rs; } - inline ExtensionDecl* GetCandidateExtensions(DeclRef<AggTypeDecl> const& declRef) + template<typename T> + inline FilteredMemberRefList<T> getMembersOfType(DeclRef<ContainerDecl> const& declRef) { - return declRef.getDecl()->candidateExtensions; + return FilteredMemberRefList<T>(declRef.getDecl()->Members, declRef.substitutions); } template<typename T> - inline FilteredMemberRefList<T> getMembersOfTypeWithExt(DeclRef<ContainerDecl> const& declRef) + inline List<DeclRef<T>> getMembersOfTypeWithExt(DeclRef<ContainerDecl> const& declRef) { - auto rs = getMembersOfType<T>(declRef); + List<DeclRef<T>> rs; + for (auto d : getMembersOfType<T>(declRef)) + rs.Add(d); if (auto aggDeclRef = declRef.As<AggTypeDecl>()) { for (auto ext = GetCandidateExtensions(aggDeclRef); ext; ext = ext->nextCandidateExtension) { auto extMembers = getMembersOfType<T>(DeclRef<ContainerDecl>(ext, declRef.substitutions)); - const_cast<List<RefPtr<Decl>>&>(rs.decls).AddRange(extMembers.decls); + for (auto mbr : extMembers) + rs.Add(mbr); } } return rs; |
