Skip to content

Commit bc98209

Browse files
committed
AST/Sema: Adopt AvailabilityDomain arguments in even more diagnostics.
Update potential unavailability diagnostics to take `AvailabilityDomain` instead of a platform string.
1 parent c89df2f commit bc98209

File tree

9 files changed

+50
-43
lines changed

9 files changed

+50
-43
lines changed

include/swift/AST/ASTContext.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ namespace swift {
7272
class AbstractFunctionDecl;
7373
class ASTContext;
7474
enum class Associativity : unsigned char;
75+
class AvailabilityDomain;
7576
class AvailabilityMacroMap;
7677
class AvailabilityRange;
7778
class BoundGenericType;
@@ -1596,9 +1597,10 @@ class ASTContext final {
15961597
public:
15971598
clang::DarwinSDKInfo *getDarwinSDKInfo() const;
15981599

1599-
/// Returns the string to use in diagnostics when printing the platform being
1600-
/// targetted.
1601-
StringRef getTargetPlatformStringForDiagnostics() const;
1600+
/// Returns the availability domain corresponding to the target triple. If
1601+
/// there isn't a `PlatformKind` associated with the current target triple,
1602+
/// then this returns the universal domain (`*`).
1603+
AvailabilityDomain getTargetAvailabilityDomain() const;
16021604
};
16031605

16041606
} // end namespace swift

include/swift/AST/DiagnosticsIRGen.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ ERROR(attr_objc_implementation_resilient_property_deployment_target, none,
7575
"'@implementation' on %0 %1 does not support stored properties whose "
7676
"size can change due to library evolution; raise the minimum deployment "
7777
"target to %0 %2 or store this value in an object or 'any' type",
78-
(StringRef, const llvm::VersionTuple, const llvm::VersionTuple))
78+
(AvailabilityDomain, const llvm::VersionTuple, const llvm::VersionTuple))
7979

8080
ERROR(unable_to_load_pass_plugin,none,
8181
"unable to load plugin '%0': '%1'", (StringRef, StringRef))

include/swift/AST/DiagnosticsSema.def

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,7 +1841,7 @@ ERROR(attr_objc_implementation_no_conformance,none,
18411841
ERROR(attr_objc_implementation_raise_minimum_deployment_target,none,
18421842
"'@implementation' of an Objective-C class requires a minimum deployment "
18431843
"target of at least %0 %1",
1844-
(StringRef, llvm::VersionTuple))
1844+
(AvailabilityDomain, llvm::VersionTuple))
18451845
ERROR(attr_implementation_requires_language,none,
18461846
"'@implementation' used without specifying the language being "
18471847
"implemented",
@@ -6383,7 +6383,7 @@ ERROR(objc_in_generic_extension,none,
63836383
"cannot contain '@objc' members", (bool))
63846384
ERROR(objc_in_resilient_extension,none,
63856385
"'@objc' %0 in extension of subclass of %1 requires %2 %3",
6386-
(DescriptiveDeclKind, Identifier, StringRef, llvm::VersionTuple))
6386+
(DescriptiveDeclKind, Identifier, AvailabilityDomain, llvm::VersionTuple))
63876387
ERROR(objc_operator, none,
63886388
"operator methods cannot be declared @objc", ())
63896389
ERROR(objc_operator_proto, none,
@@ -6394,7 +6394,7 @@ ERROR(objc_for_generic_class,none,
63946394
"because they are not directly visible from Objective-C", ())
63956395
ERROR(objc_for_resilient_class,none,
63966396
"explicit '@objc' on subclass of %0 requires %1 %2",
6397-
(Identifier, StringRef, llvm::VersionTuple))
6397+
(Identifier, AvailabilityDomain, llvm::VersionTuple))
63986398
ERROR(objc_getter_for_nonobjc_property,none,
63996399
"'@objc' getter for non-'@objc' property", ())
64006400
ERROR(objc_getter_for_nonobjc_subscript,none,
@@ -6825,25 +6825,26 @@ ERROR(availability_decl_more_than_enclosing, none,
68256825

68266826
NOTE(availability_implicit_decl_here, none,
68276827
"%0 implicitly declared here with availability of %1 %2 or newer",
6828-
(DescriptiveDeclKind, StringRef, llvm::VersionTuple))
6828+
(DescriptiveDeclKind, AvailabilityDomain, llvm::VersionTuple))
68296829

68306830
NOTE(availability_decl_more_than_enclosing_here, none,
68316831
"enclosing scope requires availability of %0 %1 or newer",
6832-
(StringRef, llvm::VersionTuple))
6832+
(AvailabilityDomain, llvm::VersionTuple))
68336833

