Skip to content

Commit d8546e8

Browse files
committed
Let generated availability attributes of initializers of subclasses inherit the message and renaming from the initializer of the superclass
1 parent 5b38f3d commit d8546e8

File tree

2 files changed

+64
-17
lines changed

2 files changed

+64
-17
lines changed

lib/AST/Availability.cpp

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,14 @@
1414
//
1515
//===----------------------------------------------------------------------===//
1616

17+
#include "swift/AST/Availability.h"
1718
#include "swift/AST/ASTContext.h"
1819
#include "swift/AST/Attr.h"
1920
#include "swift/AST/Decl.h"
20-
#include "swift/AST/Types.h"
21-
#include "swift/AST/Availability.h"
2221
#include "swift/AST/PlatformKind.h"
2322
#include "swift/AST/TypeWalker.h"
23+
#include "swift/AST/Types.h"
24+
#include "llvm/ADT/SmallSet.h"
2425
#include <map>
2526

2627
using namespace swift;
@@ -95,10 +96,11 @@ static void mergeWithInferredAvailability(const AvailableAttr *Attr,
9596

9697
/// Create an implicit availability attribute for the given platform
9798
/// and with the inferred availability.
98-
static AvailableAttr *
99-
createAvailableAttr(PlatformKind Platform,
100-
const InferredAvailability &Inferred,
101-
ASTContext &Context) {
99+
static AvailableAttr *createAvailableAttr(PlatformKind Platform,
100+
const InferredAvailability &Inferred,
101+
StringRef Message, StringRef Rename,
102+
ValueDecl *RenameDecl,
103+
ASTContext &Context) {
102104

103105
llvm::VersionTuple Introduced =
104106
Inferred.Introduced.getValueOr(llvm::VersionTuple());
@@ -107,21 +109,27 @@ createAvailableAttr(PlatformKind Platform,
107109
llvm::VersionTuple Obsoleted =
108110
Inferred.Obsoleted.getValueOr(llvm::VersionTuple());
109111

110-
return new (Context) AvailableAttr(
111-
SourceLoc(), SourceRange(), Platform,
112-
/*Message=*/StringRef(),
113-
/*Rename=*/StringRef(), /*RenameDecl=*/nullptr,
114-
Introduced, /*IntroducedRange=*/SourceRange(),
115-
Deprecated, /*DeprecatedRange=*/SourceRange(),
116-
Obsoleted, /*ObsoletedRange=*/SourceRange(),
117-
Inferred.PlatformAgnostic, /*Implicit=*/true,
118-
Inferred.IsSPI);
112+
return new (Context)
113+
AvailableAttr(SourceLoc(), SourceRange(), Platform,
114+
Message, Rename, RenameDecl,
115+
Introduced, /*IntroducedRange=*/SourceRange(),
116+
Deprecated, /*DeprecatedRange=*/SourceRange(),
117+
Obsoleted, /*ObsoletedRange=*/SourceRange(),
118+
Inferred.PlatformAgnostic, /*Implicit=*/true,
119+
Inferred.IsSPI);
119120
}
120121

121122
void AvailabilityInference::applyInferredAvailableAttrs(
122123
Decl *ToDecl, ArrayRef<const Decl *> InferredFromDecls,
123124
ASTContext &Context) {
124125

126+
// Let the new AvailabilityAttr inherit that message and rename.
127+
// The first encountered message / rename will win; this matches the behaviour
128+
// of diagnostics for 'non-inherited' AvailabilityAttrs.
129+
StringRef Message;
130+
StringRef Rename;
131+
ValueDecl *RenameDecl = nullptr;
132+
125133
// Iterate over the declarations and infer required availability on
126134
// a per-platform basis.
127135
std::map<PlatformKind, InferredAvailability> Inferred;
@@ -132,14 +140,24 @@ void AvailabilityInference::applyInferredAvailableAttrs(
132140
continue;
133141

134142
mergeWithInferredAvailability(AvAttr, Inferred[AvAttr->Platform]);
143+
144+
if (Message.empty() && !AvAttr->Message.empty())
145+
Message = AvAttr->Message;
146+
147+
if (Rename.empty() && !AvAttr->Rename.empty()) {
148+
Rename = AvAttr->Rename;
149+
RenameDecl = AvAttr->RenameDecl;
150+
}
135151
}
136152
}
137153

138154
// Create an availability attribute for each observed platform and add
139155
// to ToDecl.
140156
DeclAttributes &Attrs = ToDecl->getAttrs();
141157
for (auto &Pair : Inferred) {
142-
auto *Attr = createAvailableAttr(Pair.first, Pair.second, Context);
158+
auto *Attr = createAvailableAttr(Pair.first, Pair.second, Message,
159+
Rename, RenameDecl, Context);
160+
143161
Attrs.add(Attr);
144162
}
145163
}

test/attr/attr_availability.swift

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,15 @@ class DeprecatedInitBase {
601601
}
602602

603603
init(testSuper: Int) {}
604+
605+
@available(*, deprecated, renamed: "init(new:)")
606+
@available(*, deprecated, renamed: "init(new:)")
607+
init(multipleEqualAvailabilityAttributes: Int) {}
608+
609+
@available(*, deprecated, renamed: "init(old:)")
610+
@available(*, deprecated, renamed: "init(testSuper:)")
611+
@available(*, deprecated, renamed: "init(new:)")
612+
init(multipleUnequalAvailabilityAttributes: Int) {}
604613
}
605614

606615
class DeprecatedInitSub1: DeprecatedInitBase {
@@ -611,7 +620,27 @@ class DeprecatedInitSub1: DeprecatedInitBase {
611620

612621
class DeprecatedInitSub2: DeprecatedInitBase { }
613622

614-
_ = DeprecatedInitSub2(old: 0) // expected-warning {{'init(old:)' is deprecated}}
623+
_ = DeprecatedInitBase(old: 0) // expected-warning {{'init(old:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{24-27=new}}
624+
_ = DeprecatedInitBase.init(old: 0) // expected-warning {{'init(old:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{29-32=new}}
625+
let _: DeprecatedInitBase = .init(old: 0) // expected-warning {{'init(old:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{35-38=new}}
626+
_ = DeprecatedInitSub2(old: 0) // expected-warning {{'init(old:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{24-27=new}}
627+
_ = DeprecatedInitSub2.init(old: 0) // expected-warning {{'init(old:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{29-32=new}}
628+
let _: DeprecatedInitSub2 = .init(old: 0) // expected-warning {{'init(old:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{35-38=new}}
629+
630+
_ = DeprecatedInitBase(multipleEqualAvailabilityAttributes: 0) // expected-warning {{'init(multipleEqualAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{24-59=new}}
631+
_ = DeprecatedInitBase.init(multipleEqualAvailabilityAttributes: 0) // expected-warning {{'init(multipleEqualAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{29-64=new}}
632+
let _: DeprecatedInitBase = .init(multipleEqualAvailabilityAttributes: 0) // expected-warning {{'init(multipleEqualAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{35-70=new}}
633+
_ = DeprecatedInitSub2(multipleEqualAvailabilityAttributes: 0) // expected-warning {{'init(multipleEqualAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{24-59=new}}
634+
_ = DeprecatedInitSub2.init(multipleEqualAvailabilityAttributes: 0) // expected-warning {{'init(multipleEqualAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{29-64=new}}
635+
let _: DeprecatedInitSub2 = .init(multipleEqualAvailabilityAttributes: 0) // expected-warning {{'init(multipleEqualAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{35-70=new}}
636+
637+
_ = DeprecatedInitBase(multipleUnequalAvailabilityAttributes: 0) // expected-warning {{'init(multipleUnequalAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{24-61=new}}
638+
_ = DeprecatedInitBase.init(multipleUnequalAvailabilityAttributes: 0) // expected-warning {{'init(multipleUnequalAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{29-66=new}}
639+
let _: DeprecatedInitBase = .init(multipleUnequalAvailabilityAttributes: 0) // expected-warning {{'init(multipleUnequalAvailabilityAttributes:)' is deprecated: replaced by 'init(new:)'}} expected-note {{use 'init(new:)' instead}} {{35-72=new}}
640+
_ = DeprecatedInitSub2(multipleUnequalAvailabilityAttributes: 0) // expected-warning {{'init(multipleUnequalAvailabilityAttributes:)' is deprecated}} expected-note {{use 'init(new:)' instead}} {{24-61=new}}
641+
_ = DeprecatedInitSub2.init(multipleUnequalAvailabilityAttributes: 0) // expected-warning {{'init(multipleUnequalAvailabilityAttributes:)' is deprecated}} expected-note {{use 'init(new:)' instead}} {{29-66=new}}
642+
let _: DeprecatedInitSub2 = .init(multipleUnequalAvailabilityAttributes: 0) // expected-warning {{'init(multipleUnequalAvailabilityAttributes:)' is deprecated}} expected-note {{use 'init(new:)' instead}} {{35-72=new}}
643+
615644

616645
class Base {
617646
@available(*, unavailable)

0 commit comments

Comments
 (0)