| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 fasta.source_loader; | 5 library fasta.source_loader; |
| 6 | 6 |
| 7 import 'dart:async' show Future; | 7 import 'dart:async' show Future; |
| 8 | 8 |
| 9 import 'dart:typed_data' show Uint8List; | 9 import 'dart:typed_data' show Uint8List; |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 show | 33 show |
| 34 Builder, | 34 Builder, |
| 35 ClassBuilder, | 35 ClassBuilder, |
| 36 EnumBuilder, | 36 EnumBuilder, |
| 37 LibraryBuilder, | 37 LibraryBuilder, |
| 38 NamedTypeBuilder, | 38 NamedTypeBuilder, |
| 39 TypeBuilder; | 39 TypeBuilder; |
| 40 | 40 |
| 41 import '../compiler_context.dart' show CompilerContext; | 41 import '../compiler_context.dart' show CompilerContext; |
| 42 | 42 |
| 43 import '../errors.dart' show inputError; | 43 import '../deprecated_problems.dart' show deprecated_inputError; |
| 44 | 44 |
| 45 import '../export.dart' show Export; | 45 import '../export.dart' show Export; |
| 46 | 46 |
| 47 import '../loader.dart' show Loader; | 47 import '../loader.dart' show Loader; |
| 48 | 48 |
| 49 import '../parser/class_member_parser.dart' show ClassMemberParser; | 49 import '../parser/class_member_parser.dart' show ClassMemberParser; |
| 50 | 50 |
| 51 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan; | 51 import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan; |
| 52 | 52 |
| 53 import 'diet_listener.dart' show DietListener; | 53 import 'diet_listener.dart' show DietListener; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 74 TypeInferenceEngine typeInferenceEngine; | 74 TypeInferenceEngine typeInferenceEngine; |
| 75 | 75 |
| 76 Instrumentation instrumentation; | 76 Instrumentation instrumentation; |
| 77 | 77 |
| 78 SourceLoader(this.fileSystem, KernelTarget target) : super(target); | 78 SourceLoader(this.fileSystem, KernelTarget target) : super(target); |
| 79 | 79 |
| 80 Future<Token> tokenize(SourceLibraryBuilder library, | 80 Future<Token> tokenize(SourceLibraryBuilder library, |
| 81 {bool suppressLexicalErrors: false}) async { | 81 {bool suppressLexicalErrors: false}) async { |
| 82 Uri uri = library.fileUri; | 82 Uri uri = library.fileUri; |
| 83 if (uri == null || uri.scheme != "file") { | 83 if (uri == null || uri.scheme != "file") { |
| 84 return inputError(library.uri, -1, "Not found: ${library.uri}."); | 84 return deprecated_inputError( |
| 85 library.uri, -1, "Not found: ${library.uri}."); |
| 85 } | 86 } |
| 86 | 87 |
| 87 // Get the library text from the cache, or read from the file system. | 88 // Get the library text from the cache, or read from the file system. |
| 88 List<int> bytes = sourceBytes[uri]; | 89 List<int> bytes = sourceBytes[uri]; |
| 89 if (bytes == null) { | 90 if (bytes == null) { |
| 90 try { | 91 try { |
| 91 List<int> rawBytes = await fileSystem.entityForUri(uri).readAsBytes(); | 92 List<int> rawBytes = await fileSystem.entityForUri(uri).readAsBytes(); |
| 92 Uint8List zeroTerminatedBytes = new Uint8List(rawBytes.length + 1); | 93 Uint8List zeroTerminatedBytes = new Uint8List(rawBytes.length + 1); |
| 93 zeroTerminatedBytes.setRange(0, rawBytes.length, rawBytes); | 94 zeroTerminatedBytes.setRange(0, rawBytes.length, rawBytes); |
| 94 bytes = zeroTerminatedBytes; | 95 bytes = zeroTerminatedBytes; |
| 95 sourceBytes[uri] = bytes; | 96 sourceBytes[uri] = bytes; |
| 96 } on FileSystemException catch (e) { | 97 } on FileSystemException catch (e) { |
| 97 return inputError(uri, -1, e.message); | 98 return deprecated_inputError(uri, -1, e.message); |
| 98 } | 99 } |
| 99 } | 100 } |
| 100 | 101 |
| 101 byteCount += bytes.length - 1; | 102 byteCount += bytes.length - 1; |
| 102 ScannerResult result = scan(bytes); | 103 ScannerResult result = scan(bytes); |
| 103 Token token = result.tokens; | 104 Token token = result.tokens; |
| 104 if (!suppressLexicalErrors) { | 105 if (!suppressLexicalErrors) { |
| 105 List<int> source = getSource(bytes); | 106 List<int> source = getSource(bytes); |
| 106 target.addSourceInformation(library.fileUri, result.lineStarts, source); | 107 target.addSourceInformation(library.fileUri, result.lineStarts, source); |
| 107 } | 108 } |
| 108 while (token is ErrorToken) { | 109 while (token is ErrorToken) { |
| 109 if (!suppressLexicalErrors) { | 110 if (!suppressLexicalErrors) { |
| 110 ErrorToken error = token; | 111 ErrorToken error = token; |
| 111 library.addCompileTimeError(token.charOffset, error.assertionMessage, | 112 library.deprecated_addCompileTimeError( |
| 113 token.charOffset, error.assertionMessage, |
| 112 fileUri: uri); | 114 fileUri: uri); |
| 113 } | 115 } |
| 114 token = token.next; | 116 token = token.next; |
| 115 } | 117 } |
| 116 return token; | 118 return token; |
| 117 } | 119 } |
| 118 | 120 |
| 119 List<int> getSource(List<int> bytes) { | 121 List<int> getSource(List<int> bytes) { |
| 120 if (excludeSource) return const <int>[]; | 122 if (excludeSource) return const <int>[]; |
| 121 | 123 |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 if (reported.add(cls)) { | 366 if (reported.add(cls)) { |
| 365 List<ClassBuilder> involved = <ClassBuilder>[]; | 367 List<ClassBuilder> involved = <ClassBuilder>[]; |
| 366 for (ClassBuilder cls in cycles) { | 368 for (ClassBuilder cls in cycles) { |
| 367 if (realCycles.containsKey(cls)) { | 369 if (realCycles.containsKey(cls)) { |
| 368 involved.add(cls); | 370 involved.add(cls); |
| 369 reported.add(cls); | 371 reported.add(cls); |
| 370 } | 372 } |
| 371 } | 373 } |
| 372 String involvedString = | 374 String involvedString = |
| 373 involved.map((c) => c.fullNameForErrors).join("', '"); | 375 involved.map((c) => c.fullNameForErrors).join("', '"); |
| 374 cls.addCompileTimeError( | 376 cls.deprecated_addCompileTimeError( |
| 375 cls.charOffset, | 377 cls.charOffset, |
| 376 "'${cls.fullNameForErrors}' is a supertype of itself via " | 378 "'${cls.fullNameForErrors}' is a supertype of itself via " |
| 377 "'$involvedString'."); | 379 "'$involvedString'."); |
| 378 } | 380 } |
| 379 }); | 381 }); |
| 380 ticker.logMs("Found cycles"); | 382 ticker.logMs("Found cycles"); |
| 381 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([ | 383 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([ |
| 382 coreLibrary["bool"], | 384 coreLibrary["bool"], |
| 383 coreLibrary["int"], | 385 coreLibrary["int"], |
| 384 coreLibrary["num"], | 386 coreLibrary["num"], |
| 385 coreLibrary["double"], | 387 coreLibrary["double"], |
| 386 coreLibrary["String"], | 388 coreLibrary["String"], |
| 387 ]); | 389 ]); |
| 388 for (ClassBuilder cls in allClasses) { | 390 for (ClassBuilder cls in allClasses) { |
| 389 if (cls.library.loader != this) continue; | 391 if (cls.library.loader != this) continue; |
| 390 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>(); | 392 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>(); |
| 391 target.addDirectSupertype(cls, directSupertypes); | 393 target.addDirectSupertype(cls, directSupertypes); |
| 392 for (ClassBuilder supertype in directSupertypes) { | 394 for (ClassBuilder supertype in directSupertypes) { |
| 393 if (supertype is EnumBuilder) { | 395 if (supertype is EnumBuilder) { |
| 394 cls.addCompileTimeError( | 396 cls.deprecated_addCompileTimeError( |
| 395 cls.charOffset, | 397 cls.charOffset, |
| 396 "'${supertype.name}' is an enum and can't be extended or " | 398 "'${supertype.name}' is an enum and can't be extended or " |
| 397 "implemented."); | 399 "implemented."); |
| 398 } else if (!canImplementRestrictedTypes(cls.library) && | 400 } else if (!canImplementRestrictedTypes(cls.library) && |
| 399 blackListedClasses.contains(supertype)) { | 401 blackListedClasses.contains(supertype)) { |
| 400 cls.addCompileTimeError( | 402 cls.deprecated_addCompileTimeError( |
| 401 cls.charOffset, | 403 cls.charOffset, |
| 402 "'${supertype.name}' is restricted and can't be extended or " | 404 "'${supertype.name}' is restricted and can't be extended or " |
| 403 "implemented."); | 405 "implemented."); |
| 404 } | 406 } |
| 405 } | 407 } |
| 406 TypeBuilder mixedInType = cls.mixedInType; | 408 TypeBuilder mixedInType = cls.mixedInType; |
| 407 if (mixedInType != null) { | 409 if (mixedInType != null) { |
| 408 bool isClassBuilder = false; | 410 bool isClassBuilder = false; |
| 409 if (mixedInType is NamedTypeBuilder) { | 411 if (mixedInType is NamedTypeBuilder) { |
| 410 var builder = mixedInType.builder; | 412 var builder = mixedInType.builder; |
| 411 if (builder is ClassBuilder) { | 413 if (builder is ClassBuilder) { |
| 412 isClassBuilder = true; | 414 isClassBuilder = true; |
| 413 for (Builder constructory in builder.constructors.local.values) { | 415 for (Builder constructory in builder.constructors.local.values) { |
| 414 if (constructory.isConstructor && !constructory.isSynthetic) { | 416 if (constructory.isConstructor && !constructory.isSynthetic) { |
| 415 cls.addCompileTimeError( | 417 cls.deprecated_addCompileTimeError( |
| 416 cls.charOffset, | 418 cls.charOffset, |
| 417 "Can't use '${builder.fullNameForErrors}' as a mixin " | 419 "Can't use '${builder.fullNameForErrors}' as a mixin " |
| 418 "because it has constructors."); | 420 "because it has constructors."); |
| 419 builder.addCompileTimeError( | 421 builder.deprecated_addCompileTimeError( |
| 420 constructory.charOffset, | 422 constructory.charOffset, |
| 421 "This constructor prevents using " | 423 "This constructor prevents using " |
| 422 "'${builder.fullNameForErrors}' as a mixin."); | 424 "'${builder.fullNameForErrors}' as a mixin."); |
| 423 } | 425 } |
| 424 } | 426 } |
| 425 } | 427 } |
| 426 } | 428 } |
| 427 if (!isClassBuilder) { | 429 if (!isClassBuilder) { |
| 428 cls.addCompileTimeError(cls.charOffset, | 430 cls.deprecated_addCompileTimeError(cls.charOffset, |
| 429 "The type '${mixedInType.fullNameForErrors}' can't be mixed in."); | 431 "The type '${mixedInType.fullNameForErrors}' can't be mixed in."); |
| 430 } | 432 } |
| 431 } | 433 } |
| 432 } | 434 } |
| 433 ticker.logMs("Checked restricted supertypes"); | 435 ticker.logMs("Checked restricted supertypes"); |
| 434 } | 436 } |
| 435 | 437 |
| 436 void buildProgram() { | 438 void buildProgram() { |
| 437 builders.forEach((Uri uri, LibraryBuilder library) { | 439 builders.forEach((Uri uri, LibraryBuilder library) { |
| 438 if (library is SourceLibraryBuilder) { | 440 if (library is SourceLibraryBuilder) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 isSuper: isSuper, | 517 isSuper: isSuper, |
| 516 isStatic: isStatic, | 518 isStatic: isStatic, |
| 517 isConstructor: isConstructor, | 519 isConstructor: isConstructor, |
| 518 isTopLevel: isTopLevel); | 520 isTopLevel: isTopLevel); |
| 519 } | 521 } |
| 520 | 522 |
| 521 Expression throwCompileConstantError(Expression error) { | 523 Expression throwCompileConstantError(Expression error) { |
| 522 return target.backendTarget.throwCompileConstantError(coreTypes, error); | 524 return target.backendTarget.throwCompileConstantError(coreTypes, error); |
| 523 } | 525 } |
| 524 | 526 |
| 525 Expression buildCompileTimeError(String message, int offset) { | 527 Expression deprecated_buildCompileTimeError(String message, int offset) { |
| 526 return target.backendTarget | 528 return target.backendTarget |
| 527 .buildCompileTimeError(coreTypes, message, offset); | 529 .buildCompileTimeError(coreTypes, message, offset); |
| 528 } | 530 } |
| 529 } | 531 } |
| OLD | NEW |