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 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 if (reported.add(cls)) { | 358 if (reported.add(cls)) { |
357 List<ClassBuilder> involved = <ClassBuilder>[]; | 359 List<ClassBuilder> involved = <ClassBuilder>[]; |
358 for (ClassBuilder cls in cycles) { | 360 for (ClassBuilder cls in cycles) { |
359 if (realCycles.containsKey(cls)) { | 361 if (realCycles.containsKey(cls)) { |
360 involved.add(cls); | 362 involved.add(cls); |
361 reported.add(cls); | 363 reported.add(cls); |
362 } | 364 } |
363 } | 365 } |
364 String involvedString = | 366 String involvedString = |
365 involved.map((c) => c.fullNameForErrors).join("', '"); | 367 involved.map((c) => c.fullNameForErrors).join("', '"); |
366 cls.addCompileTimeError( | 368 cls.deprecated_addCompileTimeError( |
367 cls.charOffset, | 369 cls.charOffset, |
368 "'${cls.fullNameForErrors}' is a supertype of itself via " | 370 "'${cls.fullNameForErrors}' is a supertype of itself via " |
369 "'$involvedString'."); | 371 "'$involvedString'."); |
370 } | 372 } |
371 }); | 373 }); |
372 ticker.logMs("Found cycles"); | 374 ticker.logMs("Found cycles"); |
373 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([ | 375 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([ |
374 coreLibrary["bool"], | 376 coreLibrary["bool"], |
375 coreLibrary["int"], | 377 coreLibrary["int"], |
376 coreLibrary["num"], | 378 coreLibrary["num"], |
377 coreLibrary["double"], | 379 coreLibrary["double"], |
378 coreLibrary["String"], | 380 coreLibrary["String"], |
379 ]); | 381 ]); |
380 for (ClassBuilder cls in allClasses) { | 382 for (ClassBuilder cls in allClasses) { |
381 if (cls.library.loader != this) continue; | 383 if (cls.library.loader != this) continue; |
382 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>(); | 384 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>(); |
383 target.addDirectSupertype(cls, directSupertypes); | 385 target.addDirectSupertype(cls, directSupertypes); |
384 for (ClassBuilder supertype in directSupertypes) { | 386 for (ClassBuilder supertype in directSupertypes) { |
385 if (supertype is EnumBuilder) { | 387 if (supertype is EnumBuilder) { |
386 cls.addCompileTimeError( | 388 cls.deprecated_addCompileTimeError( |
387 cls.charOffset, | 389 cls.charOffset, |
388 "'${supertype.name}' is an enum and can't be extended or " | 390 "'${supertype.name}' is an enum and can't be extended or " |
389 "implemented."); | 391 "implemented."); |
390 } else if (!cls.library.mayImplementRestrictedTypes && | 392 } else if (!cls.library.mayImplementRestrictedTypes && |
391 blackListedClasses.contains(supertype)) { | 393 blackListedClasses.contains(supertype)) { |
392 cls.addCompileTimeError( | 394 cls.deprecated_addCompileTimeError( |
393 cls.charOffset, | 395 cls.charOffset, |
394 "'${supertype.name}' is restricted and can't be extended or " | 396 "'${supertype.name}' is restricted and can't be extended or " |
395 "implemented."); | 397 "implemented."); |
396 } | 398 } |
397 } | 399 } |
398 TypeBuilder mixedInType = cls.mixedInType; | 400 TypeBuilder mixedInType = cls.mixedInType; |
399 if (mixedInType != null) { | 401 if (mixedInType != null) { |
400 bool isClassBuilder = false; | 402 bool isClassBuilder = false; |
401 if (mixedInType is NamedTypeBuilder) { | 403 if (mixedInType is NamedTypeBuilder) { |
402 var builder = mixedInType.builder; | 404 var builder = mixedInType.builder; |
403 if (builder is ClassBuilder) { | 405 if (builder is ClassBuilder) { |
404 isClassBuilder = true; | 406 isClassBuilder = true; |
405 for (Builder constructory in builder.constructors.local.values) { | 407 for (Builder constructory in builder.constructors.local.values) { |
406 if (constructory.isConstructor && !constructory.isSynthetic) { | 408 if (constructory.isConstructor && !constructory.isSynthetic) { |
407 cls.addCompileTimeError( | 409 cls.deprecated_addCompileTimeError( |
408 cls.charOffset, | 410 cls.charOffset, |
409 "Can't use '${builder.fullNameForErrors}' as a mixin " | 411 "Can't use '${builder.fullNameForErrors}' as a mixin " |
410 "because it has constructors."); | 412 "because it has constructors."); |
411 builder.addCompileTimeError( | 413 builder.deprecated_addCompileTimeError( |
412 constructory.charOffset, | 414 constructory.charOffset, |
413 "This constructor prevents using " | 415 "This constructor prevents using " |
414 "'${builder.fullNameForErrors}' as a mixin."); | 416 "'${builder.fullNameForErrors}' as a mixin."); |
415 } | 417 } |
416 } | 418 } |
417 } | 419 } |
418 } | 420 } |
419 if (!isClassBuilder) { | 421 if (!isClassBuilder) { |
420 cls.addCompileTimeError(cls.charOffset, | 422 cls.deprecated_addCompileTimeError(cls.charOffset, |
421 "The type '${mixedInType.fullNameForErrors}' can't be mixed in."); | 423 "The type '${mixedInType.fullNameForErrors}' can't be mixed in."); |
422 } | 424 } |
423 } | 425 } |
424 } | 426 } |
425 ticker.logMs("Checked restricted supertypes"); | 427 ticker.logMs("Checked restricted supertypes"); |
426 } | 428 } |
427 | 429 |
428 void buildProgram() { | 430 void buildProgram() { |
429 builders.forEach((Uri uri, LibraryBuilder library) { | 431 builders.forEach((Uri uri, LibraryBuilder library) { |
430 if (library is SourceLibraryBuilder) { | 432 if (library is SourceLibraryBuilder) { |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 isSuper: isSuper, | 509 isSuper: isSuper, |
508 isStatic: isStatic, | 510 isStatic: isStatic, |
509 isConstructor: isConstructor, | 511 isConstructor: isConstructor, |
510 isTopLevel: isTopLevel); | 512 isTopLevel: isTopLevel); |
511 } | 513 } |
512 | 514 |
513 Expression throwCompileConstantError(Expression error) { | 515 Expression throwCompileConstantError(Expression error) { |
514 return target.backendTarget.throwCompileConstantError(coreTypes, error); | 516 return target.backendTarget.throwCompileConstantError(coreTypes, error); |
515 } | 517 } |
516 | 518 |
517 Expression buildCompileTimeError(String message, int offset) { | 519 Expression deprecated_buildCompileTimeError(String message, int offset) { |
518 return target.backendTarget | 520 return target.backendTarget |
519 .buildCompileTimeError(coreTypes, message, offset); | 521 .buildCompileTimeError(coreTypes, message, offset); |
520 } | 522 } |
521 } | 523 } |
OLD | NEW |