Move DependencyWalker from analyzer into _fe_analyzer_shared.

For https://github.com/dart-lang/language/issues/731 (improved
inference for fold etc.), I want to re-use this logic as part of the
algorithm for computing the order in which to visit an invocation's
closure arguments.  That algorithm, in turn, will be shared between
the front end and the analyzer, so the DependencyWalker needs to move
into _fe_analyzer_shared first.

Change-Id: I953e027448cbd660dc30f92d1bdcce26a8d7bda3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/238920
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/_fe_analyzer_shared/lib/src/util/dependency_walker.dart
similarity index 100%
rename from pkg/analyzer/lib/src/summary/link.dart
rename to pkg/_fe_analyzer_shared/lib/src/util/dependency_walker.dart
diff --git a/pkg/analyzer/test/src/summary/dependency_walker_test.dart b/pkg/_fe_analyzer_shared/test/util/dependency_walker_test.dart
similarity index 72%
rename from pkg/analyzer/test/src/summary/dependency_walker_test.dart
rename to pkg/_fe_analyzer_shared/test/util/dependency_walker_test.dart
index 6165430..5ca34a6 100644
--- a/pkg/analyzer/test/src/summary/dependency_walker_test.dart
+++ b/pkg/_fe_analyzer_shared/test/util/dependency_walker_test.dart
@@ -2,27 +2,14 @@
 // 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:analyzer/src/summary/link.dart';
+import 'package:_fe_analyzer_shared/src/util/dependency_walker.dart';
 import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(DependencyWalkerTest);
+  late Map<String, TestNode> nodes;
+  setUp(() {
+    nodes = {};
   });
-}
-
-@reflectiveTest
-class DependencyWalkerTest {
-  final nodes = <String, TestNode>{};
-
-  void checkGraph(Map<String, List<String>> graph, String startingNodeName,
-      List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
-    makeGraph(graph);
-    var walker = walk(startingNodeName);
-    expect(walker._evaluations, expectedEvaluations.map((x) => x.toSet()));
-    expect(walker._sccFlags, expectedSccFlags);
-  }
 
   TestNode getNode(String name) =>
       nodes.putIfAbsent(name, () => TestNode(name));
@@ -36,7 +23,18 @@
     });
   }
 
-  void test_complex_graph() {
+  TestWalker walk(String startingNodeName) =>
+      TestWalker()..walk(getNode(startingNodeName));
+
+  void checkGraph(Map<String, List<String>> graph, String startingNodeName,
+      List<List<String>> expectedEvaluations, List<bool> expectedSccFlags) {
+    makeGraph(graph);
+    var walker = walk(startingNodeName);
+    expect(walker._evaluations, expectedEvaluations.map((x) => x.toSet()));
+    expect(walker._sccFlags, expectedSccFlags);
+  }
+
+  test('Complex graph', () {
     checkGraph(
         {
           'a': ['b', 'c'],
@@ -53,9 +51,9 @@
           ['a']
         ],
         [false, true, false]);
-  }
+  });
 
-  void test_diamond() {
+  test('Diamond', () {
     checkGraph(
         {
           'a': ['b', 'c'],
@@ -71,9 +69,9 @@
           ['a']
         ],
         [false, false, false, false]);
-  }
+  });
 
-  void test_singleNode() {
+  test('Single node', () {
     checkGraph(
         {'a': []},
         'a',
@@ -81,9 +79,9 @@
           ['a']
         ],
         [false]);
-  }
+  });
 
-  void test_singleNodeWithTrivialCycle() {
+  test('Single node with trivial cycle', () {
     checkGraph(
         {
           'a': ['a']
@@ -93,9 +91,9 @@
           ['a']
         ],
         [true]);
-  }
+  });
 
-  void test_threeNodesWithCircularDependency() {
+  test('Three nodes with circular dependency', () {
     checkGraph(
         {
           'a': ['b'],
@@ -107,43 +105,45 @@
           ['a', 'b', 'c']
         ],
         [true]);
-  }
+  });
 
