Skip to content

Commit a23407b

Browse files
committed
display the availability badges or deprecation notice
1 parent 87542b7 commit a23407b

File tree

11 files changed

+357
-113
lines changed

11 files changed

+357
-113
lines changed

Assets/css/Main.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/css/Main.css.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div align="center">
22

3-
<strong><em><code>unidoc</code></em></strong><br><small><code>0.1.0</code></small>
3+
<strong><em><code>unidoc</code></em></strong><br><small><code>0.1.3</code></small>
44

55
[![ci build status](https://github.com/kelvin13/swift-unidoc/actions/workflows/build.yml/badge.svg)](https://github.com/kelvin13/swift-unidoc/actions/workflows/build.yml)
66

Sources/Availability/Domains/Availability.PlatformDomain.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import SemanticVersions
33
extension Availability
44
{
55
@frozen public
6-
enum PlatformDomain:String, CaseIterable, Hashable, Sendable
6+
enum PlatformDomain:String, CaseIterable, Equatable, Hashable, Sendable
77
{
88
case iOS
99
case macOS
1010
case macCatalyst
11+
case openBSD = "OpenBSD"
1112
case tvOS
1213
case watchOS
1314
case windows = "Windows"
14-
case openBSD = "OpenBSD"
1515

1616
case iOSApplicationExtension
1717
case macOSApplicationExtension
@@ -29,3 +29,25 @@ extension Availability.PlatformDomain:AvailabilityDomain
2929
public
3030
typealias Unavailability = Availability.EternalRange
3131
}
32+
extension Availability.PlatformDomain:CustomStringConvertible
33+
{
34+
@inlinable public
35+
var description:String
36+
{
37+
switch self
38+
{
39+
case .iOS: return "iOS"
40+
case .macOS: return "macOS"
41+
case .macCatalyst: return "Mac Catalyst"
42+
case .openBSD: return "OpenBSD"
43+
case .tvOS: return "tvOS"
44+
case .watchOS: return "watchOS"
45+
case .windows: return "Windows"
46+
case .iOSApplicationExtension: return "iOS App Extension"
47+
case .macOSApplicationExtension: return "macOS App Extension"
48+
case .macCatalystApplicationExtension: return "Mac Catalyst App Extension"
49+
case .tvOSApplicationExtension: return "tvOS App Extension"
50+
case .watchOSApplicationExtension: return "watchOS App Extension"
51+
}
52+
}
53+
}

Sources/SymbolGraphParts/Availability/Availability (ext).swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ extension Availability:JSONDecodable
4545
message: message)
4646

4747
case .platform(let domain):
48-
let deprecated:Availability.AnyRange? = try json[.isUnconditionallyDeprecated]?.decode(
48+
let deprecated:Availability.AnyRange? =
49+
try json[.isUnconditionallyDeprecated]?.decode(
4950
as: Bool.self)
5051
{
5152
$0 ? .unconditionally : nil

Sources/UnidocPages/Templates/Site.Docs.Decl.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Availability
12
import HTML
23
import LexicalPaths
34
import ModuleGraphs
@@ -115,6 +116,41 @@ extension Site.Docs.Decl:ApplicationPage
115116
}
116117
}
117118

119+
let availability:Availability = self.master.signature.availability
120+
if let notice:String = availability.notice
121+
{
122+
main[.section, { $0.class = "deprecation" }] { $0[.p] = notice }
123+
}
124+
else if !availability.isEmpty
125+
{
126+
main[.section, { $0.class = "availability" }]
127+
{
128+
$0[.dl]
129+
{
130+
if let badge:String = availability.agnostic[.swift]?.badge
131+
{
132+
$0[.dt] = "Swift"
133+
$0[.dd] = badge
134+
}
135+
if let badge:String = availability.agnostic[.swiftPM]?.badge
136+
{
137+
$0[.dt] = "SwiftPM"
138+
$0[.dd] = badge
139+
}
140+
141+
for platform:Availability.PlatformDomain in
142+
Availability.PlatformDomain.allCases
143+
{
144+
if let badge:String = availability.platforms[platform]?.badge
145+
{
146+
$0[.dt] = "\(platform)"
147+
$0[.dd] = badge
148+
}
149+
}
150+
}
151+
}
152+
}
153+
118154
main[.section, { $0.class = "declaration" }]
119155
{
120156
$0[.pre]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Availability
2+
3+
extension Availability
4+
{
5+
var notice:String?
6+
{
7+
self.universal?.notice ??
8+
self.agnostic[.swift]?.notice("Swift") ??
9+
self.agnostic[.swiftPM]?.notice("SwiftPM")
10+
}
11+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import Availability
2+
3+
extension Availability.Clauses<Availability.UniversalDomain>
4+
{
5+
var notice:String?
6+
{
7+
guard case .unconditionally? = self.deprecated
8+
else
9+
{
10+
return nil
11+
}
12+
if let name:String = self.renamed
13+
{
14+
return "This declaration is deprecated. It has been renamed to \(name)."
15+
}
16+
else if
17+
let message:String = self.message
18+
{
19+
return "This declaration is deprecated: \(message)"
20+
}
21+
else
22+
{
23+
return "This declaration is deprecated."
24+
}
25+
}
26+
}
27+
extension Availability.Clauses<Availability.AgnosticDomain>
28+
{
29+
func notice(_ tool:String) -> String?
30+
{
31+
var prose:String
32+
switch (obsoleted: self.obsoleted, deprecated: self.deprecated)
33+
{
34+
case (obsoleted: let version?, _):
35+
prose = "This declaration was obsoleted in \(tool) \(version)"
36+
37+
case (nil, deprecated: .since(let version?)?):
38+
prose = "This declaration was deprecated in \(tool) \(version)"
39+
40+
case (nil, deprecated: .since(nil)?):
41+
prose = "This declaration is deprecated"
42+
43+
case (nil, nil):
44+
return nil
45+
}
46+
47+
if let name:String = self.renamed
48+
{
49+
prose += ". It has been renamed to \(name)."
50+
}
51+
else if
52+
let message:String = self.message
53+
{
54+
prose += ": \(message)"
55+
}
56+
else
57+
{
58+
prose += "."
59+
}
60+
61+
return prose
62+
}
63+
64+
var badge:String?
65+
{
66+
self.introduced.map { "\($0)+" }
67+
}
68+
}
69+
extension Availability.Clauses<Availability.PlatformDomain>
70+
{
71+
var badge:String?
72+
{
73+
switch
74+
(
75+
unavailable: self.unavailable,
76+
deprecated: self.deprecated,
77+
obsoleted: self.obsoleted,
78+
introduced: self.introduced
79+
)
80+
{
81+
case (unavailable: .unconditionally?, _, _, _):
82+
return "unavailable"
83+
84+
case (nil, deprecated: _?, _, _):
85+
return "deprecated"
86+
87+
case (nil, nil, obsoleted: _?, _):
88+
return "obsoleted"
89+
90+
case (nil, nil, nil, introduced: let version?):
91+
return "\(version)+"
92+
93+
case (nil, nil, nil, nil):
94+
return nil
95+
}
96+
}
97+
}

Stylesheets/_Colors.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ $light-background-pink: rgb(255, 224, 239);
33
$light-foreground: rgb(22, 22, 22);
44
$light-foreground-semi: rgb(109, 109, 109);
55

6+
$light-foreground-elevated: rgb(223, 223, 223);
7+
$light-foreground-elevated-shadow: rgb(172, 172, 172);
8+
9+
$light-coral-elevated: rgb(255, 103, 103);
10+
$light-coral-elevated-shadow: rgb(235, 75, 75);
11+
612
$light-code-well: rgb(233, 233, 233);
713
$light-snippet-line-number: rgb(192, 192, 192);
814

0 commit comments

Comments
 (0)