summaryrefslogtreecommitdiffstats
path: root/source/slang/syntax.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/syntax.h')
-rw-r--r--source/slang/syntax.h36
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;