-  test_twoBacklinksEarlierFirst() {
-    // Test a graph A->B->C->D, where D points back to B and then C.
-    checkGraph(
-        {
-          'a': ['b'],
-          'b': ['c'],
-          'c': ['d'],
-          'd': ['b', 'c']
-        },
-        'a',
-        [
-          ['b', 'c', 'd'],
-          ['a']
-        ],
-        [true, false]);
-  }
+  group('Two backlinks:', () {
+    test('earlier first', () {
+      // Test a graph A->B->C->D, where D points back to B and then C.
+      checkGraph(
+          {
+            'a': ['b'],
+            'b': ['c'],
+            'c': ['d'],
+            'd': ['b', 'c']
+          },
+          'a',
+          [
+            ['b', 'c', 'd'],
+            ['a']
+          ],
+          [true, false]);
+    });
 
-  test_twoBacklinksLaterFirst() {
-    // Test a graph A->B->C->D, where D points back to C and then B.
-    checkGraph(
-        {
-          'a': ['b'],
-          'b': ['c'],
-          'c': ['d'],
-          'd': ['c', 'b']
-        },
-        'a',
-        [
-          ['b', 'c', 'd'],
-          ['a']
-        ],
-        [true, false]);
-  }
+    test('later first', () {
+      // Test a graph A->B->C->D, where D points back to C and then B.
+      checkGraph(
+          {
+            'a': ['b'],
+            'b': ['c'],
+            'c': ['d'],
+            'd': ['c', 'b']
+          },
+          'a',
+          [
+            ['b', 'c', 'd'],
+            ['a']
+          ],
+          [true, false]);
+    });
+  });
 
-  void test_twoNodesWithCircularDependency() {
+  test('Two nodes with circular dependency', () {
     checkGraph(
         {
           'a': ['b'],
@@ -154,9 +154,9 @@
           ['a', 'b']
         ],
         [true]);
-  }
+  });
 
