@@ -19,32 +19,24 @@ enum Availability {
19
19
all,
20
20
}
21
21
22
- typedef ApiAvailabilityReport = ({
23
- Availability availability,
24
- String ? dartDoc,
25
- });
26
-
27
- ApiAvailabilityReport getApiAvailability (clang_types.CXCursor cursor) {
28
- final api = ApiAvailability .fromCursor (cursor);
29
- final availability = api.getAvailability (config.externalVersions);
30
- return (
31
- availability: availability,
32
- dartDoc: availability == Availability .some ? api.dartDoc : null ,
33
- );
34
- }
35
-
36
22
class ApiAvailability {
37
23
final bool alwaysDeprecated;
38
24
final bool alwaysUnavailable;
39
- PlatformAvailability ? ios;
40
- PlatformAvailability ? macos;
25
+ final PlatformAvailability ? ios;
26
+ final PlatformAvailability ? macos;
27
+
28
+ late final Availability availability;
41
29
42
30
ApiAvailability ({
43
31
this .alwaysDeprecated = false ,
44
32
this .alwaysUnavailable = false ,
45
33
this .ios,
46
34
this .macos,
47
- });
35
+ ExternalVersions ? externalVersions,
36
+ }) {
37
+ availability =
38
+ _getAvailability (externalVersions ?? config.externalVersions);
39
+ }
48
40
49
41
static ApiAvailability fromCursor (clang_types.CXCursor cursor) {
50
42
final platformsLength = clang.clang_getCursorPlatformAvailability (
@@ -96,7 +88,7 @@ class ApiAvailability {
96
88
return api;
97
89
}
98
90
99
- Availability getAvailability (ExternalVersions externalVersions) {
91
+ Availability _getAvailability (ExternalVersions externalVersions) {
100
92
final macosVer = _normalizeVersions (externalVersions.macos);
101
93
final iosVer = _normalizeVersions (externalVersions.ios);
102
94
@@ -109,7 +101,7 @@ class ApiAvailability {
109
101
return Availability .none;
110
102
}
111
103
112
- Availability ? availability ;
104
+ Availability ? availability_ ;
113
105
for (final (platform, version) in [(ios, iosVer), (macos, macosVer)]) {
114
106
// If the user hasn't specified any versions for this platform, defer to
115
107
// the other platforms.
@@ -119,9 +111,9 @@ class ApiAvailability {
119
111
// If the API is available on any platform, return that it's available.
120
112
final platAvailability =
121
113
platform? .getAvailability (version) ?? Availability .all;
122
- availability = _mergeAvailability (availability , platAvailability);
114
+ availability_ = _mergeAvailability (availability_ , platAvailability);
123
115
}
124
- return availability ?? Availability .none;
116
+ return availability_ ?? Availability .none;
125
117
}
126
118
127
119
// If the min and max version are null, the versions object should be null.
@@ -131,8 +123,21 @@ class ApiAvailability {
131
123
static Availability _mergeAvailability (Availability ? x, Availability y) =>
132
124
x == null ? y : (x == y ? x : Availability .some);
133
125
134
- String get dartDoc =>
135
- [ios, macos].nonNulls.map ((platform) => platform.dartDoc).join ('\n ' );
126
+ List <PlatformAvailability > get _platforms => [ios, macos].nonNulls.toList ();
127
+
128
+ String ? get dartDoc {
129
+ if (availability != Availability .some) return null ;
130
+ final platforms = _platforms;
131
+ if (platforms.isEmpty) return null ;
132
+ return platforms.map ((platform) => platform.dartDoc).join ('\n ' );
133
+ }
134
+
135
+ String ? runtimeCheck (String checkOsVersion, String apiName) {
136
+ final platforms = _platforms;
137
+ if (platforms.isEmpty) return null ;
138
+ final args = platforms.map ((platform) => platform.checkArgs).join (', ' );
139
+ return "$checkOsVersion ('$apiName ', $args );" ;
140
+ }
136
141
137
142
@override
138
143
String toString () => '''Availability {
@@ -210,6 +215,10 @@ class PlatformAvailability {
210
215
return s.toString ();
211
216
}
212
217
218
+ String get checkArgs => '$name : ($unavailable , ${_toRecord (introduced )})' ;
219
+ String _toRecord (Version ? v) =>
220
+ v == null ? 'null' : '(${v .major }, ${v .minor }, ${v .patch })' ;
221
+
213
222
@override
214
223
String toString () => 'introduced: $introduced , deprecated: $deprecated , '
215
224
'obsoleted: $obsoleted , unavailable: $unavailable ' ;
0 commit comments