diff options
| author | Yong He <yonghe@outlook.com> | 2018-01-14 16:22:11 -0500 |
|---|---|---|
| committer | Yong He <yonghe@outlook.com> | 2018-01-14 16:22:11 -0500 |
| commit | d33e6b7475a87d5a62101afc81813e9c9e458a70 (patch) | |
| tree | 7ed6bc875ee0872f35218e7c76d18bf5bcad02ec /source/slang/syntax.h | |
| parent | d4dab2cd3a409411c2d7caed01fc02a0fd3e8450 (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.h | 52 |
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); |
