Store import prefix offset into metadata and resynthesize.
Change-Id: I7ef72c562323f132865c7cb6b3b068623c831043
Reviewed-on: https://dart-review.googlesource.com/68741
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index e91edda..a7f279a 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -1040,11 +1040,6 @@
@failingTest
@override
- test_annotationConstructor_importPrefix() async =>
- super.test_annotationConstructor_importPrefix();
-
- @failingTest
- @override
test_annotationField() async => super.test_annotationField();
@failingTest
@@ -1053,11 +1048,6 @@
@failingTest
@override
- test_instanceCreation_withImportPrefix_named() async =>
- super.test_instanceCreation_withImportPrefix_named();
-
- @failingTest
- @override
test_library() async => super.test_library();
@failingTest
diff --git a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
index a5bc6ef..3750ad8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/kernel_metadata.dart
@@ -18,6 +18,10 @@
/// Optional documentation comment, may be `null`.
String documentationComment;
+ /// If the node is an import library dependency, the offset of the prefix.
+ /// Otherwise `-1`.
+ int importPrefixOffset = -1;
+
/// Return the [AnalyzerMetadata] for the [node], or `null` absent.
static AnalyzerMetadata forNode(kernel.TreeNode node) {
var repository =
@@ -48,6 +52,12 @@
var metadata = repository._forWriting(node);
metadata.documentationComment = comment;
}
+
+ @override
+ void setImportPrefixOffset(kernel.LibraryDependency node, int offset) {
+ var metadata = repository._forWriting(node);
+ metadata.importPrefixOffset = offset;
+ }
}
/// Factory for creating Analyzer specific sink and repository.
@@ -135,7 +145,8 @@
kernel.Node node, kernel.BinarySource source) {
return new AnalyzerMetadata()
..constructorNameOffset = _readOffset(source)
- ..documentationComment = _readOptionalString(source);
+ ..documentationComment = _readOptionalString(source)
+ ..importPrefixOffset = _readOffset(source);
}
@override
@@ -143,6 +154,7 @@
AnalyzerMetadata metadata, kernel.Node node, kernel.BinarySink sink) {
_writeOffset(sink, metadata.constructorNameOffset);
_writeOptionalString(sink, metadata.documentationComment);
+ _writeOffset(sink, metadata.importPrefixOffset);
}
/// Return the existing or new [AnalyzerMetadata] instance for the [node].
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 9b5d9ab..0872c30 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -8874,6 +8874,10 @@
@override
int get nameOffset {
int offset = super.nameOffset;
+ if (_kernel != null) {
+ var metadata = AnalyzerMetadata.forNode(_kernel);
+ return metadata.importPrefixOffset;
+ }
if (offset == 0 && _unlinkedImport != null) {
return _unlinkedImport.prefixOffset;
}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index af9323d..db674ca 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -6655,6 +6655,10 @@
test_import_prefixed() async {
addLibrarySource('/a.dart', 'library a; class C {}');
var library = await checkLibrary('import "a.dart" as a; a.C c;');
+
+ expect(library.imports[0].prefix.nameOffset, 19);
+ expect(library.imports[0].prefix.nameLength, 1);
+
checkElementText(library, r'''
import 'a.dart' as a;
C c;
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 697f69f..adcad5b 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
@@ -852,6 +852,7 @@
// This is required for the DietListener to correctly match up metadata.
int importIndex = 0;
int exportIndex = 0;
+ MetadataCollector metadataCollector = loader.target.metadataCollector;
while (importIndex < imports.length || exportIndex < exports.length) {
if (exportIndex >= exports.length ||
(importIndex < imports.length &&
@@ -866,15 +867,18 @@
continue;
}
+ LibraryDependency dependency;
if (import.deferred && import.prefixBuilder?.dependency != null) {
- library.addDependency(import.prefixBuilder.dependency);
+ dependency = import.prefixBuilder.dependency;
} else {
- library.addDependency(new LibraryDependency.import(
- import.imported.target,
+ dependency = new LibraryDependency.import(import.imported.target,
name: import.prefix,
combinators: toKernelCombinators(import.combinators))
- ..fileOffset = import.charOffset);
+ ..fileOffset = import.charOffset;
}
+ library.addDependency(dependency);
+ metadataCollector?.setImportPrefixOffset(
+ dependency, import.prefixCharOffset);
} else {
// Add export
Export export = exports[exportIndex++];
diff --git a/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart b/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
index 6a15522..1abf885 100644
--- a/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
@@ -2,7 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'package:kernel/kernel.dart' show Member, MetadataRepository, NamedNode;
+import 'package:kernel/kernel.dart'
+ show LibraryDependency, Member, MetadataRepository, NamedNode;
/// The collector to add target specific metadata to.
abstract class MetadataCollector {
@@ -13,4 +14,6 @@
void setConstructorNameOffset(Member node, Object name);
void setDocumentationComment(NamedNode node, String comment);
+
+ void setImportPrefixOffset(LibraryDependency node, int offset);
}