| 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.kernel_library_builder; | 5 library fasta.kernel_library_builder; |
| 6 | 6 |
| 7 import 'package:front_end/src/scanner/token.dart' show Token; | 7 import 'package:front_end/src/scanner/token.dart' show Token; |
| 8 | 8 |
| 9 import 'package:kernel/ast.dart'; | 9 import 'package:kernel/ast.dart'; |
| 10 | 10 |
| 11 import 'package:kernel/clone.dart' show CloneVisitor; | 11 import 'package:kernel/clone.dart' show CloneVisitor; |
| 12 | 12 |
| 13 import '../errors.dart' show internalError; | 13 import '../deprecated_problems.dart' show deprecated_internalProblem; |
| 14 | 14 |
| 15 import '../loader.dart' show Loader; | 15 import '../loader.dart' show Loader; |
| 16 | 16 |
| 17 import '../modifier.dart' | 17 import '../modifier.dart' |
| 18 show abstractMask, namedMixinApplicationMask, staticMask; | 18 show abstractMask, namedMixinApplicationMask, staticMask; |
| 19 | 19 |
| 20 import '../source/source_library_builder.dart' | 20 import '../source/source_library_builder.dart' |
| 21 show DeclarationBuilder, SourceLibraryBuilder; | 21 show DeclarationBuilder, SourceLibraryBuilder; |
| 22 | 22 |
| 23 import '../source/source_class_builder.dart' show SourceClassBuilder; | 23 import '../source/source_class_builder.dart' show SourceClassBuilder; |
| 24 | 24 |
| 25 import '../util/relativize.dart' show relativizeUri; | 25 import '../util/relativize.dart' show relativizeUri; |
| 26 | 26 |
| 27 import 'kernel_builder.dart' | 27 import 'kernel_builder.dart' |
| 28 show | 28 show |
| 29 AccessErrorBuilder, | 29 deprecated_AccessErrorBuilder, |
| 30 Builder, | 30 Builder, |
| 31 BuiltinTypeBuilder, | 31 BuiltinTypeBuilder, |
| 32 ClassBuilder, | 32 ClassBuilder, |
| 33 ConstructorReferenceBuilder, | 33 ConstructorReferenceBuilder, |
| 34 FormalParameterBuilder, | 34 FormalParameterBuilder, |
| 35 InvalidTypeBuilder, | 35 InvalidTypeBuilder, |
| 36 KernelConstructorBuilder, | 36 KernelConstructorBuilder, |
| 37 KernelEnumBuilder, | 37 KernelEnumBuilder, |
| 38 KernelFieldBuilder, | 38 KernelFieldBuilder, |
| 39 KernelFormalParameterBuilder, | 39 KernelFormalParameterBuilder, |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 while (member != null) { | 141 while (member != null) { |
| 142 member.parent = cls; | 142 member.parent = cls; |
| 143 member = member.next; | 143 member = member.next; |
| 144 } | 144 } |
| 145 } | 145 } |
| 146 | 146 |
| 147 void setParentAndCheckConflicts(String name, MemberBuilder member) { | 147 void setParentAndCheckConflicts(String name, MemberBuilder member) { |
| 148 if (typeVariablesByName != null) { | 148 if (typeVariablesByName != null) { |
| 149 TypeVariableBuilder tv = typeVariablesByName[name]; | 149 TypeVariableBuilder tv = typeVariablesByName[name]; |
| 150 if (tv != null) { | 150 if (tv != null) { |
| 151 cls.addCompileTimeError( | 151 cls.deprecated_addCompileTimeError( |
| 152 member.charOffset, "Conflict with type variable '$name'."); | 152 member.charOffset, "Conflict with type variable '$name'."); |
| 153 cls.addCompileTimeError(tv.charOffset, "This is the type variable."); | 153 cls.deprecated_addCompileTimeError( |
| 154 tv.charOffset, "This is the type variable."); |
| 154 } | 155 } |
| 155 } | 156 } |
| 156 setParent(name, member); | 157 setParent(name, member); |
| 157 } | 158 } |
| 158 | 159 |
| 159 members.forEach(setParentAndCheckConflicts); | 160 members.forEach(setParentAndCheckConflicts); |
| 160 constructors.forEach(setParentAndCheckConflicts); | 161 constructors.forEach(setParentAndCheckConflicts); |
| 161 // Formally, a setter has the name `id=`, so it can never conflict with a | 162 // Formally, a setter has the name `id=`, so it can never conflict with a |
| 162 // type variable. | 163 // type variable. |
| 163 setters.forEach(setParent); | 164 setters.forEach(setParent); |
| 164 addBuilder(className, cls, charOffset); | 165 addBuilder(className, cls, charOffset); |
| 165 } | 166 } |
| 166 | 167 |
| 167 Map<String, TypeVariableBuilder> checkTypeVariables( | 168 Map<String, TypeVariableBuilder> checkTypeVariables( |
| 168 List<TypeVariableBuilder> typeVariables, Builder owner) { | 169 List<TypeVariableBuilder> typeVariables, Builder owner) { |
| 169 if (typeVariables?.isEmpty ?? true) return null; | 170 if (typeVariables?.isEmpty ?? true) return null; |
| 170 Map<String, TypeVariableBuilder> typeVariablesByName = | 171 Map<String, TypeVariableBuilder> typeVariablesByName = |
| 171 <String, TypeVariableBuilder>{}; | 172 <String, TypeVariableBuilder>{}; |
| 172 for (TypeVariableBuilder tv in typeVariables) { | 173 for (TypeVariableBuilder tv in typeVariables) { |
| 173 TypeVariableBuilder existing = typeVariablesByName[tv.name]; | 174 TypeVariableBuilder existing = typeVariablesByName[tv.name]; |
| 174 if (existing != null) { | 175 if (existing != null) { |
| 175 addCompileTimeError(tv.charOffset, | 176 deprecated_addCompileTimeError(tv.charOffset, |
| 176 "A type variable can't have the same name as another."); | 177 "A type variable can't have the same name as another."); |
| 177 addCompileTimeError( | 178 deprecated_addCompileTimeError( |
| 178 existing.charOffset, "The other type variable named '${tv.name}'."); | 179 existing.charOffset, "The other type variable named '${tv.name}'."); |
| 179 } else { | 180 } else { |
| 180 typeVariablesByName[tv.name] = tv; | 181 typeVariablesByName[tv.name] = tv; |
| 181 if (owner is ClassBuilder) { | 182 if (owner is ClassBuilder) { |
| 182 // Only classes and type variables can't have the same name. See | 183 // Only classes and type variables can't have the same name. See |
| 183 // [#29555](https://github.com/dart-lang/sdk/issues/29555). | 184 // [#29555](https://github.com/dart-lang/sdk/issues/29555). |
| 184 if (tv.name == owner.name) { | 185 if (tv.name == owner.name) { |
| 185 addCompileTimeError( | 186 deprecated_addCompileTimeError( |
| 186 tv.charOffset, | 187 tv.charOffset, |
| 187 "A type variable can't have the same name as its enclosing " | 188 "A type variable can't have the same name as its enclosing " |
| 188 "declaration."); | 189 "declaration."); |
| 189 } | 190 } |
| 190 } | 191 } |
| 191 } | 192 } |
| 192 } | 193 } |
| 193 return typeVariablesByName; | 194 return typeVariablesByName; |
| 194 } | 195 } |
| 195 | 196 |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 int index = name.indexOf("."); | 490 int index = name.indexOf("."); |
| 490 if (startsWithClassName && index == className.length) { | 491 if (startsWithClassName && index == className.length) { |
| 491 // Named constructor or factory. | 492 // Named constructor or factory. |
| 492 return name.substring(index + 1); | 493 return name.substring(index + 1); |
| 493 } | 494 } |
| 494 if (index == -1) { | 495 if (index == -1) { |
| 495 // A legal name for a regular method, but not for a constructor. | 496 // A legal name for a regular method, but not for a constructor. |
| 496 return null; | 497 return null; |
| 497 } | 498 } |
| 498 String suffix = name.substring(index + 1); | 499 String suffix = name.substring(index + 1); |
| 499 addCompileTimeError( | 500 deprecated_addCompileTimeError( |
| 500 charOffset, | 501 charOffset, |
| 501 "'$name' isn't a legal method name.\n" | 502 "'$name' isn't a legal method name.\n" |
| 502 "Did you mean '$className.$suffix'?"); | 503 "Did you mean '$className.$suffix'?"); |
| 503 return suffix; | 504 return suffix; |
| 504 } | 505 } |
| 505 | 506 |
| 506 void addProcedure( | 507 void addProcedure( |
| 507 List<MetadataBuilder> metadata, | 508 List<MetadataBuilder> metadata, |
| 508 int modifiers, | 509 int modifiers, |
| 509 KernelTypeBuilder returnType, | 510 KernelTypeBuilder returnType, |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 library.addMember(builder.build(this)..isStatic = true); | 668 library.addMember(builder.build(this)..isStatic = true); |
| 668 } else if (builder is KernelFunctionTypeAliasBuilder) { | 669 } else if (builder is KernelFunctionTypeAliasBuilder) { |
| 669 library.addTypedef(builder.build(this)); | 670 library.addTypedef(builder.build(this)); |
| 670 } else if (builder is KernelEnumBuilder) { | 671 } else if (builder is KernelEnumBuilder) { |
| 671 library.addClass(builder.build(this, coreLibrary)); | 672 library.addClass(builder.build(this, coreLibrary)); |
| 672 } else if (builder is PrefixBuilder) { | 673 } else if (builder is PrefixBuilder) { |
| 673 // Ignored. Kernel doesn't represent prefixes. | 674 // Ignored. Kernel doesn't represent prefixes. |
| 674 } else if (builder is BuiltinTypeBuilder) { | 675 } else if (builder is BuiltinTypeBuilder) { |
| 675 // Nothing needed. | 676 // Nothing needed. |
| 676 } else { | 677 } else { |
| 677 internalError("Unhandled builder: ${builder.runtimeType}"); | 678 deprecated_internalProblem("Unhandled builder: ${builder.runtimeType}"); |
| 678 } | 679 } |
| 679 } | 680 } |
| 680 | 681 |
| 681 @override | 682 @override |
| 682 Library build(LibraryBuilder coreLibrary) { | 683 Library build(LibraryBuilder coreLibrary) { |
| 683 super.build(coreLibrary); | 684 super.build(coreLibrary); |
| 684 library.name = name; | 685 library.name = name; |
| 685 library.procedures.sort(compareProcedures); | 686 library.procedures.sort(compareProcedures); |
| 686 return library; | 687 return library; |
| 687 } | 688 } |
| 688 | 689 |
| 689 @override | 690 @override |
| 690 Builder buildAmbiguousBuilder( | 691 Builder buildAmbiguousBuilder( |
| 691 String name, Builder builder, Builder other, int charOffset, | 692 String name, Builder builder, Builder other, int charOffset, |
| 692 {bool isExport: false, bool isImport: false}) { | 693 {bool isExport: false, bool isImport: false}) { |
| 693 // TODO(ahe): Can I move this to Scope or Prefix? | 694 // TODO(ahe): Can I move this to Scope or Prefix? |
| 694 if (builder == other) return builder; | 695 if (builder == other) return builder; |
| 695 if (builder is InvalidTypeBuilder) return builder; | 696 if (builder is InvalidTypeBuilder) return builder; |
| 696 if (other is InvalidTypeBuilder) return other; | 697 if (other is InvalidTypeBuilder) return other; |
| 697 if (builder is AccessErrorBuilder) { | 698 if (builder is deprecated_AccessErrorBuilder) { |
| 698 AccessErrorBuilder error = builder; | 699 deprecated_AccessErrorBuilder error = builder; |
| 699 builder = error.builder; | 700 builder = error.builder; |
| 700 } | 701 } |
| 701 if (other is AccessErrorBuilder) { | 702 if (other is deprecated_AccessErrorBuilder) { |
| 702 AccessErrorBuilder error = other; | 703 deprecated_AccessErrorBuilder error = other; |
| 703 other = error.builder; | 704 other = error.builder; |
| 704 } | 705 } |
| 705 bool isLocal = false; | 706 bool isLocal = false; |
| 706 Builder preferred; | 707 Builder preferred; |
| 707 Uri uri; | 708 Uri uri; |
| 708 Uri otherUri; | 709 Uri otherUri; |
| 709 Uri preferredUri; | 710 Uri preferredUri; |
| 710 Uri hiddenUri; | 711 Uri hiddenUri; |
| 711 if (scope.local[name] == builder) { | 712 if (scope.local[name] == builder) { |
| 712 isLocal = true; | 713 isLocal = true; |
| 713 preferred = builder; | 714 preferred = builder; |
| 714 hiddenUri = other.computeLibraryUri(); | 715 hiddenUri = other.computeLibraryUri(); |
| 715 } else { | 716 } else { |
| 716 uri = builder.computeLibraryUri(); | 717 uri = builder.computeLibraryUri(); |
| 717 otherUri = other.computeLibraryUri(); | 718 otherUri = other.computeLibraryUri(); |
| 718 if (otherUri?.scheme == "dart" && uri?.scheme != "dart") { | 719 if (otherUri?.scheme == "dart" && uri?.scheme != "dart") { |
| 719 preferred = builder; | 720 preferred = builder; |
| 720 preferredUri = uri; | 721 preferredUri = uri; |
| 721 hiddenUri = otherUri; | 722 hiddenUri = otherUri; |
| 722 } else if (uri?.scheme == "dart" && otherUri?.scheme != "dart") { | 723 } else if (uri?.scheme == "dart" && otherUri?.scheme != "dart") { |
| 723 preferred = other; | 724 preferred = other; |
| 724 preferredUri = otherUri; | 725 preferredUri = otherUri; |
| 725 hiddenUri = uri; | 726 hiddenUri = uri; |
| 726 } | 727 } |
| 727 } | 728 } |
| 728 if (preferred != null) { | 729 if (preferred != null) { |
| 729 if (isLocal) { | 730 if (isLocal) { |
| 730 if (isExport) { | 731 if (isExport) { |
| 731 addNit(charOffset, | 732 deprecated_addNit(charOffset, |
| 732 "Local definition of '$name' hides export from '${hiddenUri}'."); | 733 "Local definition of '$name' hides export from '${hiddenUri}'."); |
| 733 } else { | 734 } else { |
| 734 addNit(charOffset, | 735 deprecated_addNit(charOffset, |
| 735 "Local definition of '$name' hides import from '${hiddenUri}'."); | 736 "Local definition of '$name' hides import from '${hiddenUri}'."); |
| 736 } | 737 } |
| 737 } else { | 738 } else { |
| 738 if (isExport) { | 739 if (isExport) { |
| 739 addNit( | 740 deprecated_addNit( |
| 740 charOffset, | 741 charOffset, |
| 741 "Export of '$name' (from '${preferredUri}') hides export from " | 742 "Export of '$name' (from '${preferredUri}') hides export from " |
| 742 "'${hiddenUri}'."); | 743 "'${hiddenUri}'."); |
| 743 } else { | 744 } else { |
| 744 addNit( | 745 deprecated_addNit( |
| 745 charOffset, | 746 charOffset, |
| 746 "Import of '$name' (from '${preferredUri}') hides import from " | 747 "Import of '$name' (from '${preferredUri}') hides import from " |
| 747 "'${hiddenUri}'."); | 748 "'${hiddenUri}'."); |
| 748 } | 749 } |
| 749 } | 750 } |
| 750 return preferred; | 751 return preferred; |
| 751 } | 752 } |
| 752 if (builder.next == null && other.next == null) { | 753 if (builder.next == null && other.next == null) { |
| 753 if (isImport && builder is PrefixBuilder && other is PrefixBuilder) { | 754 if (isImport && builder is PrefixBuilder && other is PrefixBuilder) { |
| 754 // Handles the case where the same prefix is used for different | 755 // Handles the case where the same prefix is used for different |
| 755 // imports. | 756 // imports. |
| 756 return builder | 757 return builder |
| 757 ..exports.merge(other.exports, | 758 ..exports.merge(other.exports, |
| 758 (String name, Builder existing, Builder member) { | 759 (String name, Builder existing, Builder member) { |
| 759 return buildAmbiguousBuilder(name, existing, member, charOffset, | 760 return buildAmbiguousBuilder(name, existing, member, charOffset, |
| 760 isExport: isExport, isImport: isImport); | 761 isExport: isExport, isImport: isImport); |
| 761 }); | 762 }); |
| 762 } | 763 } |
| 763 } | 764 } |
| 764 String message = isExport | 765 String message = isExport |
| 765 ? "'$name' is exported from both '${uri}' and '${otherUri}'." | 766 ? "'$name' is exported from both '${uri}' and '${otherUri}'." |
| 766 : "'$name' is imported from both '${uri}' and '${otherUri}'."; | 767 : "'$name' is imported from both '${uri}' and '${otherUri}'."; |
| 767 addNit(charOffset, message); | 768 deprecated_addNit(charOffset, message); |
| 768 return new KernelInvalidTypeBuilder(name, charOffset, fileUri, message); | 769 return new KernelInvalidTypeBuilder(name, charOffset, fileUri, message); |
| 769 } | 770 } |
| 770 | 771 |
| 771 int finishStaticInvocations() { | 772 int finishStaticInvocations() { |
| 772 CloneVisitor cloner; | 773 CloneVisitor cloner; |
| 773 for (var list in argumentsWithMissingDefaultValues) { | 774 for (var list in argumentsWithMissingDefaultValues) { |
| 774 final Arguments arguments = list[0]; | 775 final Arguments arguments = list[0]; |
| 775 final FunctionNode function = list[1]; | 776 final FunctionNode function = list[1]; |
| 776 | 777 |
| 777 Expression defaultArgumentFrom(Expression expression) { | 778 Expression defaultArgumentFrom(Expression expression) { |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 mixinApplicationClasses.putIfAbsent(name, () => builder); | 858 mixinApplicationClasses.putIfAbsent(name, () => builder); |
| 858 if (existing != builder) { | 859 if (existing != builder) { |
| 859 part.scope.local.remove(name); | 860 part.scope.local.remove(name); |
| 860 } | 861 } |
| 861 }); | 862 }); |
| 862 super.includePart(part); | 863 super.includePart(part); |
| 863 nativeMethods.addAll(part.nativeMethods); | 864 nativeMethods.addAll(part.nativeMethods); |
| 864 boundlessTypeVariables.addAll(part.boundlessTypeVariables); | 865 boundlessTypeVariables.addAll(part.boundlessTypeVariables); |
| 865 } | 866 } |
| 866 } | 867 } |
| OLD | NEW |