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

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart

Issue 2780543002: Handle complicated imports. (Closed)
Patch Set: Fix infinite loop. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 9765cd2787ca425042c9fef7fcbf88f186ed4c41..551dcd3e979bc3693ce8a91e5099292897f77122 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -23,12 +23,14 @@ import '../util/relativize.dart' show relativizeUri;
import 'kernel_builder.dart'
show
+ AccessErrorBuilder,
Builder,
BuiltinTypeBuilder,
ClassBuilder,
ConstructorReferenceBuilder,
FormalParameterBuilder,
FunctionTypeAliasBuilder,
+ InvalidTypeBuilder,
KernelConstructorBuilder,
KernelEnumBuilder,
KernelFieldBuilder,
@@ -325,14 +327,97 @@ class KernelLibraryBuilder
return library;
}
+ @override
Builder buildAmbiguousBuilder(
- String name, Builder builder, Builder other, int charOffset) {
+ String name, Builder builder, Builder other, int charOffset,
+ {bool isExport: false, bool isImport: false}) {
+ if (builder == other) return builder;
+ if (builder is InvalidTypeBuilder) return builder;
+ if (other is InvalidTypeBuilder) return other;
+ if (builder is AccessErrorBuilder) {
+ AccessErrorBuilder error = builder;
+ builder = error.builder;
+ }
+ if (other is AccessErrorBuilder) {
+ AccessErrorBuilder error = other;
+ other = error.builder;
+ }
+ bool isLocal = false;
+ Builder preferred;
+ Uri uri;
+ Uri otherUri;
+ Uri preferredUri;
+ Uri hiddenUri;
+ if (members[name] == builder) {
+ isLocal = true;
+ preferred = builder;
+ hiddenUri = other.computeLibraryUri();
+ } else {
+ uri = builder.computeLibraryUri();
+ otherUri = other.computeLibraryUri();
+ if (otherUri?.scheme == "dart" && uri?.scheme != "dart") {
+ preferred = builder;
+ preferredUri = uri;
+ hiddenUri = otherUri;
+ } else if (uri?.scheme == "dart" && otherUri?.scheme != "dart") {
+ preferred = other;
+ preferredUri = otherUri;
+ hiddenUri = uri;
+ }
+ }
+ if (preferred != null) {
+ if (isLocal) {
+ if (isExport) {
+ addNit(charOffset,
+ "Local definition of '$name' hides export from '${hiddenUri}'.");
+ } else {
+ addNit(charOffset,
+ "Local definition of '$name' hides import from '${hiddenUri}'.");
+ }
+ } else {
+ if (isExport) {
+ addNit(
+ charOffset,
+ "Export of '$name' (from '${preferredUri}') hides export from "
+ "'${hiddenUri}'.");
+ } else {
+ addNit(
+ charOffset,
+ "Import of '$name' (from '${preferredUri}') hides import from "
+ "'${hiddenUri}'.");
+ }
+ }
+ return preferred;
+ }
if (builder.next == null && other.next == null) {
if (builder.isGetter && other.isSetter) {
return new MixedAccessor(builder, other, this);
} else if (builder.isSetter && other.isGetter) {
return new MixedAccessor(other, builder, this);
}
+ if (isImport && builder is PrefixBuilder && other is PrefixBuilder) {
+ // Handles the case where the same prefix is used for different
+ // imports.
+ PrefixBuilder prefix = builder;
+ other.exports.forEach((String name, Builder member) {
+ Builder existing = exports[name];
+ if (existing != null) {
+ if (existing != member) {
+ member = buildAmbiguousBuilder(name, existing, member, charOffset,
+ isExport: isExport, isImport: isImport);
+ }
+ }
+ prefix.exports[name] = member;
+ });
+ return builder;
+ }
+ }
+ if (isExport) {
+ addNit(charOffset,
+ "'$name' is exported from both '${uri}' and '${otherUri}'.");
+ } else {
+ addNit(charOffset,
+ "'$name' is imported from both '${uri}' and '${otherUri}'.");
}
return new KernelInvalidTypeBuilder(name, charOffset, fileUri);
}
« no previous file with comments | « pkg/front_end/lib/src/fasta/import.dart ('k') | pkg/front_end/lib/src/fasta/source/source_library_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698