diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart index e394993231a..90b007e957a 100644 --- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart +++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart @@ -802,6 +802,15 @@ class A { } } + Future 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 test_string_export() async { var libCode = 'library lib;'; var libFile = newFile('$projectPath/bin/lib.dart', content: libCode).path; diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart index 66699d4a96d..4361edfebb9 100644 --- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart +++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart @@ -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; + } } } } diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart index 54ec8b9864f..5716d1a178b 100644 --- a/pkg/analyzer/lib/src/dart/ast/ast.dart +++ b/pkg/analyzer/lib/src/dart/ast/ast.dart @@ -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); } diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart index db4a3c17bf6..71709605447 100644 --- a/pkg/analyzer/lib/src/generated/resolver.dart +++ b/pkg/analyzer/lib/src/generated/resolver.dart @@ -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; diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart index c1664bbdc3c..e09c6fbce5b 100644 --- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart +++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart @@ -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 { } } + @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"