-  void test_twoNodesWithSimpleDependency() {
+  test('Two nodes with simple dependency', () {
     checkGraph(
         {
           'a': ['b'],
@@ -168,10 +168,7 @@
           ['a']
         ],
         [false, false]);
-  }
-
-  TestWalker walk(String startingNodeName) =>
-      TestWalker()..walk(getNode(startingNodeName));
+  });
 }
 
 class TestNode extends Node<TestNode> {
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
index cd96133..1a4ed51 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
@@ -4,10 +4,10 @@
 
 import 'dart:typed_data';
 
+import 'package:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/summary/api_signature.dart';
-import 'package:analyzer/src/summary/link.dart' as graph
-    show DependencyWalker, Node;
 import 'package:collection/collection.dart';
 
 /// Ensure that the [FileState.libraryCycle] for the [file] and anything it
diff --git a/pkg/analyzer/lib/src/dart/constant/compute.dart b/pkg/analyzer/lib/src/dart/constant/compute.dart
index b2b67c8..51188fe 100644
--- a/pkg/analyzer/lib/src/dart/constant/compute.dart
+++ b/pkg/analyzer/lib/src/dart/constant/compute.dart
@@ -2,12 +2,12 @@
 // 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:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/summary/link.dart' as graph
-    show DependencyWalker, Node;
 
 /// Compute values of the given [constants] with correct ordering.
 void computeConstants(DeclaredVariables declaredVariables,
diff --git a/pkg/analyzer/lib/src/dart/micro/library_graph.dart b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
index ce6edd3..d58d6bb 100644
--- a/pkg/analyzer/lib/src/dart/micro/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/micro/library_graph.dart
@@ -6,6 +6,8 @@
 import 'dart:typed_data';
 
 import 'package:_fe_analyzer_shared/src/scanner/token_impl.dart';
+import 'package:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -24,8 +26,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary/api_signature.dart';
-import 'package:analyzer/src/summary/link.dart' as graph
-    show DependencyWalker, Node;
 import 'package:analyzer/src/summary2/data_reader.dart';
 import 'package:analyzer/src/summary2/data_writer.dart';
 import 'package:analyzer/src/summary2/informative_data.dart';
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index e7c009f..b41bafc 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -5,6 +5,8 @@
 import 'dart:async';
 import 'dart:collection';
 
+import 'package:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/dart/analysis/analysis_context.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
@@ -22,8 +24,6 @@
 import 'package:analyzer/src/summary/api_signature.dart';
 import 'package:analyzer/src/summary/format.dart' as idl;
 import 'package:analyzer/src/summary/idl.dart' as idl;
-import 'package:analyzer/src/summary/link.dart' as graph
-    show DependencyWalker, Node;
 import 'package:analyzer/src/util/comment.dart';
 import 'package:analyzer/src/util/file_paths.dart' as file_paths;
 import 'package:collection/collection.dart';
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index 0fe77da..4a153a5 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -2,11 +2,11 @@
 // 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:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/summary/link.dart' as graph
-    show DependencyWalker, Node;
 import 'package:analyzer/src/summary2/link.dart';
 
 /// Compute simple-boundedness for all classes and generic types aliases in
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 82cba35..45b2edb 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -2,6 +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:_fe_analyzer_shared/src/util/dependency_walker.dart' as graph
+    show DependencyWalker, Node;
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
@@ -13,8 +15,6 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
-import 'package:analyzer/src/summary/link.dart' as graph
-    show DependencyWalker, Node;
 import 'package:analyzer/src/summary2/ast_resolver.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linking_node_scope.dart';
diff --git a/pkg/analyzer/test/src/summary/test_all.dart b/pkg/analyzer/test/src/summary/test_all.dart
index f944535..41786a1 100644
--- a/pkg/analyzer/test/src/summary/test_all.dart
+++ b/pkg/analyzer/test/src/summary/test_all.dart
@@ -5,7 +5,6 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'api_signature_test.dart' as api_signature;
-import 'dependency_walker_test.dart' as dependency_walker;
 import 'elements_test.dart' as elements;
 import 'flat_buffers_test.dart' as flat_buffers;
 import 'in_summary_source_test.dart' as in_summary_source;
@@ -15,7 +14,6 @@
 main() {
   defineReflectiveSuite(() {
     api_signature.main();
-    dependency_walker.main();
     elements.main();
     flat_buffers.main();
     in_summary_source.main();
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 9c7b439..5b21bf7 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -27,6 +27,7 @@
 adi
 advantage
 affecting
+affords
 afterwards
 agree
 agreeing
@@ -143,6 +144,7 @@
 brevity
 brianwilkerson
 bridge
+bridges
 bs
 bsd
 bslash
@@ -278,6 +280,7 @@
 customized
 cut
 cwd
+cyclical
 cyclically
 d
 dace
@@ -317,6 +320,7 @@
 demangle
 demangled
 dep
+dependency's
 deps
 dereferencing
 deregister
@@ -338,6 +342,7 @@
 dictates
 diff
 differs
+difficult
 diffs
 digest
 digests
@@ -432,6 +437,7 @@
 expense
 experimentation
 explaining
+explore
 exportable
 exportee
 exportees
@@ -494,6 +500,7 @@
 fourth
 framework
 freely
+freshly
 frontend
 frontends
 fs
@@ -671,6 +678,7 @@
 kallentu
 kb
 kernel's
+kick
 kill
 klass
 kmillikin
@@ -808,6 +816,7 @@
 nominality
 nonexistent
 nonimplementation
+nonzero
 norm
 normalization
 notifier
@@ -1110,6 +1119,7 @@
 say
 sb
 sc
+scc
 scheglov
 scoped
 scoping
@@ -1280,6 +1290,8 @@
 taking
 talk
 talks
+tarjan
+tarjan's
 tb
 team
 tearoff
@@ -1452,6 +1464,8 @@
 vtab
 w
 waiting
+walker
+walking
 wanting
 wants
 waste