Skip to content

Commit 119109d

Browse files
committed
AST: Fix rendering of available ranges in AvailabilityContext::print().
1 parent a1cdd33 commit 119109d

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

lib/AST/AvailabilityContext.cpp

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -403,12 +403,35 @@ void AvailabilityContext::print(llvm::raw_ostream &os) const {
403403
os << "version=" << stringForAvailability(getPlatformRange());
404404

405405
auto domainInfos = storage->getDomainInfos();
406-
if (domainInfos.size() > 0) {
407-
os << " unavailable=";
408-
llvm::interleave(
409-
domainInfos, os,
410-
[&](const DomainInfo &domainInfo) { domainInfo.getDomain().print(os); },
411-
",");
406+
if (!domainInfos.empty()) {
407+
auto availableInfos = llvm::make_filter_range(
408+
domainInfos, [](auto info) { return !info.isUnavailable(); });
409+
410+
if (!availableInfos.empty()) {
411+
os << " available=";
412+
llvm::interleave(
413+
availableInfos, os,
414+
[&](const DomainInfo &domainInfo) {
415+
domainInfo.getDomain().print(os);
416+
if (domainInfo.getDomain().isVersioned() &&
417+
domainInfo.getRange().hasMinimumVersion())
418+
os << ">=" << domainInfo.getRange().getAsString();
419+
},
420+
",");
421+
}
422+
423+
auto unavailableInfos = llvm::make_filter_range(
424+
domainInfos, [](auto info) { return info.isUnavailable(); });
425+
426+
if (!unavailableInfos.empty()) {
427+
os << " unavailable=";
428+
llvm::interleave(
429+
unavailableInfos, os,
430+
[&](const DomainInfo &domainInfo) {
431+
domainInfo.getDomain().print(os);
432+
},
433+
",");
434+
}
412435
}
413436

414437
if (isDeprecated())
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: %target-swift-frontend -typecheck %s \
2+
// RUN: -enable-experimental-feature CustomAvailability \
3+
// RUN: -define-enabled-availability-domain A \
4+
// RUN: -define-enabled-availability-domain B \
5+
// RUN: -dump-availability-scopes > %t.dump 2>&1
6+
// RUN: %FileCheck --strict-whitespace %s < %t.dump
7+
8+
// REQUIRES: swift_feature_CustomAvailability
9+
10+
// CHECK: {{^}}(root version={{.*}}
11+
// CHECK: {{^}} (decl version={{.*}} available=A decl=availableInA()
12+
@available(A)
13+
func availableInA() { }
14+
15+
// CHECK: {{^}} (decl version={{.*}} unavailable=A decl=unavailableInA()
16+
@available(A, unavailable)
17+
func unavailableInA() { }
18+
19+
// CHECK: {{^}} (decl version={{.*}} available=A,B decl=availableInAB()
20+
@available(A)
21+
@available(B)
22+
func availableInAB() { }
23+
24+
// FIXME: [availability] Should be "available=A"
25+
// CHECK: {{^}} (decl version={{.*}} deprecated decl=deprecatedInA()
26+
@available(A, deprecated)
27+
func deprecatedInA() { }

0 commit comments

Comments
 (0)