1
1
library pana.platform;
2
2
3
+ import 'dart:collection' ;
3
4
import 'package:source_gen/generators/json_serializable.dart' ;
4
5
5
6
import 'pubspec.dart' ;
6
7
7
8
part 'platform.g.dart' ;
8
9
9
- abstract class KnownPlatforms {
10
- static const String browser = 'browser' ;
11
- static const String standalone = 'standalone' ;
10
+ abstract class PlatformFlags {
11
+ /// Denotes a package that references Flutter in `pubspec.yaml` .
12
12
static const String flutter = 'flutter' ;
13
- static const String mirrors = 'mirrors' ;
14
13
15
- /// Native extensions (Dart VM with C/C++ code).
16
- static const String native = 'native' ;
17
-
18
- static const String angular = 'angular' ;
14
+ /// Denotes a library that depends on a native extensions via `dart-ext:`
15
+ static const String dartExtension = 'dart-ext' ;
19
16
}
20
17
21
18
class PlatformSummary {
@@ -30,8 +27,8 @@ class PlatformSummary {
30
27
_conflictsFlutter;
31
28
32
29
bool get _conflictsFlutter =>
33
- package.uses.contains (KnownPlatforms .flutter) &&
34
- libraries.values.any ((p) => ! p.worksInFlutter );
30
+ package.uses.contains (PlatformFlags .flutter) &&
31
+ libraries.values.any ((p) => ! p.worksOnFlutter );
35
32
}
36
33
37
34
@JsonSerializable ()
@@ -48,28 +45,54 @@ class PlatformInfo extends Object with _$PlatformInfoSerializerMixin {
48
45
49
46
bool get hasConflict =>
50
47
(! worksAnywhere) ||
51
- (uses.contains (KnownPlatforms .flutter) && ! worksInFlutter) ||
52
- (uses.contains (KnownPlatforms .native ) && ! worksInStandalone);
48
+ (uses.contains (PlatformFlags .flutter) && ! worksOnFlutter) ||
49
+ (uses.contains (PlatformFlags .dartExtension) && ! worksOnServer);
50
+
51
+ bool get worksEverywhere => worksOnWeb && worksOnServer && worksOnFlutter;
52
+
53
+ bool get worksAnywhere => worksOnWeb || worksOnServer || worksOnFlutter;
54
+
55
+ bool get worksOnWeb =>
56
+ _hasNoUseOf (
57
+ [PlatformFlags .flutter, 'dart:ui' , PlatformFlags .dartExtension]) &&
58
+ (_webPackages.any (uses.contains) || _hasNoUseOf (['dart:io' ]));
59
+
60
+ bool get worksOnServer =>
61
+ _hasNoUseOf (_webAnd (['dart:ui' , PlatformFlags .flutter]));
53
62
54
- bool get worksEverywhere =>
55
- worksInBrowser && worksInStandalone && worksInFlutter;
63
+ bool get worksOnFlutter => _hasNoUseOf (_webAnd ([
64
+ 'dart:mirrors' ,
65
+ PlatformFlags .dartExtension,
66
+ ]));
56
67
57
- bool get worksAnywhere =>
58
- worksInBrowser || worksInStandalone || worksInFlutter;
68
+ String get description {
69
+ if (worksEverywhere) {
70
+ return 'everywhere' ;
71
+ }
59
72
60
- bool get worksInBrowser =>
61
- _hasNoUseOf ([ KnownPlatforms .flutter, KnownPlatforms . native ]) &&
62
- (uses. contains ( KnownPlatforms .browser) ||
63
- _hasNoUseOf ([ KnownPlatforms .standalone]));
73
+ var items = < String > [];
74
+ if (worksOnFlutter) {
75
+ items. add ( 'flutter' );
76
+ }
64
77
65
- bool get worksInStandalone =>
66
- _hasNoUseOf ([KnownPlatforms .browser, KnownPlatforms .flutter]);
78
+ if (worksOnServer) {
79
+ items.add ('server' );
80
+ }
67
81
68
- bool get worksInFlutter => _hasNoUseOf ([
69
- KnownPlatforms .browser,
70
- KnownPlatforms .mirrors,
71
- KnownPlatforms .native ,
72
- ]);
82
+ if (worksOnWeb) {
83
+ items.add ('web' );
84
+ }
85
+
86
+ if (items.isEmpty) {
87
+ assert (hasConflict);
88
+ return 'conflict' ;
89
+ }
90
+
91
+ return items.join (', ' );
92
+ }
93
+
94
+ @override
95
+ String toString () => 'PlatformInfo: $description ' ;
73
96
74
97
bool _hasNoUseOf (Iterable <String > platforms) =>
75
98
! platforms.any ((p) => uses.contains (p));
@@ -78,7 +101,7 @@ class PlatformInfo extends Object with _$PlatformInfoSerializerMixin {
78
101
PlatformInfo classifyPubspec (Pubspec pubspec) {
79
102
final Set <String > uses = new Set ();
80
103
if (pubspec.hasFlutterKey || pubspec.dependsOnFlutterSdk) {
81
- uses.add (KnownPlatforms .flutter);
104
+ uses.add (PlatformFlags .flutter);
82
105
}
83
106
return new PlatformInfo (uses);
84
107
}
@@ -94,36 +117,22 @@ PlatformSummary classifyPlatforms(
94
117
95
118
PlatformInfo classifyPlatform (Iterable <String > dependencies) {
96
119
Set <String > libs = dependencies.toSet ();
97
- Set <String > uses = new Set ();
98
-
99
- if (_webPackages.any (libs.contains)) {
100
- uses.add (KnownPlatforms .browser);
101
- }
102
-
103
- if (libs.contains ('dart:io' )) {
104
- uses.add (KnownPlatforms .standalone);
105
- }
106
-
107
- if (libs.contains ('dart:ui' )) {
108
- uses.add (KnownPlatforms .flutter);
109
- }
120
+ Set <String > uses = new SplayTreeSet <String >();
110
121
111
- if (libs.contains ('dart:mirrors' )) {
112
- uses.add (KnownPlatforms .mirrors);
113
- }
122
+ uses.addAll (libs.where ((l) => _dartLibRegexp.hasMatch (l)));
114
123
115
124
if (libs.any ((String lib) => lib.startsWith ('dart-ext:' ))) {
116
- uses.add (KnownPlatforms .native );
117
- }
118
-
119
- // packages
120
- if (libs.any ((p) => p.startsWith ('package:angular2/' ))) {
121
- uses.add (KnownPlatforms .angular);
125
+ uses.add (PlatformFlags .dartExtension);
122
126
}
123
127
124
128
return new PlatformInfo (uses);
125
129
}
126
130
131
+ final _dartLibRegexp = new RegExp (r"^dart:[a-z_]+$" );
132
+
133
+ Iterable <String > _webAnd (Iterable <String > other) =>
134
+ [_webPackages, other].expand ((s) => s);
135
+
127
136
const List <String > _webPackages = const [
128
137
'dart:html' ,
129
138
'dart:indexed_db' ,
0 commit comments