@@ -3375,14 +3375,31 @@ void AbstractStorageDecl::setInvalidBracesRange(SourceRange BracesRange) {
3375
3375
GetSetInfo.setPointer (getSetInfo);
3376
3376
}
3377
3377
3378
+ static Optional<ObjCSelector>
3379
+ getNameFromObjcAttribute (const ObjCAttr *attr, DeclName preferredName) {
3380
+ if (!attr)
3381
+ return None;
3382
+ if (auto name = attr->getName ()) {
3383
+ if (attr->isNameImplicit ()) {
3384
+ // preferredName > implicit name, because implicit name is just cached
3385
+ // actual name.
3386
+ if (!preferredName)
3387
+ return *name;
3388
+ } else {
3389
+ // explicit name > preferred name.
3390
+ return *name;
3391
+ }
3392
+ }
3393
+ return None;
3394
+ }
3395
+
3378
3396
ObjCSelector AbstractStorageDecl::getObjCGetterSelector (
3379
3397
LazyResolver *resolver, Identifier preferredName) const {
3380
3398
// If the getter has an @objc attribute with a name, use that.
3381
3399
if (auto getter = getGetter ()) {
3382
- if (auto objcAttr = getter->getAttrs ().getAttribute <ObjCAttr>()) {
3383
- if ( auto name = objcAttr-> getName ( ))
3400
+ if (auto name = getNameFromObjcAttribute ( getter->getAttrs ().
3401
+ getAttribute<ObjCAttr>(), preferredName ))
3384
3402
return *name;
3385
- }
3386
3403
}
3387
3404
3388
3405
// Subscripts use a specific selector.
@@ -3414,9 +3431,8 @@ ObjCSelector AbstractStorageDecl::getObjCSetterSelector(
3414
3431
auto setter = getSetter ();
3415
3432
auto objcAttr = setter ? setter->getAttrs ().getAttribute <ObjCAttr>()
3416
3433
: nullptr ;
3417
- if (objcAttr) {
3418
- if (auto name = objcAttr->getName ())
3419
- return *name;
3434
+ if (auto name = getNameFromObjcAttribute (objcAttr, DeclName (preferredName))) {
3435
+ return *name;
3420
3436
}
3421
3437
3422
3438
// Subscripts use a specific selector.
@@ -3445,7 +3461,7 @@ ObjCSelector AbstractStorageDecl::getObjCSetterSelector(
3445
3461
auto result = VarDecl::getDefaultObjCSetterSelector (ctx, Name);
3446
3462
3447
3463
// Cache the result, so we don't perform string manipulation again.
3448
- if (objcAttr)
3464
+ if (objcAttr && preferredName. empty () )
3449
3465
const_cast <ObjCAttr *>(objcAttr)->setName (result, /* implicit=*/ true );
3450
3466
3451
3467
return result;
@@ -4228,10 +4244,9 @@ SourceRange AbstractFunctionDecl::getSignatureSourceRange() const {
4228
4244
ObjCSelector AbstractFunctionDecl::getObjCSelector (
4229
4245
LazyResolver *resolver, DeclName preferredName) const {
4230
4246
// If there is an @objc attribute with a name, use that name.
4231
- auto objc = getAttrs ().getAttribute <ObjCAttr>();
4232
- if (objc) {
4233
- if (auto name = objc->getName ())
4234
- return *name;
4247
+ auto *objc = getAttrs ().getAttribute <ObjCAttr>();
4248
+ if (auto name = getNameFromObjcAttribute (objc, preferredName)) {
4249
+ return *name;
4235
4250
}
4236
4251
4237
4252
auto &ctx = getASTContext ();
@@ -4357,7 +4372,7 @@ ObjCSelector AbstractFunctionDecl::getObjCSelector(
4357
4372
4358
4373
// If we did any string manipulation, cache the result. We don't want to
4359
4374
// do that again.
4360
- if (didStringManipulation && objc)
4375
+ if (didStringManipulation && objc && !preferredName )
4361
4376
const_cast <ObjCAttr *>(objc)->setName (result, /* implicit=*/ true );
4362
4377
4363
4378
return result;
0 commit comments