diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/IdentifierTable.h | 3 | ||||
-rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 10 | ||||
-rw-r--r-- | clang/lib/Basic/IdentifierTable.cpp | 6 | ||||
-rw-r--r-- | clang/test/Misc/ast-print-objectivec.m | 10 |
4 files changed, 26 insertions, 3 deletions
diff --git a/clang/include/clang/Basic/IdentifierTable.h b/clang/include/clang/Basic/IdentifierTable.h index 10a02514537..9a338735181 100644 --- a/clang/include/clang/Basic/IdentifierTable.h +++ b/clang/include/clang/Basic/IdentifierTable.h @@ -825,6 +825,9 @@ public: static Selector constructSetterSelector(IdentifierTable &Idents, SelectorTable &SelTable, const IdentifierInfo *Name); + + /// Return the property name for the given setter selector. + static std::string getPropertyNameFromSetterSelector(Selector Sel); }; /// DeclarationNameExtra - Common base of the MultiKeywordSelector, diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index dc6cc160715..38ec6632e78 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -1406,9 +1406,13 @@ void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { OS << Node->getClassReceiver()->getName() << "."; } - if (Node->isImplicitProperty()) - Node->getImplicitPropertyGetter()->getSelector().print(OS); - else + if (Node->isImplicitProperty()) { + if (const auto *Getter = Node->getImplicitPropertyGetter()) + Getter->getSelector().print(OS); + else + OS << SelectorTable::getPropertyNameFromSetterSelector( + Node->getImplicitPropertySetter()->getSelector()); + } else OS << Node->getExplicitProperty()->getName(); } diff --git a/clang/lib/Basic/IdentifierTable.cpp b/clang/lib/Basic/IdentifierTable.cpp index ec9ca7616cb..37703ca776d 100644 --- a/clang/lib/Basic/IdentifierTable.cpp +++ b/clang/lib/Basic/IdentifierTable.cpp @@ -645,6 +645,12 @@ SelectorTable::constructSetterSelector(IdentifierTable &Idents, return SelTable.getUnarySelector(SetterName); } +std::string SelectorTable::getPropertyNameFromSetterSelector(Selector Sel) { + StringRef Name = Sel.getNameForSlot(0); + assert(Name.startswith("set") && "invalid setter name"); + return (Twine(toLowercase(Name[3])) + Name.drop_front(4)).str(); +} + size_t SelectorTable::getTotalMemory() const { SelectorTableImpl &SelTabImpl = getSelectorTableImpl(Impl); return SelTabImpl.Allocator.getTotalMemory(); diff --git a/clang/test/Misc/ast-print-objectivec.m b/clang/test/Misc/ast-print-objectivec.m index eb1b4696105..05a0a5d4aa7 100644 --- a/clang/test/Misc/ast-print-objectivec.m +++ b/clang/test/Misc/ast-print-objectivec.m @@ -50,3 +50,13 @@ struct __attribute__((objc_bridge_related(C1,,))) S1; // CHECK: @class C1; // CHECK: struct __attribute__((objc_bridge_related(C1, , ))) S1; + +@interface ImplicitPropertyWithSetterOnly + +- (void)setX:(int)x; + +@end + +void printImplicitPropertyWithSetterOnly(ImplicitPropertyWithSetterOnly *x) { + x.x = 313; // CHECK: x.x = 313; +} |