Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: pkg/front_end/lib/src/fasta/source/source_loader.dart

Issue 2862223002: Rewrite mixin application handling in Fasta. (Closed)
Patch Set: Update status file. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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:io'; 9 import 'dart:io';
10 import 'dart:typed_data' show Uint8List; 10 import 'dart:typed_data' show Uint8List;
(...skipping 14 matching lines...) Expand all
25 25
26 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart' 26 import 'package:front_end/src/fasta/type_inference/type_inference_engine.dart'
27 show TypeInferenceEngine; 27 show TypeInferenceEngine;
28 28
29 import 'package:kernel/ast.dart' show Program; 29 import 'package:kernel/ast.dart' show Program;
30 30
31 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; 31 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
32 32
33 import 'package:kernel/core_types.dart' show CoreTypes; 33 import 'package:kernel/core_types.dart' show CoreTypes;
34 34
35 import '../builder/builder.dart' show Builder, ClassBuilder, LibraryBuilder; 35 import '../builder/builder.dart'
36 show
37 Builder,
38 ClassBuilder,
39 EnumBuilder,
40 LibraryBuilder,
41 NamedTypeBuilder,
42 TypeBuilder;
36 43
37 import '../compiler_context.dart' show CompilerContext; 44 import '../compiler_context.dart' show CompilerContext;
38 45
39 import '../errors.dart' show inputError; 46 import '../errors.dart' show inputError;
40 47
41 import '../export.dart' show Export; 48 import '../export.dart' show Export;
42 49
43 import '../loader.dart' show Loader; 50 import '../loader.dart' show Loader;
44 51
45 import '../parser/class_member_parser.dart' show ClassMemberParser; 52 import '../parser/class_member_parser.dart' show ClassMemberParser;
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) { 365 realCycles.forEach((ClassBuilder cls, Set<ClassBuilder> cycles) {
359 target.breakCycle(cls); 366 target.breakCycle(cls);
360 if (reported.add(cls)) { 367 if (reported.add(cls)) {
361 List<ClassBuilder> involved = <ClassBuilder>[]; 368 List<ClassBuilder> involved = <ClassBuilder>[];
362 for (ClassBuilder cls in cycles) { 369 for (ClassBuilder cls in cycles) {
363 if (realCycles.containsKey(cls)) { 370 if (realCycles.containsKey(cls)) {
364 involved.add(cls); 371 involved.add(cls);
365 reported.add(cls); 372 reported.add(cls);
366 } 373 }
367 } 374 }
375 String involvedString =
376 involved.map((c) => c.fullNameForErrors).join("', '");
368 cls.addCompileTimeError( 377 cls.addCompileTimeError(
369 cls.charOffset, 378 cls.charOffset,
370 "'${cls.name}' is a supertype of " 379 "'${cls.fullNameForErrors}' is a supertype of itself via "
371 "itself via '${involved.map((c) => c.name).join(' ')}'."); 380 "'$involvedString'.");
372 } 381 }
373 }); 382 });
374 ticker.logMs("Found cycles"); 383 ticker.logMs("Found cycles");
384 Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>.from([
385 coreLibrary["bool"],
386 coreLibrary["int"],
387 coreLibrary["num"],
388 coreLibrary["double"],
389 coreLibrary["String"],
390 ]);
391 for (ClassBuilder cls in allClasses) {
392 if (cls.library.loader != this) continue;
393 Set<ClassBuilder> directSupertypes = new Set<ClassBuilder>();
394 target.addDirectSupertype(cls, directSupertypes);
395 for (ClassBuilder supertype in directSupertypes) {
396 if (supertype is EnumBuilder) {
397 cls.addCompileTimeError(
398 cls.charOffset,
399 "'${supertype.name}' is an enum and can't be extended or "
400 "implemented.");
401 } else if (cls.library != coreLibrary &&
402 blackListedClasses.contains(supertype)) {
403 cls.addCompileTimeError(
404 cls.charOffset,
405 "'${supertype.name}' is restricted and can't be extended or "
406 "implemented.");
407 }
408 }
409 TypeBuilder mixedInType = cls.mixedInType;
410 if (mixedInType != null) {
411 bool isClassBuilder = false;
412 if (mixedInType is NamedTypeBuilder) {
413 var builder = mixedInType.builder;
414 if (builder is ClassBuilder) {
415 isClassBuilder = true;
416 for (Builder constructory in builder.constructors.local.values) {
417 if (constructory.isConstructor && !constructory.isSynthetic) {
418 cls.addCompileTimeError(
419 cls.charOffset,
420 "Can't use '${builder.fullNameForErrors}' as a mixin "
421 "because it has constructors.");
422 builder.addCompileTimeError(
423 constructory.charOffset,
424 "This constructor prevents using "
425 "'${builder.fullNameForErrors}' as a mixin.");
426 }
427 }
428 }
429 }
430 if (!isClassBuilder) {
431 cls.addCompileTimeError(cls.charOffset,
432 "The type '${mixedInType.fullNameForErrors}' can't be mixed in.");
433 }
434 }
435 }
436 ticker.logMs("Checked restricted supertypes");
375 } 437 }
376 438
377 void buildProgram() { 439 void buildProgram() {
378 builders.forEach((Uri uri, LibraryBuilder library) { 440 builders.forEach((Uri uri, LibraryBuilder library) {
379 if (library is SourceLibraryBuilder) { 441 if (library is SourceLibraryBuilder) {
380 libraries.add(library.build(coreLibrary)); 442 libraries.add(library.build(coreLibrary));
381 } 443 }
382 }); 444 });
383 ticker.logMs("Built program"); 445 ticker.logMs("Built program");
384 } 446 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 /// Performs the second phase of top level initializer inference, which is to 482 /// Performs the second phase of top level initializer inference, which is to
421 /// visit fields and top level variables in topologically-sorted order and 483 /// visit fields and top level variables in topologically-sorted order and
422 /// assign their types. 484 /// assign their types.
423 void performInitializerInference() { 485 void performInitializerInference() {
424 typeInferenceEngine.finishTopLevel(); 486 typeInferenceEngine.finishTopLevel();
425 ticker.logMs("Performed initializer inference"); 487 ticker.logMs("Performed initializer inference");
426 } 488 }
427 489
428 List<Uri> getDependencies() => sourceBytes.keys.toList(); 490 List<Uri> getDependencies() => sourceBytes.keys.toList();
429 } 491 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/source/source_class_builder.dart ('k') | pkg/front_end/testcases/mixin.dart.direct.expect » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698