Issue 24599. Fix for requesting navigation for directives.

R=brianwilkerson@google.com
BUG= https://github.com/dart-lang/sdk/issues/24599

Review URL: https://codereview.chromium.org/1405033002 .
diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
index 7f58ad7..a4971ce 100644
--- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
+++ b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart
@@ -58,8 +58,7 @@
     if (element.location == null) {
       return;
     }
-    protocol.ElementKind kind =
-        protocol.convertElementKind(element.kind);
+    protocol.ElementKind kind = protocol.convertElementKind(element.kind);
     protocol.Location location = protocol.newLocation_fromElement(element);
     if (location == null) {
       return;
@@ -326,9 +325,11 @@
       return;
     }
     // The node starts or ends in the range.
-    if (isInRange(node.offset) || isInRange(node.end)) {
-      node.accept(visitor);
-      return;
+    if (node is! CompilationUnit) {
+      if (isInRange(node.offset) || isInRange(node.end) || node is Directive) {
+        node.accept(visitor);
+        return;
+      }
     }
     // Go deeper.
     super.visitNode(node);
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index 34a8010..fb49169 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -58,6 +58,48 @@
     return _checkInvalid(file, -1, -1);
   }
 
+  test_issue24599_importDirective() async {
+    addTestFile('''
+import 'dart:math';
+
+main() {
+}''');
+    await waitForTasksFinished();
+    await _getNavigation(testFile, 0, 17);
+    expect(regions, hasLength(1));
+    assertHasRegionString("'dart:math'");
+    expect(testTargets, hasLength(1));
+    expect(testTargets[0].kind, ElementKind.LIBRARY);
+  }
+
+  test_issue24599_importKeyword() async {
+    addTestFile('''
+import 'dart:math';
+
+main() {
+}''');
+    await waitForTasksFinished();
+    await _getNavigation(testFile, 0, 1);
+    expect(regions, hasLength(1));
+    assertHasRegionString("'dart:math'");
+    expect(testTargets, hasLength(1));
+    expect(testTargets[0].kind, ElementKind.LIBRARY);
+  }
+
+  test_issue24599_importUri() async {
+    addTestFile('''
+import 'dart:math';
+
+main() {
+}''');
+    await waitForTasksFinished();
+    await _getNavigation(testFile, 7, 11);
+    expect(regions, hasLength(1));
+    assertHasRegionString("'dart:math'");
+    expect(testTargets, hasLength(1));
+    expect(testTargets[0].kind, ElementKind.LIBRARY);
+  }
+
   test_multipleRegions() async {
     addTestFile('''
 main() {
diff --git a/pkg/analysis_server/test/analysis/notification_navigation_test.dart b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
index 4accf97..5e66eca 100644
--- a/pkg/analysis_server/test/analysis/notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/notification_navigation_test.dart
@@ -26,6 +26,7 @@
 
   NavigationRegion testRegion;
   List<int> testTargetIndexes;
+  List<NavigationTarget> testTargets;
   NavigationTarget testTarget;
 
   /**
@@ -33,8 +34,6 @@
    * at [offset] and with the given [length].
    */
   void assertHasFileTarget(String file, int offset, int length) {
-    List<NavigationTarget> testTargets =
-        testTargetIndexes.map((int index) => targets[index]).toList();
     for (NavigationTarget target in testTargets) {
       if (targetFiles[target.fileIndex] == file &&
           target.offset == offset &&
@@ -167,6 +166,7 @@
         }
         testRegion = region;
         testTargetIndexes = region.targets;
+        testTargets = testTargetIndexes.map((i) => targets[i]).toList();
         return;
       }
     }