23
23
#include " swift/AST/ForeignInfo.h"
24
24
#include " swift/AST/GenericEnvironment.h"
25
25
#include " swift/AST/ProtocolConformance.h"
26
+ #include " swift/Basic/StringExtras.h"
26
27
#include " swift/SIL/SILModule.h"
27
28
#include " swift/SIL/SILType.h"
28
29
#include " clang/AST/Attr.h"
@@ -1723,19 +1724,12 @@ static SelectorFamily getSelectorFamily(Identifier name) {
1723
1724
StringRef text = name.get ();
1724
1725
while (!text.empty () && text[0 ] == ' _' ) text = text.substr (1 );
1725
1726
1726
- // / Does the given selector start with the given string as a
1727
- // / prefix, in the sense of the selector naming conventions?
1728
- auto hasPrefix = [](StringRef text, StringRef prefix) {
1729
- if (!text.startswith (prefix)) return false ;
1730
- if (text.size () == prefix.size ()) return true ;
1731
- assert (text.size () > prefix.size ());
1732
- return !clang::isLowercase (text[prefix.size ()]);
1733
- };
1727
+ StringRef firstWord = camel_case::getFirstWord (text);
1734
1728
1735
1729
auto result = SelectorFamily::None;
1736
1730
if (false ) /* for #define purposes*/ ;
1737
1731
#define CHECK_PREFIX (LABEL, PREFIX ) \
1738
- else if (hasPrefix (text, PREFIX) ) result = SelectorFamily::LABEL;
1732
+ else if (firstWord == PREFIX) result = SelectorFamily::LABEL;
1739
1733
FOREACH_FAMILY (CHECK_PREFIX)
1740
1734
#undef CHECK_PREFIX
1741
1735
@@ -1744,61 +1738,49 @@ static SelectorFamily getSelectorFamily(Identifier name) {
1744
1738
return result;
1745
1739
}
1746
1740
1747
- // / Get the ObjC selector family a SILDeclRef implicitly belongs to.
1741
+ // / Get the ObjC selector family a foreign SILDeclRef belongs to.
1748
1742
static SelectorFamily getSelectorFamily (SILDeclRef c) {
1743
+ assert (c.isForeign );
1749
1744
switch (c.kind ) {
1750
1745
case SILDeclRef::Kind::Func: {
1751
1746
if (!c.hasDecl ())
1752
1747
return SelectorFamily::None;
1753
1748
1754
1749
auto *FD = cast<FuncDecl>(c.getDecl ());
1755
- auto accessor = dyn_cast<AccessorDecl>(FD);
1756
- if (!accessor)
1757
- return getSelectorFamily (FD->getName ());
1758
-
1759
- switch (accessor->getAccessorKind ()) {
1760
- case AccessorKind::IsGetter:
1761
- // Getter selectors can belong to families if their name begins with the
1762
- // wrong thing.
1763
- if (accessor->getStorage ()->isObjC () || c.isForeign ) {
1764
- auto declName = accessor->getStorage ()->getBaseName ();
1765
- switch (declName.getKind ()) {
1766
- case DeclBaseName::Kind::Normal:
1767
- return getSelectorFamily (declName.getIdentifier ());
1768
- case DeclBaseName::Kind::Subscript:
1769
- return SelectorFamily::None;
1770
- case DeclBaseName::Kind::Destructor:
1771
- return SelectorFamily::None;
1772
- }
1750
+ if (auto accessor = dyn_cast<AccessorDecl>(FD)) {
1751
+ switch (accessor->getAccessorKind ()) {
1752
+ case AccessorKind::IsGetter:
1753
+ case AccessorKind::IsSetter:
1754
+ break ;
1755
+ case AccessorKind::IsWillSet:
1756
+ case AccessorKind::IsDidSet:
1757
+ case AccessorKind::IsAddressor:
1758
+ case AccessorKind::IsMutableAddressor:
1759
+ case AccessorKind::IsMaterializeForSet:
1760
+ llvm_unreachable (" Unexpected AccessorKind of foreign FuncDecl" );
1773
1761
}
1774
- return SelectorFamily::None;
1775
-
1776
- // Other accessors are never selector family members.
1777
- case AccessorKind::IsSetter:
1778
- case AccessorKind::IsWillSet:
1779
- case AccessorKind::IsDidSet:
1780
- case AccessorKind::IsAddressor:
1781
- case AccessorKind::IsMutableAddressor:
1782
- case AccessorKind::IsMaterializeForSet:
1783
- return SelectorFamily::None;
1784
1762
}
1763
+
1764
+ return getSelectorFamily (FD->getObjCSelector ().getSelectorPieces ().front ());
1785
1765
}
1786
1766
case SILDeclRef::Kind::Initializer:
1787
- case SILDeclRef::Kind::IVarInitializer:
1767
+ case SILDeclRef::Kind::IVarInitializer:
1788
1768
return SelectorFamily::Init;
1789
1769
1790
1770
// / Currently IRGen wraps alloc/init methods into Swift constructors
1791
1771
// / with Swift conventions.
1792
1772
case SILDeclRef::Kind::Allocator:
1793
1773
// / These constants don't correspond to method families we care about yet.
1794
- case SILDeclRef::Kind::EnumElement:
1795
1774
case SILDeclRef::Kind::Destroyer:
1796
1775
case SILDeclRef::Kind::Deallocator:
1797
- case SILDeclRef::Kind::GlobalAccessor:
1798
1776
case SILDeclRef::Kind::IVarDestroyer:
1777
+ return SelectorFamily::None;
1778
+
1779
+ case SILDeclRef::Kind::EnumElement:
1780
+ case SILDeclRef::Kind::GlobalAccessor:
1799
1781
case SILDeclRef::Kind::DefaultArgGenerator:
1800
1782
case SILDeclRef::Kind::StoredPropertyInitializer:
1801
- return SelectorFamily::None ;
1783
+ llvm_unreachable ( " Unexpected Kind of foreign SILDeclRef " ) ;
1802
1784
}
1803
1785
1804
1786
llvm_unreachable (" Unhandled SILDeclRefKind in switch." );
0 commit comments