Index: pkg/front_end/lib/src/fasta/source/source_library_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart |
index 9a8b17d02d59f50be99bef741233a8a923bb6674..54db00cd3f7c5c4c374d25375b138bef3604f2a7 100644 |
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart |
@@ -66,7 +66,7 @@ abstract class SourceLibraryBuilder<T extends TypeBuilder, R> |
String partOfName; |
- Uri partOfUri; |
+ String partOfUri; |
List<MetadataBuilder> metadata; |
@@ -177,7 +177,7 @@ abstract class SourceLibraryBuilder<T extends TypeBuilder, R> |
void addPartOf(List<MetadataBuilder> metadata, String name, String uri) { |
partOfName = name; |
- partOfUri = uri == null ? null : this.uri.resolve(uri); |
+ partOfUri = uri; |
} |
void addClass( |
@@ -413,24 +413,44 @@ abstract class SourceLibraryBuilder<T extends TypeBuilder, R> |
} |
void includePart(SourceLibraryBuilder<T, R> part) { |
- if (name != null) { |
- if (!part.isPart) { |
- addCompileTimeError( |
+ if (part.partOfUri != null) { |
+ if (uri.resolve(part.partOfUri) != uri) { |
+ // This is a warning, but the part is still included. |
+ addWarning( |
-1, |
- "Can't use ${part.fileUri} as a part, because it has no 'part of'" |
- " declaration."); |
- parts.remove(part); |
- return; |
+ "Using '${part.relativeFileUri}' as part of '$uri' but its " |
+ "'part of' declaration says '${part.partOfUri}'."); |
+ if (uri.scheme == "dart" && relativeFileUri.endsWith(part.partOfUri)) { |
+ addWarning(-1, "See https://github.com/dart-lang/sdk/issues/30072."); |
+ } |
} |
- if (part.partOfName != name && part.partOfUri != uri) { |
- String partName = part.partOfName ?? "${part.partOfUri}"; |
- String myName = name == null ? "'$uri'" : "'${name}' ($uri)"; |
+ } else if (part.partOfName != null) { |
+ if (name != null) { |
+ if (part.partOfName != name) { |
+ // This is a warning, but the part is still included. |
+ addWarning( |
+ -1, |
+ "Using '${part.relativeFileUri}' as part of '$name' but its " |
+ "'part of' declaration says '${part.partOfName}'."); |
+ } |
+ } else { |
+ // This is a warning, but the part is still included. |
addWarning( |
-1, |
- "Using '${part.fileUri}' as part of '$myName' but its 'part of'" |
- " declaration says '$partName'."); |
- // The part is still included. |
+ "Using '${part.relativeFileUri}' as part of '${relativeFileUri}' " |
+ "but its 'part of' declaration says '${part.partOfName}'.\n" |
+ "Try changing the 'part of' declaration to use a relative " |
+ "file name."); |
} |
+ } else if (name != null) { |
+ // This is an error, and the part isn't included. |
+ assert(!part.isPart); |
+ addCompileTimeError( |
+ -1, |
+ "Can't use ${part.fileUri} as a part, because it has no 'part of'" |
+ " declaration."); |
+ parts.remove(part); |
+ return; |
} |
part.forEach((String name, Builder builder) { |
if (builder.next != null) { |