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 '../errors.dart' show internalError; | 11 import '../errors.dart' show internalError; |
12 | 12 |
13 import '../loader.dart' show Loader; | 13 import '../loader.dart' show Loader; |
14 | 14 |
15 import '../modifier.dart' show abstractMask, staticMask; | 15 import '../modifier.dart' show abstractMask, staticMask; |
16 | 16 |
17 import '../source/source_library_builder.dart' | 17 import '../source/source_library_builder.dart' |
18 show DeclarationBuilder, SourceLibraryBuilder; | 18 show DeclarationBuilder, SourceLibraryBuilder; |
19 | 19 |
20 import '../source/source_class_builder.dart' show SourceClassBuilder; | 20 import '../source/source_class_builder.dart' show SourceClassBuilder; |
21 | 21 |
22 import '../util/relativize.dart' show relativizeUri; | 22 import '../util/relativize.dart' show relativizeUri; |
23 | 23 |
24 import 'kernel_builder.dart' | 24 import 'kernel_builder.dart' |
25 show | 25 show |
| 26 AccessErrorBuilder, |
26 Builder, | 27 Builder, |
27 BuiltinTypeBuilder, | 28 BuiltinTypeBuilder, |
28 ClassBuilder, | 29 ClassBuilder, |
29 ConstructorReferenceBuilder, | 30 ConstructorReferenceBuilder, |
30 FormalParameterBuilder, | 31 FormalParameterBuilder, |
31 FunctionTypeAliasBuilder, | 32 FunctionTypeAliasBuilder, |
| 33 InvalidTypeBuilder, |
32 KernelConstructorBuilder, | 34 KernelConstructorBuilder, |
33 KernelEnumBuilder, | 35 KernelEnumBuilder, |
34 KernelFieldBuilder, | 36 KernelFieldBuilder, |
35 KernelFormalParameterBuilder, | 37 KernelFormalParameterBuilder, |
36 KernelFunctionTypeAliasBuilder, | 38 KernelFunctionTypeAliasBuilder, |
37 KernelFunctionTypeBuilder, | 39 KernelFunctionTypeBuilder, |
38 KernelInvalidTypeBuilder, | 40 KernelInvalidTypeBuilder, |
39 KernelMixinApplicationBuilder, | 41 KernelMixinApplicationBuilder, |
40 KernelNamedMixinApplicationBuilder, | 42 KernelNamedMixinApplicationBuilder, |
41 KernelNamedTypeBuilder, | 43 KernelNamedTypeBuilder, |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 internalError("Unhandled builder: ${builder.runtimeType}"); | 320 internalError("Unhandled builder: ${builder.runtimeType}"); |
319 } | 321 } |
320 } | 322 } |
321 | 323 |
322 Library build() { | 324 Library build() { |
323 super.build(); | 325 super.build(); |
324 library.name = name; | 326 library.name = name; |
325 return library; | 327 return library; |
326 } | 328 } |
327 | 329 |
| 330 @override |
328 Builder buildAmbiguousBuilder( | 331 Builder buildAmbiguousBuilder( |
329 String name, Builder builder, Builder other, int charOffset) { | 332 String name, Builder builder, Builder other, int charOffset, |
| 333 {bool isExport: false, bool isImport: false}) { |
| 334 if (builder == other) return builder; |
| 335 if (builder is InvalidTypeBuilder) return builder; |
| 336 if (other is InvalidTypeBuilder) return other; |
| 337 if (builder is AccessErrorBuilder) { |
| 338 AccessErrorBuilder error = builder; |
| 339 builder = error.builder; |
| 340 } |
| 341 if (other is AccessErrorBuilder) { |
| 342 AccessErrorBuilder error = other; |
| 343 other = error.builder; |
| 344 } |
| 345 bool isLocal = false; |
| 346 Builder preferred; |
| 347 Uri uri; |
| 348 Uri otherUri; |
| 349 Uri preferredUri; |
| 350 Uri hiddenUri; |
| 351 if (members[name] == builder) { |
| 352 isLocal = true; |
| 353 preferred = builder; |
| 354 hiddenUri = other.computeLibraryUri(); |
| 355 } else { |
| 356 uri = builder.computeLibraryUri(); |
| 357 otherUri = other.computeLibraryUri(); |
| 358 if (otherUri?.scheme == "dart" && uri?.scheme != "dart") { |
| 359 preferred = builder; |
| 360 preferredUri = uri; |
| 361 hiddenUri = otherUri; |
| 362 } else if (uri?.scheme == "dart" && otherUri?.scheme != "dart") { |
| 363 preferred = other; |
| 364 preferredUri = otherUri; |
| 365 hiddenUri = uri; |
| 366 } |
| 367 } |
| 368 if (preferred != null) { |
| 369 if (isLocal) { |
| 370 if (isExport) { |
| 371 addNit(charOffset, |
| 372 "Local definition of '$name' hides export from '${hiddenUri}'."); |
| 373 } else { |
| 374 addNit(charOffset, |
| 375 "Local definition of '$name' hides import from '${hiddenUri}'."); |
| 376 } |
| 377 } else { |
| 378 if (isExport) { |
| 379 addNit( |
| 380 charOffset, |
| 381 "Export of '$name' (from '${preferredUri}') hides export from " |
| 382 "'${hiddenUri}'."); |
| 383 } else { |
| 384 addNit( |
| 385 charOffset, |
| 386 "Import of '$name' (from '${preferredUri}') hides import from " |
| 387 "'${hiddenUri}'."); |
| 388 } |
| 389 } |
| 390 return preferred; |
| 391 } |
330 if (builder.next == null && other.next == null) { | 392 if (builder.next == null && other.next == null) { |
331 if (builder.isGetter && other.isSetter) { | 393 if (builder.isGetter && other.isSetter) { |
332 return new MixedAccessor(builder, other, this); | 394 return new MixedAccessor(builder, other, this); |
333 } else if (builder.isSetter && other.isGetter) { | 395 } else if (builder.isSetter && other.isGetter) { |
334 return new MixedAccessor(other, builder, this); | 396 return new MixedAccessor(other, builder, this); |
335 } | 397 } |
| 398 if (isImport && builder is PrefixBuilder && other is PrefixBuilder) { |
| 399 // Handles the case where the same prefix is used for different |
| 400 // imports. |
| 401 PrefixBuilder prefix = builder; |
| 402 other.exports.forEach((String name, Builder member) { |
| 403 Builder existing = exports[name]; |
| 404 if (existing != null) { |
| 405 if (existing != member) { |
| 406 member = buildAmbiguousBuilder(name, existing, member, charOffset, |
| 407 isExport: isExport, isImport: isImport); |
| 408 } |
| 409 } |
| 410 prefix.exports[name] = member; |
| 411 }); |
| 412 return builder; |
| 413 } |
| 414 } |
| 415 if (isExport) { |
| 416 addNit(charOffset, |
| 417 "'$name' is exported from both '${uri}' and '${otherUri}'."); |
| 418 } else { |
| 419 addNit(charOffset, |
| 420 "'$name' is imported from both '${uri}' and '${otherUri}'."); |
336 } | 421 } |
337 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); | 422 return new KernelInvalidTypeBuilder(name, charOffset, fileUri); |
338 } | 423 } |
339 | 424 |
340 int finishStaticInvocations() { | 425 int finishStaticInvocations() { |
341 CloneVisitor cloner; | 426 CloneVisitor cloner; |
342 for (var list in argumentsWithMissingDefaultValues) { | 427 for (var list in argumentsWithMissingDefaultValues) { |
343 final Arguments arguments = list[0]; | 428 final Arguments arguments = list[0]; |
344 final FunctionNode function = list[1]; | 429 final FunctionNode function = list[1]; |
345 | 430 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
427 } | 512 } |
428 } | 513 } |
429 | 514 |
430 bool isConstructorName(String name, String className) { | 515 bool isConstructorName(String name, String className) { |
431 if (name.startsWith(className)) { | 516 if (name.startsWith(className)) { |
432 if (name.length == className.length) return true; | 517 if (name.length == className.length) return true; |
433 if (name.startsWith(".", className.length)) return true; | 518 if (name.startsWith(".", className.length)) return true; |
434 } | 519 } |
435 return false; | 520 return false; |
436 } | 521 } |
OLD | NEW |