OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import 'dart:collection' show HashMap; | 5 import 'dart:collection' show HashMap; |
6 | 6 |
7 import 'package:analyzer/src/generated/ast.dart'; | 7 import 'package:analyzer/src/generated/ast.dart'; |
8 import 'package:analyzer/src/generated/element.dart'; | 8 import 'package:analyzer/src/generated/element.dart'; |
9 | 9 |
10 import '../compiler.dart' show corelibOrder; | 10 import '../compiler.dart' show corelibOrder; |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 } | 205 } |
206 } | 206 } |
207 | 207 |
208 bool libraryIsLoaded(LibraryElement library) { | 208 bool libraryIsLoaded(LibraryElement library) { |
209 assert(library != _currentLibrary); | 209 assert(library != _currentLibrary); |
210 | 210 |
211 // DynamicElementImpl has no library. | 211 // DynamicElementImpl has no library. |
212 if (library == null) return true; | 212 if (library == null) return true; |
213 | 213 |
214 // The SDK is a special case: we optimize the order to prevent laziness. | 214 // The SDK is a special case: we optimize the order to prevent laziness. |
215 if (_isDartUri(library)) { | 215 if (library.source.isInSystemLibrary) { |
216 // SDK is loaded before non-SDK libraries | 216 // SDK is loaded before non-SDK libraries |
217 if (!_isDartUri(_currentLibrary)) return true; | 217 if (!_currentLibrary.source.isInSystemLibrary) return true; |
218 | 218 |
219 // Compute the order of both SDK libraries. If unknown, assume it's after. | 219 // Compute the order of both SDK libraries. If unknown, assume it's after. |
220 var order = corelibOrder.indexOf(library.source.uri); | 220 var order = corelibOrder.indexOf(library.source.uri); |
221 if (order == -1) order = corelibOrder.length; | 221 if (order == -1) order = corelibOrder.length; |
222 | 222 |
223 var currentOrder = corelibOrder.indexOf(_currentLibrary.source.uri); | 223 var currentOrder = corelibOrder.indexOf(_currentLibrary.source.uri); |
224 if (currentOrder == -1) currentOrder = corelibOrder.length; | 224 if (currentOrder == -1) currentOrder = corelibOrder.length; |
225 | 225 |
226 // If the dart:* library we are currently compiling is loaded after the | 226 // If the dart:* library we are currently compiling is loaded after the |
227 // class's library, then we know the class is available. | 227 // class's library, then we know the class is available. |
228 if (order != currentOrder) return currentOrder > order; | 228 if (order != currentOrder) return currentOrder > order; |
229 | 229 |
230 // If we don't know the order of the class's library or the current | 230 // If we don't know the order of the class's library or the current |
231 // library, do the normal cycle check. (Not all SDK libs are cycles.) | 231 // library, do the normal cycle check. (Not all SDK libs are cycles.) |
232 } | 232 } |
233 | 233 |
234 return !_inLibraryCycle(library); | 234 return !_inLibraryCycle(library); |
235 } | 235 } |
236 | 236 |
237 /// Returns true if [library] depends on the [currentLibrary] via some | 237 /// Returns true if [library] depends on the [currentLibrary] via some |
238 /// transitive import. | 238 /// transitive import. |
239 bool _inLibraryCycle(LibraryElement library) { | 239 bool _inLibraryCycle(LibraryElement library) { |
240 // SDK libs don't depend on things outside the SDK. | 240 // SDK libs don't depend on things outside the SDK. |
241 // (We can reach this via the recursive call below.) | 241 // (We can reach this via the recursive call below.) |
242 if (_isDartUri(library) && !_isDartUri(_currentLibrary)) return false; | 242 if (library.source.isInSystemLibrary && |
| 243 !_currentLibrary.source.isInSystemLibrary) return false; |
243 | 244 |
244 var result = _libraryCycleMemo[library]; | 245 var result = _libraryCycleMemo[library]; |
245 if (result != null) return result; | 246 if (result != null) return result; |
246 | 247 |
247 result = library == _currentLibrary; | 248 result = library == _currentLibrary; |
248 _libraryCycleMemo[library] = result; | 249 _libraryCycleMemo[library] = result; |
249 for (var e in library.imports) { | 250 for (var e in library.imports) { |
250 if (result) break; | 251 if (result) break; |
251 result = _inLibraryCycle(e.importedLibrary); | 252 result = _inLibraryCycle(e.importedLibrary); |
252 } | 253 } |
253 for (var e in library.exports) { | 254 for (var e in library.exports) { |
254 if (result) break; | 255 if (result) break; |
255 result = _inLibraryCycle(e.exportedLibrary); | 256 result = _inLibraryCycle(e.exportedLibrary); |
256 } | 257 } |
257 return _libraryCycleMemo[library] = result; | 258 return _libraryCycleMemo[library] = result; |
258 } | 259 } |
259 | |
260 /// Returns whether this is a library imported with 'dart:' URI. | |
261 /// | |
262 /// This is similar to [LibraryElement.isInSdk], but checking the URI instead | |
263 /// of the library naming convention, because the URI is reliable. | |
264 static bool _isDartUri(LibraryElement e) => e.source.uri.scheme == 'dart'; | |
265 } | 260 } |
OLD | NEW |