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 |
11 import 'package:front_end/src/base/instrumentation.dart' show Instrumentation; | 11 import 'package:front_end/src/base/instrumentation.dart' show Instrumentation; |
12 | 12 |
13 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' | 13 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
14 show KernelTypeInferrer; | 14 show KernelTypeInferrer; |
15 | 15 |
16 import 'package:front_end/src/fasta/kernel/kernel_target.dart' | 16 import 'package:front_end/src/fasta/kernel/kernel_target.dart' |
17 show KernelTarget; | 17 show KernelTarget; |
18 | 18 |
19 import 'package:kernel/ast.dart' show Program; | 19 import 'package:kernel/ast.dart' show Program; |
20 | 20 |
21 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; | 21 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; |
22 | 22 |
23 import 'package:kernel/core_types.dart' show CoreTypes; | 23 import 'package:kernel/core_types.dart' show CoreTypes; |
24 | 24 |
25 import '../builder/builder.dart' | 25 import '../builder/builder.dart' |
26 show Builder, ClassBuilder, EnumBuilder, LibraryBuilder; | 26 show |
| 27 Builder, |
| 28 ClassBuilder, |
| 29 EnumBuilder, |
| 30 LibraryBuilder, |
| 31 NamedTypeBuilder, |
| 32 TypeBuilder; |
27 | 33 |
28 import '../compiler_context.dart' show CompilerContext; | 34 import '../compiler_context.dart' show CompilerContext; |
29 | 35 |
30 import '../errors.dart' show inputError; | 36 import '../errors.dart' show inputError; |
31 | 37 |
32 import '../export.dart' show Export; | 38 import '../export.dart' show Export; |
33 | 39 |
34 import '../loader.dart' show Loader; | 40 import '../loader.dart' show Loader; |
35 | 41 |
36 import '../parser/class_member_parser.dart' show ClassMemberParser; | 42 import '../parser/class_member_parser.dart' show ClassMemberParser; |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) { | 335 realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) { |
330 target.breakCycle(cls); | 336 target.breakCycle(cls); |
331 if (reported.add(cls)) { | 337 if (reported.add(cls)) { |
332 List<ClassBuilder> involved = <ClassBuilder>[]; | 338 List<ClassBuilder> involved = <ClassBuilder>[]; |
333 for (ClassBuilder cls in cycles) { | 339 for (ClassBuilder cls in cycles) { |
334 if (realCycles.containsKey(cls)) { | 340 if (realCycles.containsKey(cls)) { |
335 involved.add(cls); | 341 involved.add(cls); |
336 reported.add(cls); | 342 reported.add(cls); |
337 } | 343 } |
338 } | 344 } |
| 345 String involvedString = |
| 346 involved.map((c) => c.fullNameForErrors).join("', '"); |
339 cls.addCompileTimeError( | 347 cls.addCompileTimeError( |
340 cls.charOffset, | 348 cls.charOffset, |
341 "'${cls.name}' is a supertype of " | 349 "'${cls.fullNameForErrors}' is a supertype of itself via " |
342 "itself via '${involved.map((c) => c.name).join(' ')}'."); | 350 "'$involvedString'."); |
343 } | 351 } |
344 }); | 352 }); |
345 ticker.logMs("Found cycles"); | 353 ticker.logMs("Found cycles"); |
346 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([ | 354 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([ |
347 coreLibrary["bool"], | 355 coreLibrary["bool"], |
348 coreLibrary["int"], | 356 coreLibrary["int"], |
349 coreLibrary["num"], | 357 coreLibrary["num"], |
350 coreLibrary["double"], | 358 coreLibrary["double"], |
351 coreLibrary["String"], | 359 coreLibrary["String"], |
352 ]); | 360 ]); |
353 for (ClassBuilder cls in allClasses) { | 361 for (ClassBuilder cls in allClasses) { |
| 362 if (cls.library.loader != this) continue; |
354 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>(); | 363 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>(); |
355 target.addDirectSupertype(cls, directSupertypes); | 364 target.addDirectSupertype(cls, directSupertypes); |
356 for (ClassBuilder supertype in directSupertypes) { | 365 for (ClassBuilder supertype in directSupertypes) { |
357 if (supertype is EnumBuilder) { | 366 if (supertype is EnumBuilder) { |
358 cls.addCompileTimeError( | 367 cls.addCompileTimeError( |
359 cls.charOffset, | 368 cls.charOffset, |
360 "'${supertype.name}' is an enum and can't be extended or " | 369 "'${supertype.name}' is an enum and can't be extended or " |
361 "implemented."); | 370 "implemented."); |
362 } else if (cls.library != coreLibrary && | 371 } else if (cls.library != coreLibrary && |
363 blackListedClasses.contains(supertype)) { | 372 blackListedClasses.contains(supertype)) { |
364 cls.addCompileTimeError( | 373 cls.addCompileTimeError( |
365 cls.charOffset, | 374 cls.charOffset, |
366 "'${supertype.name}' is restricted and can't be extended or " | 375 "'${supertype.name}' is restricted and can't be extended or " |
367 "implemented."); | 376 "implemented."); |
368 } | 377 } |
369 } | 378 } |
| 379 TypeBuilder mixedInType = cls.mixedInType; |
| 380 if (mixedInType != null) { |
| 381 bool isClassBuilder = false; |
| 382 if (mixedInType is NamedTypeBuilder) { |
| 383 var builder = mixedInType.builder; |
| 384 if (builder is ClassBuilder) { |
| 385 isClassBuilder = true; |
| 386 for (Builder constructory in builder.constructors.local.values) { |
| 387 if (constructory.isConstructor && !constructory.isSynthetic) { |
| 388 cls.addCompileTimeError( |
| 389 cls.charOffset, |
| 390 "Can't use '${builder.fullNameForErrors}' as a mixin " |
| 391 "because it has constructors."); |
| 392 builder.addCompileTimeError( |
| 393 constructory.charOffset, |
| 394 "This constructor prevents using " |
| 395 "'${builder.fullNameForErrors}' as a mixin."); |
| 396 } |
| 397 } |
| 398 } |
| 399 } |
| 400 if (!isClassBuilder) { |
| 401 cls.addCompileTimeError(cls.charOffset, |
| 402 "The type '${mixedInType.fullNameForErrors}' can't be mixed in."); |
| 403 } |
| 404 } |
370 } | 405 } |
371 ticker.logMs("Checked restricted supertypes"); | 406 ticker.logMs("Checked restricted supertypes"); |
372 } | 407 } |
373 | 408 |
374 void buildProgram() { | 409 void buildProgram() { |
375 builders.forEach((Uri uri, LibraryBuilder library) { | 410 builders.forEach((Uri uri, LibraryBuilder library) { |
376 if (library is SourceLibraryBuilder) { | 411 if (library is SourceLibraryBuilder) { |
377 libraries.add(library.build(coreLibrary)); | 412 libraries.add(library.build(coreLibrary)); |
378 } | 413 } |
379 }); | 414 }); |
(...skipping 10 matching lines...) Expand all Loading... |
390 void checkOverrides(List<SourceClassBuilder> sourceClasses) { | 425 void checkOverrides(List<SourceClassBuilder> sourceClasses) { |
391 assert(hierarchy != null); | 426 assert(hierarchy != null); |
392 for (SourceClassBuilder builder in sourceClasses) { | 427 for (SourceClassBuilder builder in sourceClasses) { |
393 builder.checkOverrides(hierarchy); | 428 builder.checkOverrides(hierarchy); |
394 } | 429 } |
395 ticker.logMs("Checked overrides"); | 430 ticker.logMs("Checked overrides"); |
396 } | 431 } |
397 | 432 |
398 List<Uri> getDependencies() => sourceBytes.keys.toList(); | 433 List<Uri> getDependencies() => sourceBytes.keys.toList(); |
399 } | 434 } |
OLD | NEW |