summaryrefslogtreecommitdiff
path: root/source/slang/syntax.h
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2018-01-14 16:22:11 -0500
committerYong He <yonghe@outlook.com>2018-01-14 16:22:11 -0500
commitd33e6b7475a87d5a62101afc81813e9c9e458a70 (patch)
tree7ed6bc875ee0872f35218e7c76d18bf5bcad02ec /source/slang/syntax.h
parentd4dab2cd3a409411c2d7caed01fc02a0fd3e8450 (diff)
allow extension of a concrete type to implement additional interface
Also support the scenario that the extension declares conformance to interface I, and a method M in I is already supported by the base implementation.
Diffstat (limited to 'source/slang/syntax.h')
-rw-r--r--source/slang/syntax.h52
1 files changed, 46 insertions, 6 deletions
diff --git a/source/slang/syntax.h b/source/slang/syntax.h
index 375eb5f1c..ab26b1f6d 100644
--- a/source/slang/syntax.h
+++ b/source/slang/syntax.h
@@ -978,6 +978,30 @@ namespace Slang
{
return items.Count() > 1 ? items[0].declRef.GetName() : item.declRef.GetName();
}
+ LookupResultItem* begin()
+ {
+ if (isValid())
+ {
+ if (isOverloaded())
+ return items.begin();
+ else
+ return &item;
+ }
+ else
+ return nullptr;
+ }
+ LookupResultItem* end()
+ {
+ if (isValid())
+ {
+ if (isOverloaded())
+ return items.end();
+ else
+ return &item + 1;
+ }
+ else
+ return nullptr;
+ }
};
struct SemanticsVisitor;
@@ -1085,6 +1109,27 @@ namespace Slang
return FilteredMemberRefList<T>(declRef.getDecl()->Members, declRef.substitutions);
}
+ inline ExtensionDecl* GetCandidateExtensions(DeclRef<AggTypeDecl> const& declRef)
+ {
+ return declRef.getDecl()->candidateExtensions;
+ }
+
+ template<typename T>
+ inline FilteredMemberRefList<T> getMembersOfTypeWithExt(DeclRef<ContainerDecl> const& declRef)
+ {
+ auto rs = getMembersOfType<T>(declRef);
+ 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);
+ }
+ }
+ return rs;
+ }
+
+
inline RefPtr<Type> GetType(DeclRef<VarDeclBase> const& declRef)
{
return declRef.Substitute(declRef.getDecl()->type.Ptr());
@@ -1099,12 +1144,7 @@ namespace Slang
{
return declRef.Substitute(declRef.getDecl()->targetType.Ptr());
}
-
- inline ExtensionDecl* GetCandidateExtensions(DeclRef<AggTypeDecl> const& declRef)
- {
- return declRef.getDecl()->candidateExtensions;
- }
-
+
inline FilteredMemberRefList<StructField> GetFields(DeclRef<StructDecl> const& declRef)
{
return getMembersOfType<StructField>(declRef);