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>
This commit is contained in:
Konstantin Shcheglov 2018-08-07 18:17:46 +00:00
parent c439ebead0
commit c30af508a4
6 changed files with 33 additions and 16 deletions

View file

@ -1038,11 +1038,6 @@ class AnalysisNotificationNavigationTest_UseCFE
@override
bool get useCFE => true;
@failingTest
@override
test_annotationConstructor_importPrefix() async =>
super.test_annotationConstructor_importPrefix();
@failingTest
@override
test_annotationField() async => super.test_annotationField();
@ -1051,11 +1046,6 @@ class AnalysisNotificationNavigationTest_UseCFE
@override
test_inComment() async => super.test_inComment();
@failingTest
@override
test_instanceCreation_withImportPrefix_named() async =>
super.test_instanceCreation_withImportPrefix_named();
@failingTest
@override
test_library() async => super.test_library();

View file

@ -18,6 +18,10 @@ class AnalyzerMetadata {
/// 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 @@ class AnalyzerMetadataCollector implements MetadataCollector {
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 @@ class AnalyzerMetadataRepository
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 @@ class AnalyzerMetadataRepository
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].

View file

@ -8874,6 +8874,10 @@ class PrefixElementImpl extends ElementImpl implements PrefixElement {
@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;
}

View file

@ -6655,6 +6655,10 @@ Future<dynamic> f;
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;

View file

@ -852,6 +852,7 @@ class KernelLibraryBuilder
// 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 @@ class KernelLibraryBuilder
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++];

View file

@ -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 @@ abstract class MetadataCollector {
void setConstructorNameOffset(Member node, Object name);
void setDocumentationComment(NamedNode node, String comment);
void setImportPrefixOffset(LibraryDependency node, int offset);
}