| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 library leg_apiimpl; | 5 library leg_apiimpl; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 | 9 |
| 10 import 'package:package_config/packages.dart'; | 10 import 'package:package_config/packages.dart'; |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 228 } | 228 } |
| 229 return resolvedUri; | 229 return resolvedUri; |
| 230 } | 230 } |
| 231 | 231 |
| 232 /** | 232 /** |
| 233 * Reads the script designated by [readableUri]. | 233 * Reads the script designated by [readableUri]. |
| 234 */ | 234 */ |
| 235 Future<Script> readScript(Spannable node, Uri readableUri) { | 235 Future<Script> readScript(Spannable node, Uri readableUri) { |
| 236 if (!readableUri.isAbsolute) { | 236 if (!readableUri.isAbsolute) { |
| 237 if (node == null) node = NO_LOCATION_SPANNABLE; | 237 if (node == null) node = NO_LOCATION_SPANNABLE; |
| 238 internalError(node, | 238 reporter.internalError(node, |
| 239 'Relative uri $readableUri provided to readScript(Uri).'); | 239 'Relative uri $readableUri provided to readScript(Uri).'); |
| 240 } | 240 } |
| 241 | 241 |
| 242 // We need to store the current element since we are reporting read errors | 242 // We need to store the current element since we are reporting read errors |
| 243 // asynchronously and therefore need to restore the current element for | 243 // asynchronously and therefore need to restore the current element for |
| 244 // [node] to be valid. | 244 // [node] to be valid. |
| 245 elements.Element element = currentElement; | 245 elements.Element element = currentElement; |
| 246 void reportReadError(exception) { | 246 void reportReadError(exception) { |
| 247 if (element == null || node == null) { | 247 if (element == null || node == null) { |
| 248 reportErrorMessage( | 248 reporter.reportErrorMessage( |
| 249 new SourceSpan(readableUri, 0, 0), | 249 new SourceSpan(readableUri, 0, 0), |
| 250 MessageKind.READ_SELF_ERROR, | 250 MessageKind.READ_SELF_ERROR, |
| 251 {'uri': readableUri, 'exception': exception}); | 251 {'uri': readableUri, 'exception': exception}); |
| 252 } else { | 252 } else { |
| 253 withCurrentElement(element, () { | 253 reporter.withCurrentElement(element, () { |
| 254 reportErrorMessage( | 254 reporter.reportErrorMessage( |
| 255 node, | 255 node, |
| 256 MessageKind.READ_SCRIPT_ERROR, | 256 MessageKind.READ_SCRIPT_ERROR, |
| 257 {'uri': readableUri, 'exception': exception}); | 257 {'uri': readableUri, 'exception': exception}); |
| 258 }); | 258 }); |
| 259 } | 259 } |
| 260 } | 260 } |
| 261 | 261 |
| 262 Uri resourceUri = translateUri(node, readableUri); | 262 Uri resourceUri = translateUri(node, readableUri); |
| 263 if (resourceUri == null) return synthesizeScript(node, readableUri); | 263 if (resourceUri == null) return synthesizeScript(node, readableUri); |
| 264 if (resourceUri.scheme == 'dart-ext') { | 264 if (resourceUri.scheme == 'dart-ext') { |
| 265 if (!allowNativeExtensions) { | 265 if (!allowNativeExtensions) { |
| 266 withCurrentElement(element, () { | 266 reporter.withCurrentElement(element, () { |
| 267 reportErrorMessage( | 267 reporter.reportErrorMessage( |
| 268 node, MessageKind.DART_EXT_NOT_SUPPORTED); | 268 node, MessageKind.DART_EXT_NOT_SUPPORTED); |
| 269 }); | 269 }); |
| 270 } | 270 } |
| 271 return synthesizeScript(node, readableUri); | 271 return synthesizeScript(node, readableUri); |
| 272 } | 272 } |
| 273 | 273 |
| 274 // TODO(johnniwinther): Wrap the result from [provider] in a specialized | 274 // TODO(johnniwinther): Wrap the result from [provider] in a specialized |
| 275 // [Future] to ensure that we never execute an asynchronous action without | 275 // [Future] to ensure that we never execute an asynchronous action without |
| 276 // setting up the current element of the compiler. | 276 // setting up the current element of the compiler. |
| 277 return new Future.sync(() => callUserProvider(resourceUri)).then((data) { | 277 return new Future.sync(() => callUserProvider(resourceUri)).then((data) { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 if (importingLibrary != null) { | 328 if (importingLibrary != null) { |
| 329 if (importingLibrary.isPlatformLibrary || importingLibrary.isPatch) { | 329 if (importingLibrary.isPlatformLibrary || importingLibrary.isPatch) { |
| 330 allowInternalLibraryAccess = true; | 330 allowInternalLibraryAccess = true; |
| 331 } else if (importingLibrary.canonicalUri.path.contains( | 331 } else if (importingLibrary.canonicalUri.path.contains( |
| 332 'sdk/tests/compiler/dart2js_native')) { | 332 'sdk/tests/compiler/dart2js_native')) { |
| 333 allowInternalLibraryAccess = true; | 333 allowInternalLibraryAccess = true; |
| 334 } | 334 } |
| 335 } | 335 } |
| 336 if (!allowInternalLibraryAccess) { | 336 if (!allowInternalLibraryAccess) { |
| 337 if (importingLibrary != null) { | 337 if (importingLibrary != null) { |
| 338 reportErrorMessage( | 338 reporter.reportErrorMessage( |
| 339 spannable, | 339 spannable, |
| 340 MessageKind.INTERNAL_LIBRARY_FROM, | 340 MessageKind.INTERNAL_LIBRARY_FROM, |
| 341 {'resolvedUri': resolvedUri, | 341 {'resolvedUri': resolvedUri, |
| 342 'importingUri': importingLibrary.canonicalUri}); | 342 'importingUri': importingLibrary.canonicalUri}); |
| 343 } else { | 343 } else { |
| 344 reportErrorMessage( | 344 reporter.reportErrorMessage( |
| 345 spannable, | 345 spannable, |
| 346 MessageKind.INTERNAL_LIBRARY, | 346 MessageKind.INTERNAL_LIBRARY, |
| 347 {'resolvedUri': resolvedUri}); | 347 {'resolvedUri': resolvedUri}); |
| 348 } | 348 } |
| 349 } | 349 } |
| 350 } | 350 } |
| 351 if (path == null) { | 351 if (path == null) { |
| 352 if (libraryInfo == null) { | 352 if (libraryInfo == null) { |
| 353 reportErrorMessage( | 353 reporter.reportErrorMessage( |
| 354 spannable, | 354 spannable, |
| 355 MessageKind.LIBRARY_NOT_FOUND, | 355 MessageKind.LIBRARY_NOT_FOUND, |
| 356 {'resolvedUri': resolvedUri}); | 356 {'resolvedUri': resolvedUri}); |
| 357 } else { | 357 } else { |
| 358 reportErrorMessage( | 358 reporter.reportErrorMessage( |
| 359 spannable, | 359 spannable, |
| 360 MessageKind.LIBRARY_NOT_SUPPORTED, | 360 MessageKind.LIBRARY_NOT_SUPPORTED, |
| 361 {'resolvedUri': resolvedUri}); | 361 {'resolvedUri': resolvedUri}); |
| 362 } | 362 } |
| 363 // TODO(johnniwinther): Support signaling the error through the returned | 363 // TODO(johnniwinther): Support signaling the error through the returned |
| 364 // value. | 364 // value. |
| 365 return null; | 365 return null; |
| 366 } | 366 } |
| 367 if (resolvedUri.path == 'html' || | 367 if (resolvedUri.path == 'html' || |
| 368 resolvedUri.path == 'io') { | 368 resolvedUri.path == 'io') { |
| 369 // TODO(ahe): Get rid of mockableLibraryUsed when test.dart | 369 // TODO(ahe): Get rid of mockableLibraryUsed when test.dart |
| 370 // supports this use case better. | 370 // supports this use case better. |
| 371 mockableLibraryUsed = true; | 371 mockableLibraryUsed = true; |
| 372 } | 372 } |
| 373 return libraryRoot.resolve(path); | 373 return libraryRoot.resolve(path); |
| 374 } | 374 } |
| 375 | 375 |
| 376 Uri resolvePatchUri(String dartLibraryPath) { | 376 Uri resolvePatchUri(String dartLibraryPath) { |
| 377 String patchPath = lookupPatchPath(dartLibraryPath); | 377 String patchPath = lookupPatchPath(dartLibraryPath); |
| 378 if (patchPath == null) return null; | 378 if (patchPath == null) return null; |
| 379 return libraryRoot.resolve(patchPath); | 379 return libraryRoot.resolve(patchPath); |
| 380 } | 380 } |
| 381 | 381 |
| 382 Uri translatePackageUri(Spannable node, Uri uri) { | 382 Uri translatePackageUri(Spannable node, Uri uri) { |
| 383 try { | 383 try { |
| 384 checkValidPackageUri(uri); | 384 checkValidPackageUri(uri); |
| 385 } on ArgumentError catch (e) { | 385 } on ArgumentError catch (e) { |
| 386 reportErrorMessage( | 386 reporter.reportErrorMessage( |
| 387 node, | 387 node, |
| 388 MessageKind.INVALID_PACKAGE_URI, | 388 MessageKind.INVALID_PACKAGE_URI, |
| 389 {'uri': uri, 'exception': e.message}); | 389 {'uri': uri, 'exception': e.message}); |
| 390 return null; | 390 return null; |
| 391 } | 391 } |
| 392 return packages.resolve(uri, | 392 return packages.resolve(uri, |
| 393 notFound: (Uri notFound) { | 393 notFound: (Uri notFound) { |
| 394 reportErrorMessage( | 394 reporter.reportErrorMessage( |
| 395 node, | 395 node, |
| 396 MessageKind.LIBRARY_NOT_FOUND, | 396 MessageKind.LIBRARY_NOT_FOUND, |
| 397 {'resolvedUri': uri}); | 397 {'resolvedUri': uri}); |
| 398 return null; | 398 return null; |
| 399 }); | 399 }); |
| 400 } | 400 } |
| 401 | 401 |
| 402 Future<elements.LibraryElement> analyzeUri( | 402 Future<elements.LibraryElement> analyzeUri( |
| 403 Uri uri, | 403 Uri uri, |
| 404 {bool skipLibraryWithPartOfTag: true}) { | 404 {bool skipLibraryWithPartOfTag: true}) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 422 // The input provider may put a trailing 0 byte when it reads a source | 422 // The input provider may put a trailing 0 byte when it reads a source |
| 423 // file, which confuses the package config parser. | 423 // file, which confuses the package config parser. |
| 424 if (packageConfigContents.length > 0 && | 424 if (packageConfigContents.length > 0 && |
| 425 packageConfigContents.last == 0) { | 425 packageConfigContents.last == 0) { |
| 426 packageConfigContents = packageConfigContents.sublist( | 426 packageConfigContents = packageConfigContents.sublist( |
| 427 0, packageConfigContents.length - 1); | 427 0, packageConfigContents.length - 1); |
| 428 } | 428 } |
| 429 packages = | 429 packages = |
| 430 new MapPackages(pkgs.parse(packageConfigContents, packageConfig)); | 430 new MapPackages(pkgs.parse(packageConfigContents, packageConfig)); |
| 431 }).catchError((error) { | 431 }).catchError((error) { |
| 432 reportErrorMessage( | 432 reporter.reportErrorMessage( |
| 433 NO_LOCATION_SPANNABLE, | 433 NO_LOCATION_SPANNABLE, |
| 434 MessageKind.INVALID_PACKAGE_CONFIG, | 434 MessageKind.INVALID_PACKAGE_CONFIG, |
| 435 {'uri': packageConfig, 'exception': error}); | 435 {'uri': packageConfig, 'exception': error}); |
| 436 packages = Packages.noPackages; | 436 packages = Packages.noPackages; |
| 437 }); | 437 }); |
| 438 } else { | 438 } else { |
| 439 if (packagesDiscoveryProvider == null) { | 439 if (packagesDiscoveryProvider == null) { |
| 440 packages = Packages.noPackages; | 440 packages = Packages.noPackages; |
| 441 } else { | 441 } else { |
| 442 return callUserPackagesDiscovery(uri).then((p) { | 442 return callUserPackagesDiscovery(uri).then((p) { |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 Future<Packages> callUserPackagesDiscovery(Uri uri) { | 532 Future<Packages> callUserPackagesDiscovery(Uri uri) { |
| 533 try { | 533 try { |
| 534 return userPackagesDiscoveryTask.measure( | 534 return userPackagesDiscoveryTask.measure( |
| 535 () => packagesDiscoveryProvider(uri)); | 535 () => packagesDiscoveryProvider(uri)); |
| 536 } catch (ex, s) { | 536 } catch (ex, s) { |
| 537 diagnoseCrashInUserCode('Uncaught exception in package discovery', ex, s); | 537 diagnoseCrashInUserCode('Uncaught exception in package discovery', ex, s); |
| 538 rethrow; | 538 rethrow; |
| 539 } | 539 } |
| 540 } | 540 } |
| 541 | 541 |
| 542 void diagnoseCrashInUserCode(String message, exception, stackTrace) { | |
| 543 hasCrashed = true; | |
| 544 print('$message: ${tryToString(exception)}'); | |
| 545 print(tryToString(stackTrace)); | |
| 546 } | |
| 547 | 542 |
| 548 fromEnvironment(String name) => environment[name]; | 543 fromEnvironment(String name) => environment[name]; |
| 549 | 544 |
| 550 LibraryInfo lookupLibraryInfo(String libraryName) { | 545 LibraryInfo lookupLibraryInfo(String libraryName) { |
| 551 return library_info.LIBRARIES[libraryName]; | 546 return library_info.LIBRARIES[libraryName]; |
| 552 } | 547 } |
| 553 } | 548 } |
| OLD | NEW |