Add support for navigating from the URI in import and export configurations to the referenced file

Change-Id: Ic6234d9a24dcb52228067b20d69277e47ff89a0a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/152401
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Brian Wilkerson 2020-06-24 22:46:33 +00:00 committed by commit-bot@chromium.org
parent d0e78f8a77
commit ff83b0fec9
5 changed files with 43 additions and 0 deletions

View file

@ -802,6 +802,15 @@ class A {
}
}
Future<void> test_string_configuration() async {
newFile('$projectPath/bin/lib.dart', content: '').path;
var lib2File = newFile('$projectPath/bin/lib2.dart', content: '').path;
addTestFile('import "lib.dart" if (dart.library.html) "lib2.dart";');
await prepareNavigation();
assertHasRegionString('"lib2.dart"');
assertHasFileTarget(lib2File, 0, 0);
}
Future<void> test_string_export() async {
var libCode = 'library lib;';
var libFile = newFile('$projectPath/bin/lib.dart', content: libCode).path;

View file

@ -780,6 +780,13 @@ class LibraryAnalyzer {
_library.source,
relativeUri,
);
for (var configuration in directive.configurations) {
var uriLiteral = configuration.uri;
String uriContent = uriLiteral.stringValue?.trim();
Source defaultSource = _resolveUri(
file, directive is ImportDirective, uriLiteral, uriContent);
configuration.uriSource = defaultSource;
}
}
}
}

View file

@ -3426,6 +3426,7 @@ class ExportDirectiveImpl extends NamespaceDirectiveImpl
@override
void visitChildren(AstVisitor visitor) {
configurations.accept(visitor);
super.visitChildren(visitor);
combinators.accept(visitor);
}
@ -5772,6 +5773,7 @@ class ImportDirectiveImpl extends NamespaceDirectiveImpl
@override
void visitChildren(AstVisitor visitor) {
super.visitChildren(visitor);
configurations.accept(visitor);
_prefix?.accept(visitor);
combinators.accept(visitor);
}

View file

@ -811,6 +811,12 @@ class ResolverVisitor extends ScopedVisitor {
node.accept(typeAnalyzer);
}
@override
void visitConfiguration(Configuration node) {
// Don't visit the children. For the time being we don't resolve anything
// inside the configuration.
}
@override
void visitConstructorDeclaration(ConstructorDeclaration node) {
ExecutableElement outerFunction = _enclosingFunction;

View file

@ -9,6 +9,7 @@ import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer_plugin/protocol/protocol_common.dart' as protocol;
import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
import 'package:analyzer_plugin/utilities/navigation/navigation.dart';
@ -145,6 +146,24 @@ class _DartNavigationComputerVisitor extends RecursiveAstVisitor<void> {
}
}
@override
void visitConfiguration(Configuration node) {
var source = node.uriSource;
if (source != null) {
if (resourceProvider.getResource(source.fullName).exists) {
// TODO(brianwilkerson) If the analyzer ever resolves the URI to a
// library, use that library element to create the region.
var uriNode = node.uri;
computer.collector.addRegion(
uriNode.offset,
uriNode.length,
protocol.ElementKind.LIBRARY,
protocol.Location(source.fullName, 0, 0, 0, 0));
}
}
super.visitConfiguration(node);
}
@override
void visitConstructorDeclaration(ConstructorDeclaration node) {
// associate constructor with "T" or "T.name"