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:kernel/ast.dart'; | 7 import 'package:kernel/ast.dart'; |
8 | 8 |
9 import 'package:kernel/clone.dart' show CloneVisitor; | 9 import 'package:kernel/clone.dart' show CloneVisitor; |
10 | 10 |
11 import '../../scanner/token.dart' show Token; | 11 import '../../scanner/token.dart' show Token; |
12 | 12 |
13 import '../fasta_codes.dart' | 13 import '../fasta_codes.dart' |
14 show | 14 show |
15 Message, | 15 Message, |
16 messageConflictsWithTypeVariableCause, | 16 messageConflictsWithTypeVariableCause, |
| 17 messageTypeVariableDuplicatedName, |
| 18 messageTypeVariableSameNameAsEnclosing, |
17 templateConflictsWithTypeVariable, | 19 templateConflictsWithTypeVariable, |
18 templateDuplicatedExport, | 20 templateDuplicatedExport, |
19 templateDuplicatedImport, | 21 templateDuplicatedImport, |
20 templateExportHidesExport, | 22 templateExportHidesExport, |
| 23 templateIllegalMethodName, |
21 templateImportHidesImport, | 24 templateImportHidesImport, |
22 templateLocalDefinitionHidesExport, | 25 templateLocalDefinitionHidesExport, |
23 templateLocalDefinitionHidesImport; | 26 templateLocalDefinitionHidesImport, |
| 27 templateTypeVariableDuplicatedNameCause; |
24 | 28 |
25 import '../loader.dart' show Loader; | 29 import '../loader.dart' show Loader; |
26 | 30 |
27 import '../modifier.dart' | 31 import '../modifier.dart' |
28 show abstractMask, namedMixinApplicationMask, staticMask; | 32 show abstractMask, namedMixinApplicationMask, staticMask; |
29 | 33 |
30 import '../problems.dart' show unhandled; | 34 import '../problems.dart' show unhandled; |
31 | 35 |
32 import '../source/source_class_builder.dart' show SourceClassBuilder; | 36 import '../source/source_class_builder.dart' show SourceClassBuilder; |
33 | 37 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 } | 183 } |
180 | 184 |
181 Map<String, TypeVariableBuilder> checkTypeVariables( | 185 Map<String, TypeVariableBuilder> checkTypeVariables( |
182 List<TypeVariableBuilder> typeVariables, Builder owner) { | 186 List<TypeVariableBuilder> typeVariables, Builder owner) { |
183 if (typeVariables?.isEmpty ?? true) return null; | 187 if (typeVariables?.isEmpty ?? true) return null; |
184 Map<String, TypeVariableBuilder> typeVariablesByName = | 188 Map<String, TypeVariableBuilder> typeVariablesByName = |
185 <String, TypeVariableBuilder>{}; | 189 <String, TypeVariableBuilder>{}; |
186 for (TypeVariableBuilder tv in typeVariables) { | 190 for (TypeVariableBuilder tv in typeVariables) { |
187 TypeVariableBuilder existing = typeVariablesByName[tv.name]; | 191 TypeVariableBuilder existing = typeVariablesByName[tv.name]; |
188 if (existing != null) { | 192 if (existing != null) { |
189 deprecated_addCompileTimeError(tv.charOffset, | 193 addCompileTimeError( |
190 "A type variable can't have the same name as another."); | 194 messageTypeVariableDuplicatedName, tv.charOffset, fileUri); |
191 deprecated_addCompileTimeError( | 195 addCompileTimeError( |
192 existing.charOffset, "The other type variable named '${tv.name}'."); | 196 templateTypeVariableDuplicatedNameCause.withArguments(tv.name), |
| 197 existing.charOffset, |
| 198 fileUri); |
193 } else { | 199 } else { |
194 typeVariablesByName[tv.name] = tv; | 200 typeVariablesByName[tv.name] = tv; |
195 if (owner is ClassBuilder) { | 201 if (owner is ClassBuilder) { |
196 // Only classes and type variables can't have the same name. See | 202 // Only classes and type variables can't have the same name. See |
197 // [#29555](https://github.com/dart-lang/sdk/issues/29555). | 203 // [#29555](https://github.com/dart-lang/sdk/issues/29555). |
198 if (tv.name == owner.name) { | 204 if (tv.name == owner.name) { |
199 deprecated_addCompileTimeError( | 205 addCompileTimeError( |
200 tv.charOffset, | 206 messageTypeVariableSameNameAsEnclosing, tv.charOffset, fileUri); |
201 "A type variable can't have the same name as its enclosing " | |
202 "declaration."); | |
203 } | 207 } |
204 } | 208 } |
205 } | 209 } |
206 } | 210 } |
207 return typeVariablesByName; | 211 return typeVariablesByName; |
208 } | 212 } |
209 | 213 |
210 KernelTypeBuilder applyMixin( | 214 KernelTypeBuilder applyMixin( |
211 KernelTypeBuilder supertype, KernelTypeBuilder mixin, String signature, | 215 KernelTypeBuilder supertype, KernelTypeBuilder mixin, String signature, |
212 {List<MetadataBuilder> metadata, | 216 {List<MetadataBuilder> metadata, |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 int index = name.indexOf("."); | 507 int index = name.indexOf("."); |
504 if (startsWithClassName && index == className.length) { | 508 if (startsWithClassName && index == className.length) { |
505 // Named constructor or factory. | 509 // Named constructor or factory. |
506 return name.substring(index + 1); | 510 return name.substring(index + 1); |
507 } | 511 } |
508 if (index == -1) { | 512 if (index == -1) { |
509 // A legal name for a regular method, but not for a constructor. | 513 // A legal name for a regular method, but not for a constructor. |
510 return null; | 514 return null; |
511 } | 515 } |
512 String suffix = name.substring(index + 1); | 516 String suffix = name.substring(index + 1); |
513 deprecated_addCompileTimeError( | 517 addCompileTimeError( |
| 518 templateIllegalMethodName.withArguments(name, "$className.$suffix"), |
514 charOffset, | 519 charOffset, |
515 "'$name' isn't a legal method name.\n" | 520 fileUri); |
516 "Did you mean '$className.$suffix'?"); | |
517 return suffix; | 521 return suffix; |
518 } | 522 } |
519 | 523 |
520 void addProcedure( | 524 void addProcedure( |
521 List<MetadataBuilder> metadata, | 525 List<MetadataBuilder> metadata, |
522 int modifiers, | 526 int modifiers, |
523 KernelTypeBuilder returnType, | 527 KernelTypeBuilder returnType, |
524 String name, | 528 String name, |
525 List<TypeVariableBuilder> typeVariables, | 529 List<TypeVariableBuilder> typeVariables, |
526 List<FormalParameterBuilder> formals, | 530 List<FormalParameterBuilder> formals, |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 mixinApplicationClasses.putIfAbsent(name, () => builder); | 866 mixinApplicationClasses.putIfAbsent(name, () => builder); |
863 if (existing != builder) { | 867 if (existing != builder) { |
864 part.scope.local.remove(name); | 868 part.scope.local.remove(name); |
865 } | 869 } |
866 }); | 870 }); |
867 super.includePart(part); | 871 super.includePart(part); |
868 nativeMethods.addAll(part.nativeMethods); | 872 nativeMethods.addAll(part.nativeMethods); |
869 boundlessTypeVariables.addAll(part.boundlessTypeVariables); | 873 boundlessTypeVariables.addAll(part.boundlessTypeVariables); |
870 } | 874 } |
871 } | 875 } |
OLD | NEW |