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);
 }