2
2
// for details. All rights reserved. Use of this source code is governed by a
3
3
// BSD-style license that can be found in the LICENSE file.
4
4
5
+ import 'dart:async' ;
5
6
import 'dart:io' ;
6
7
7
8
import 'package:file/file.dart' ;
@@ -24,42 +25,171 @@ class InvalidSdkConfigurationException implements Exception {
24
25
/// SDK configuration provider interface.
25
26
///
26
27
/// Supports lazily populated configurations by allowing to create
27
- /// configuration asyncronously .
28
+ /// configuration asynchronously .
28
29
abstract class SdkConfigurationProvider {
30
+ const SdkConfigurationProvider ();
31
+
29
32
Future <SdkConfiguration > get configuration;
30
33
}
31
34
35
+ /// Sdk layout.
36
+ ///
37
+ /// Contains definition of the default SDK layout.
38
+ /// We keep all the path constants in one place for ease of update.
39
+ class SdkLayout {
40
+ static final sdkDir = p.dirname (p.dirname (Platform .resolvedExecutable));
41
+ static final defaultSdkLayout = createDefault (sdkDir);
42
+
43
+ static SdkLayout createDefault (String sdkDirectory) {
44
+ final sdkJsWeakFileName = 'dart_sdk.js' ;
45
+ final sdkJsMapWeakFileName = 'dart_sdk.js.map' ;
46
+ final sdkJsSoundFileName = 'dart_sdk_sound.js' ;
47
+ final sdkJsMapSoundFileName = 'dart_sdk_sound.js.map' ;
48
+ final sdkSummarySoundFileName = 'ddc_outline_sound.dill' ;
49
+ final sdkSummaryWeakFileName = 'ddc_sdk.dill' ;
50
+ final sdkFullDillSoundFileName = 'ddc_platform_sound.dill' ;
51
+ final sdkFullDillWeakFileName = 'ddc_platform.dill' ;
52
+
53
+ final sdkSummaryDirectory = p.join (sdkDirectory, 'lib' , '_internal' );
54
+ final sdkJsDirectory =
55
+ p.join (sdkDirectory, 'lib' , 'dev_compiler' , 'kernel' , 'amd' );
56
+
57
+ final soundSummaryPath =
58
+ p.join (sdkSummaryDirectory, sdkSummarySoundFileName);
59
+ final soundFullDillPath =
60
+ p.join (sdkSummaryDirectory, sdkFullDillSoundFileName);
61
+ final soundJsPath = p.join (sdkJsDirectory, sdkJsSoundFileName);
62
+ final soundJsMapPath = p.join (sdkJsDirectory, sdkJsMapSoundFileName);
63
+
64
+ final weakSummaryPath = p.join (sdkSummaryDirectory, sdkSummaryWeakFileName);
65
+ final weakFullDillPath =
66
+ p.join (sdkSummaryDirectory, sdkFullDillWeakFileName);
67
+ final weakJsPath = p.join (sdkJsDirectory, sdkJsWeakFileName);
68
+ final weakJsMapPath = p.join (sdkJsDirectory, sdkJsMapWeakFileName);
69
+
70
+ final librariesPath = p.join (sdkDirectory, 'lib' , 'libraries.json' );
71
+ final dartdevcSnapshotPath =
72
+ p.join (sdkDirectory, 'bin' , 'snapshots' , 'dartdevc.dart.snapshot' );
73
+ final kernelWorkerSnapshotPath =
74
+ p.join (sdkDirectory, 'bin' , 'snapshots' , 'kernel_worker.dart.snapshot' );
75
+
76
+ return SdkLayout (
77
+ sdkJsWeakFileName: sdkJsWeakFileName,
78
+ sdkJsMapWeakFileName: sdkJsMapWeakFileName,
79
+ sdkJsSoundFileName: sdkJsSoundFileName,
80
+ sdkJsMapSoundFileName: sdkJsMapSoundFileName,
81
+ sdkSummarySoundFileName: sdkSummarySoundFileName,
82
+ sdkSummaryWeakFileName: sdkSummaryWeakFileName,
83
+ sdkFullDillSoundFileName: sdkFullDillSoundFileName,
84
+ sdkFullDillWeakFileName: sdkFullDillWeakFileName,
85
+ sdkDirectory: sdkDirectory,
86
+ soundSummaryPath: soundSummaryPath,
87
+ soundFullDillPath: soundFullDillPath,
88
+ soundJsPath: soundJsPath,
89
+ soundJsMapPath: soundJsMapPath,
90
+ weakSummaryPath: weakSummaryPath,
91
+ weakFullDillPath: weakFullDillPath,
92
+ weakJsPath: weakJsPath,
93
+ weakJsMapPath: weakJsMapPath,
94
+ librariesPath: librariesPath,
95
+ dartdevcSnapshotPath: dartdevcSnapshotPath,
96
+ kernelWorkerSnapshotPath: kernelWorkerSnapshotPath,
97
+ );
98
+ }
99
+
100
+ final String sdkJsWeakFileName;
101
+ final String sdkJsMapWeakFileName;
102
+ final String sdkJsSoundFileName;
103
+ final String sdkJsMapSoundFileName;
104
+ final String sdkSummarySoundFileName;
105
+ final String sdkSummaryWeakFileName;
106
+ final String sdkFullDillSoundFileName;
107
+ final String sdkFullDillWeakFileName;
108
+
109
+ final String sdkDirectory;
110
+
111
+ final String soundSummaryPath;
112
+ final String soundFullDillPath;
113
+ final String soundJsPath;
114
+ final String soundJsMapPath;
115
+
116
+ final String weakSummaryPath;
117
+ final String weakFullDillPath;
118
+ final String weakJsPath;
119
+ final String weakJsMapPath;
120
+
121
+ final String librariesPath;
122
+
123
+ final String dartdevcSnapshotPath;
124
+ final String kernelWorkerSnapshotPath;
125
+
126
+ SdkLayout ({
127
+ required this .sdkJsWeakFileName,
128
+ required this .sdkJsMapWeakFileName,
129
+ required this .sdkJsSoundFileName,
130
+ required this .sdkJsMapSoundFileName,
131
+ required this .sdkSummarySoundFileName,
132
+ required this .sdkSummaryWeakFileName,
133
+ required this .sdkFullDillSoundFileName,
134
+ required this .sdkFullDillWeakFileName,
135
+ required this .sdkDirectory,
136
+ required this .soundSummaryPath,
137
+ required this .soundFullDillPath,
138
+ required this .soundJsPath,
139
+ required this .soundJsMapPath,
140
+ required this .weakSummaryPath,
141
+ required this .weakFullDillPath,
142
+ required this .weakJsPath,
143
+ required this .weakJsMapPath,
144
+ required this .librariesPath,
145
+ required this .dartdevcSnapshotPath,
146
+ required this .kernelWorkerSnapshotPath,
147
+ });
148
+ }
149
+
32
150
/// Data class describing the SDK layout.
33
151
///
34
152
/// Provides helpers to convert paths to uris that work on all platforms.
35
153
///
36
154
/// Call [validate] method to make sure the files in the configuration
37
155
/// layout exist before reading the files.
38
156
class SdkConfiguration {
39
- // TODO(annagrin): update the tests to take those parameters
40
- // and make all of the paths required (except for the compilerWorkerPath
41
- // that is not used in Flutter).
157
+ static final defaultSdkLayout = SdkLayout .defaultSdkLayout;
158
+ static final defaultConfiguration =
159
+ SdkConfiguration .fromSdkLayout (defaultSdkLayout);
160
+
42
161
String ? sdkDirectory;
43
- String ? unsoundSdkSummaryPath ;
162
+ String ? weakSdkSummaryPath ;
44
163
String ? soundSdkSummaryPath;
45
164
String ? librariesPath;
46
165
String ? compilerWorkerPath;
47
166
48
167
SdkConfiguration ({
49
168
this .sdkDirectory,
50
- this .unsoundSdkSummaryPath ,
169
+ this .weakSdkSummaryPath ,
51
170
this .soundSdkSummaryPath,
52
171
this .librariesPath,
53
172
this .compilerWorkerPath,
54
173
});
55
174
175
+ SdkConfiguration .empty () : this ();
176
+
177
+ SdkConfiguration .fromSdkLayout (SdkLayout sdkLayout)
178
+ : this (
179
+ sdkDirectory: sdkLayout.sdkDirectory,
180
+ weakSdkSummaryPath: sdkLayout.weakSummaryPath,
181
+ soundSdkSummaryPath: sdkLayout.soundSummaryPath,
182
+ librariesPath: sdkLayout.librariesPath,
183
+ compilerWorkerPath: sdkLayout.dartdevcSnapshotPath,
184
+ );
185
+
56
186
static Uri ? _toUri (String ? path) => path == null ? null : p.toUri (path);
57
187
static Uri ? _toAbsoluteUri (String ? path) =>
58
188
path == null ? null : p.toUri (p.absolute (path));
59
189
60
190
Uri ? get sdkDirectoryUri => _toUri (sdkDirectory);
61
191
Uri ? get soundSdkSummaryUri => _toUri (soundSdkSummaryPath);
62
- Uri ? get unsoundSdkSummaryUri => _toUri (unsoundSdkSummaryPath );
192
+ Uri ? get weakSdkSummaryUri => _toUri (weakSdkSummaryPath );
63
193
Uri ? get librariesUri => _toUri (librariesPath);
64
194
65
195
/// Note: has to be ///file: Uri to run in an isolate.
@@ -85,14 +215,23 @@ class SdkConfiguration {
85
215
}
86
216
87
217
void validateSummaries ({FileSystem fileSystem = const LocalFileSystem ()}) {
88
- if (unsoundSdkSummaryPath == null ||
89
- ! fileSystem.file (unsoundSdkSummaryPath).existsSync ()) {
218
+ validateSoundSummaries (fileSystem: fileSystem);
219
+ validateWeakSummaries (fileSystem: fileSystem);
220
+ }
221
+
222
+ void validateWeakSummaries (
223
+ {FileSystem fileSystem = const LocalFileSystem ()}) {
224
+ if (weakSdkSummaryPath == null ||
225
+ ! fileSystem.file (weakSdkSummaryPath).existsSync ()) {
90
226
throw InvalidSdkConfigurationException (
91
- 'Sdk summary $unsoundSdkSummaryPath does not exist' );
227
+ 'Sdk summary $weakSdkSummaryPath does not exist' );
92
228
}
229
+ }
93
230
94
- if (soundSdkSummaryPath == null ||
95
- ! fileSystem.file (soundSdkSummaryPath).existsSync ()) {
231
+ void validateSoundSummaries (
232
+ {FileSystem fileSystem = const LocalFileSystem ()}) {
233
+ if ((soundSdkSummaryPath == null ||
234
+ ! fileSystem.file (soundSdkSummaryPath).existsSync ())) {
96
235
throw InvalidSdkConfigurationException (
97
236
'Sdk summary $soundSdkSummaryPath does not exist' );
98
237
}
@@ -116,27 +255,10 @@ class SdkConfiguration {
116
255
}
117
256
}
118
257
119
- /// Implementation for the default SDK configuration layout.
120
258
class DefaultSdkConfigurationProvider extends SdkConfigurationProvider {
121
- DefaultSdkConfigurationProvider ();
259
+ const DefaultSdkConfigurationProvider ();
122
260
123
- late final SdkConfiguration _configuration = _create ();
124
-
125
- /// Create and validate configuration matching the default SDK layout.
126
261
@override
127
- Future <SdkConfiguration > get configuration async => _configuration;
128
-
129
- SdkConfiguration _create () {
130
- final binDir = p.dirname (Platform .resolvedExecutable);
131
- final sdkDir = p.dirname (binDir);
132
-
133
- return SdkConfiguration (
134
- sdkDirectory: sdkDir,
135
- unsoundSdkSummaryPath: p.join (sdkDir, 'lib' , '_internal' , 'ddc_sdk.dill' ),
136
- soundSdkSummaryPath:
137
- p.join (sdkDir, 'lib' , '_internal' , 'ddc_outline_sound.dill' ),
138
- librariesPath: p.join (sdkDir, 'lib' , 'libraries.json' ),
139
- compilerWorkerPath: p.join (binDir, 'snapshots' , 'dartdevc.dart.snapshot' ),
140
- );
141
- }
262
+ Future <SdkConfiguration > get configuration async =>
263
+ SdkConfiguration .defaultConfiguration;
142
264
}
0 commit comments