@@ -62,7 +62,8 @@ parseObjCSelector(swift::ASTContext &ctx, llvm::StringRef string) {
62
62
63
63
namespace swift {
64
64
65
- AccessNoteDeclName::AccessNoteDeclName () : parentNames(), name() { }
65
+ AccessNoteDeclName::AccessNoteDeclName ()
66
+ : parentNames(), name(), accessorKind(None) { }
66
67
67
68
AccessNoteDeclName::AccessNoteDeclName (ASTContext &ctx, StringRef str) {
68
69
auto parsedName = parseDeclName (str);
@@ -73,6 +74,13 @@ AccessNoteDeclName::AccessNoteDeclName(ASTContext &ctx, StringRef str) {
73
74
parentNames.push_back (ctx.getIdentifier (first));
74
75
}
75
76
77
+ if (parsedName.IsGetter )
78
+ accessorKind = AccessorKind::Get;
79
+ else if (parsedName.IsSetter )
80
+ accessorKind = AccessorKind::Set;
81
+ else
82
+ accessorKind = None;
83
+
76
84
name = parsedName.formDeclName (ctx);
77
85
78
86
// FIXME: parseDeclName() doesn't handle the special `subscript` name.
@@ -84,10 +92,20 @@ AccessNoteDeclName::AccessNoteDeclName(ASTContext &ctx, StringRef str) {
84
92
}
85
93
86
94
bool AccessNoteDeclName::matches (ValueDecl *VD) const {
95
+ // These are normally just `VD` and `name`, but not for accessors.
87
96
auto lookupVD = VD;
88
- if (auto accessor = dyn_cast<AccessorDecl>(VD))
89
- VD = accessor->getStorage ();
90
97
98
+ // First, we check if the accessor-ness of `VD` matches the accessor-ness of
99
+ // the name, and update `lookupVD` if necessary.
100
+ if (auto accessor = dyn_cast<AccessorDecl>(VD)) {
101
+ if (!accessorKind || *accessorKind != accessor->getAccessorKind ())
102
+ return false ;
103
+ lookupVD = accessor->getStorage ();
104
+ }
105
+ else if (accessorKind.hasValue ())
106
+ return false ;
107
+
108
+ // Check that `name` matches `lookupVD`.
91
109
if (!lookupVD->getName ().matchesRef (name))
92
110
return false ;
93
111
@@ -125,6 +143,9 @@ bool AccessNoteDeclName::empty() const {
125
143
}
126
144
127
145
void AccessNoteDeclName::print (llvm::raw_ostream &os) const {
146
+ if (accessorKind)
147
+ os << getAccessorLabel (*accessorKind) << " ter:" ;
148
+
128
149
for (auto parentName : parentNames)
129
150
os << parentName << ' .' ;
130
151
name.print (os, /* skipEmptyArgumentNames=*/ false );
@@ -259,7 +280,7 @@ StringRef MappingTraits<AccessNote>::validate(IO &io, AccessNote ¬e) {
259
280
if (!note.ObjC )
260
281
note.ObjC = true ;
261
282
else if (!*note.ObjC )
262
- return " cannot have an 'ObjCName' if 'ObjC' is false" ;
283
+ return " cannot have an 'ObjCName' if 'ObjC' is false" ;
263
284
}
264
285
265
286
return " " ;
0 commit comments