68346834
ERROR(availability_decl_only_version_newer, none,
68356835
"%0 is only available in %1 %2 or newer",
6836-
(const ValueDecl *, StringRef, llvm::VersionTuple))
6836+
(const ValueDecl *, AvailabilityDomain, llvm::VersionTuple))
68376837

68386838
ERROR(availability_decl_only_version_newer_for_clients, none,
68396839
"%0 is only available in %1 %2 or newer; clients of %3 may have a lower"
68406840
" deployment target",
6841-
(const ValueDecl *, StringRef, llvm::VersionTuple, ModuleDecl *))
6841+
(const ValueDecl *, AvailabilityDomain, llvm::VersionTuple, ModuleDecl *))
68426842

68436843
WARNING(availability_decl_only_version_newer_for_clients_warn, none,
68446844
"%0 is only available in %1 %2 or newer; clients of %3 may have a lower"
68456845
" deployment target",
6846-
(const ValueDecl *, StringRef, llvm::VersionTuple, ModuleDecl *))
6846+
(const ValueDecl *, AvailabilityDomain, llvm::VersionTuple,
6847+
ModuleDecl *))
68476848

68486849
ERROR(availability_opaque_types_only_version_newer, none,
68496850
"'some' return types are only available in %0 %1 or newer",
@@ -6893,7 +6894,7 @@ FIXIT(insert_available_attr,
68936894

68946895
ERROR(availability_inout_accessor_only_version_newer, none,
68956896
"cannot pass as inout because %0 is only available in %1 %2 or newer",
6896-
(const ValueDecl *, StringRef, llvm::VersionTuple))
6897+
(const ValueDecl *, AvailabilityDomain, llvm::VersionTuple))
68976898

68986899
ERROR(availability_query_required_for_platform, none,
68996900
"condition required for target platform '%0'", (StringRef))
@@ -6939,7 +6940,8 @@ WARNING(availability_enum_element_no_potential_warn,
69396940

69406941
ERROR(availability_protocol_requires_version,
69416942
none, "protocol %0 requires %1 to be available in %2 %3 and newer",
6942-
(const ProtocolDecl *, const ValueDecl *, StringRef, llvm::VersionTuple))
6943+
(const ProtocolDecl *, const ValueDecl *, AvailabilityDomain,
6944+
llvm::VersionTuple))
69436945

69446946
NOTE(availability_protocol_requirement_here, none,
69456947
"protocol requirement here", ())
@@ -6995,7 +6997,7 @@ GROUPED_WARNING(conformance_availability_deprecated,
69956997

69966998
ERROR(conformance_availability_only_version_newer, none,
69976999
"conformance of %0 to %1 is only available in %2 %3 or newer",
6998-
(Type, Type, StringRef, llvm::VersionTuple))
7000+
(Type, Type, AvailabilityDomain, llvm::VersionTuple))
69997001

70007002
//------------------------------------------------------------------------------
70017003
// MARK: if #available(...)

lib/AST/ASTContext.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7058,6 +7058,10 @@ ValueOwnership swift::asValueOwnership(ParameterOwnership o) {
70587058
llvm_unreachable("exhaustive switch");
70597059
}
70607060

7061-
StringRef ASTContext::getTargetPlatformStringForDiagnostics() const {
7062-
return prettyPlatformString(targetPlatform(LangOpts));
7061+
AvailabilityDomain ASTContext::getTargetAvailabilityDomain() const {
7062+
if (auto domain = AvailabilityDomain::forTargetPlatform(*this))
7063+
return *domain;
7064+
7065+
// Fall back to the universal domain for triples without a platform.
7066+
return AvailabilityDomain::forUniversal();
70637067
}

lib/IRGen/GenMeta.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5193,7 +5193,7 @@ diagnoseUnsupportedObjCImplLayout(IRGenModule &IGM, ClassDecl *classDecl,
51935193
diags.diagnose(
51945194
field.getVarDecl(),
51955195
diag::attr_objc_implementation_resilient_property_deployment_target,
5196-
ctx.getTargetPlatformStringForDiagnostics(),
5196+
ctx.getTargetAvailabilityDomain(),
51975197
currentAvailability.getRawMinimumVersion(),
51985198
requiredAvailability.getRawMinimumVersion());
51995199
else

lib/Sema/TypeCheckAttr.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1896,7 +1896,7 @@ visitObjCImplementationAttr(ObjCImplementationAttr *attr) {
18961896
auto diag = diagnose(
18971897
attr->getLocation(),
18981898
diag::attr_objc_implementation_raise_minimum_deployment_target,
1899-
Ctx.getTargetPlatformStringForDiagnostics(),
1899+
Ctx.getTargetAvailabilityDomain(),
19001900
Ctx.getSwift50Availability().getRawMinimumVersion());
19011901
if (attr->isEarlyAdopter()) {
19021902
diag.wrapIn(diag::wrap_objc_implementation_will_become_error);
@@ -2431,12 +2431,11 @@ void AttributeChecker::visitAvailableAttr(AvailableAttr *parsedAttr) {
24312431
if (D->isImplicit())
24322432
diagnose(enclosingDecl->getLoc(),
24332433
diag::availability_implicit_decl_here,
2434-
D->getDescriptiveKind(),
2435-
Ctx.getTargetPlatformStringForDiagnostics(),
2434+
D->getDescriptiveKind(), Ctx.getTargetAvailabilityDomain(),
24362435
AttrRange.getRawMinimumVersion());
24372436
diagnose(enclosingDecl->getLoc(),
24382437
diag::availability_decl_more_than_enclosing_here,
2439-
Ctx.getTargetPlatformStringForDiagnostics(),
2438+
Ctx.getTargetAvailabilityDomain(),
24402439
EnclosingAnnotatedRange->getRawMinimumVersion());
24412440
}
24422441
}

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2163,7 +2163,9 @@ static void diagnosePotentialUnavailability(
21632163
ASTContext &Context = ReferenceDC->getASTContext();
21642164

21652165
{
2166-
auto Err = Diagnose(Context.getTargetPlatformStringForDiagnostics(),
2166+
// FIXME: [availability] Update diagnostics to take an AvailabilityDomain.
2167+
auto Domain = Context.getTargetAvailabilityDomain();
2168+
auto Err = Diagnose(Domain.getNameForDiagnostics(),
21672169
Availability.getRawMinimumVersion());
21682170

21692171
// Direct a fixit to the error if an existing guard is nearly-correct
@@ -2231,7 +2233,7 @@ static Diagnostic getPotentialUnavailabilityDiagnostic(
22312233
const AvailabilityRange &Availability, bool WarnBeforeDeploymentTarget,
22322234
bool &IsError) {
22332235
ASTContext &Context = ReferenceDC->getASTContext();
2234-
auto Platform = Context.getTargetPlatformStringForDiagnostics();
2236+
auto Domain = Context.getTargetAvailabilityDomain();
22352237

22362238
if (requiresDeploymentTargetOrEarlier(Availability, Context)) {
22372239
// The required OS version is at or before the deployment target so this
@@ -2242,12 +2244,12 @@ static Diagnostic getPotentialUnavailabilityDiagnostic(
22422244
return Diagnostic(
22432245
IsError ? diag::availability_decl_only_version_newer_for_clients
22442246
: diag::availability_decl_only_version_newer_for_clients_warn,
2245-
D, Platform, Availability.getRawMinimumVersion(),
2247+
D, Domain, Availability.getRawMinimumVersion(),
22462248
ReferenceDC->getParentModule());
22472249
}
22482250

22492251
IsError = true;
2250-
return Diagnostic(diag::availability_decl_only_version_newer, D, Platform,
2252+
return Diagnostic(diag::availability_decl_only_version_newer, D, Domain,
22512253
Availability.getRawMinimumVersion());
22522254
}
22532255

@@ -2294,10 +2296,9 @@ static void diagnosePotentialAccessorUnavailability(
22942296
: diag::availability_decl_only_version_newer;
22952297

22962298
{
2297-
auto Err = Context.Diags.diagnose(
2298-
ReferenceRange.Start, diag, Accessor,
2299-
Context.getTargetPlatformStringForDiagnostics(),
2300-
Availability.getRawMinimumVersion());
2299+
auto Err = Context.Diags.diagnose(ReferenceRange.Start, diag, Accessor,
2300+
Context.getTargetAvailabilityDomain(),
2301+
Availability.getRawMinimumVersion());
23012302

23022303
// Direct a fixit to the error if an existing guard is nearly-correct
23032304
if (fixAvailabilityByNarrowingNearbyVersionCheck(
@@ -2343,8 +2344,7 @@ diagnosePotentialUnavailability(const RootProtocolConformance *rootConf,
23432344
auto proto = rootConf->getProtocol()->getDeclaredInterfaceType();
23442345
auto err = ctx.Diags.diagnose(
23452346
loc, diag::conformance_availability_only_version_newer, type, proto,
2346-
ctx.getTargetPlatformStringForDiagnostics(),
2347-
availability.getRawMinimumVersion());
2347+
ctx.getTargetAvailabilityDomain(), availability.getRawMinimumVersion());
23482348

23492349
auto behaviorLimit = behaviorLimitForExplicitUnavailability(rootConf, dc);
23502350
if (behaviorLimit >= DiagnosticBehavior::Warning)

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -583,13 +583,14 @@ static bool checkObjCInExtensionContext(const ValueDecl *value,
583583
ResilienceExpansion::Maximal)) {
584584
auto stubAvailability = getObjCClassStubAvailability(ctx);
585585
auto *ancestor = getResilientAncestor(mod, classDecl);
586-
softenIfAccessNote(value, reason.getAttr(),
587-
value->diagnose(diag::objc_in_resilient_extension,
588-
value->getDescriptiveKind(),
589-
ancestor->getName(),
590-
ctx.getTargetPlatformStringForDiagnostics(),
591-
stubAvailability.getRawMinimumVersion())
592-
.limitBehavior(behavior));
586+
softenIfAccessNote(
587+
value, reason.getAttr(),
588+
value
589+
->diagnose(diag::objc_in_resilient_extension,
590+
value->getDescriptiveKind(), ancestor->getName(),
591+
ctx.getTargetAvailabilityDomain(),
592+
stubAvailability.getRawMinimumVersion())
593+
.limitBehavior(behavior));
593594
reason.describe(value);
594595
return true;
595596
}
@@ -1356,7 +1357,7 @@ static std::optional<ObjCReason> shouldMarkClassAsObjC(const ClassDecl *CD) {
13561357
auto *ancestor = getResilientAncestor(CD->getParentModule(), CD);
13571358
swift::diagnoseAndRemoveAttr(CD, attr, diag::objc_for_resilient_class,
13581359
ancestor->getName(),
1359-
ctx.getTargetPlatformStringForDiagnostics(),
1360+
ctx.getTargetAvailabilityDomain(),
13601361
stubAvailability.getRawMinimumVersion())
13611362
.limitBehavior(behavior);
13621363
reason.describe(CD);

lib/Sema/TypeCheckProtocol.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4531,7 +4531,7 @@ ConformanceChecker::resolveWitnessViaLookup(ValueDecl *requirement) {
45314531
SourceLoc diagLoc = getLocForDiagnosingWitness(conformance, witness);
45324532
diags.diagnose(diagLoc, diag::availability_protocol_requires_version,
45334533
conformance->getProtocol(), witness,
4534-
ctx.getTargetPlatformStringForDiagnostics(),
4534+
ctx.getTargetAvailabilityDomain(),
45354535
check.RequiredAvailability.getRawMinimumVersion());
45364536
emitDeclaredHereIfNeeded(diags, diagLoc, witness);
45374537
diags.diagnose(requirement,
@@ -5049,8 +5049,7 @@ static bool diagnoseTypeWitnessAvailability(
50495049
ctx.Diags
50505050
.diagnose(loc, diag::availability_protocol_requires_version,
50515051
conformance->getProtocol(), witness,
5052-
ctx.getTargetPlatformStringForDiagnostics(),
5053-
requiredVersion)
5052+
ctx.getTargetAvailabilityDomain(), requiredVersion)
50545053
.warnUntilSwiftVersion(warnBeforeVersion);
50555054

50565055
emitDeclaredHereIfNeeded(ctx.Diags, loc, witness);

0 commit comments

Comments
 (0)