[ddc] Print AST of compiled libraries with summarize-text flag.

Moves dart2js DebugPrinter and Indentation to pkg/kernel/lib/text
and produces the AST of compiled libraries when ddc is run using
the --summarize-text flag.

Change-Id: I195ff99a0929ac12791b4f7b6c5e755b19065c23
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/208460
Commit-Queue: Riley Porter <rileyporter@google.com>
Reviewed-by: Nicholas Shahan <nshahan@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/compiler/lib/src/helpers/helpers.dart b/pkg/compiler/lib/src/helpers/helpers.dart
index a59366a..9828b7f 100644
--- a/pkg/compiler/lib/src/helpers/helpers.dart
+++ b/pkg/compiler/lib/src/helpers/helpers.dart
@@ -7,9 +7,10 @@
 
 library dart2js.helpers;
 
+import 'package:kernel/text/indentation.dart' show Indentation;
+
 import '../common.dart';
 import '../diagnostics/invariant.dart' show DEBUG_MODE;
-import '../util/util.dart';
 
 export 'debug_collection.dart';
 export 'expensive_map.dart';
@@ -89,6 +90,7 @@
 
 /// Implementation of [reportHere]
 _reportHere(DiagnosticReporter reporter, Spannable node, String debugMessage) {
+  // ignore: deprecated_member_use_from_same_package
   reporter.reportInfoMessage(
       node, MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});
 }
diff --git a/pkg/compiler/lib/src/helpers/stats.dart b/pkg/compiler/lib/src/helpers/stats.dart
index e524b54..7ca7960 100644
--- a/pkg/compiler/lib/src/helpers/stats.dart
+++ b/pkg/compiler/lib/src/helpers/stats.dart
@@ -6,6 +6,8 @@
 import 'dart:collection';
 import 'dart:convert';
 
+import 'package:kernel/text/indentation.dart' show Indentation;
+
 import '../../compiler.dart';
 import '../common.dart';
 import '../compiler.dart' show Compiler;
diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
index 9eaca9f..f37ce23 100644
--- a/pkg/compiler/lib/src/js/js_debug.dart
+++ b/pkg/compiler/lib/src/js/js_debug.dart
@@ -7,9 +7,9 @@
 library js.debug;
 
 import 'package:js_ast/js_ast.dart';
+import 'package:kernel/text/indentation.dart' show Indentation, Tagging;
 
 import '../io/code_output.dart' show BufferedCodeOutput;
-import '../util/util.dart' show Indentation, Tagging;
 
 /// Unparse the JavaScript [node].
 String nodeToString(Node node, {bool pretty: false}) {
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 33024bc..21e29f3 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -9,7 +9,7 @@
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/src/bounds_checks.dart' as ir;
-
+import 'package:kernel/text/debug_printer.dart';
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../closure.dart' show BoxLocal, ThisLocal;
@@ -27,7 +27,6 @@
 import '../ir/cached_static_type.dart';
 import '../ir/closure.dart';
 import '../ir/constants.dart';
-import '../ir/debug.dart';
 import '../ir/element_map.dart';
 import '../ir/types.dart';
 import '../ir/visitors.dart';
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index d568cea..7bf5db7 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -11,6 +11,7 @@
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
 import 'package:kernel/src/bounds_checks.dart' as ir;
+import 'package:kernel/text/debug_printer.dart';
 import 'package:kernel/type_environment.dart' as ir;
 
 import '../common.dart';
@@ -26,7 +27,6 @@
 import '../frontend_strategy.dart';
 import '../ir/annotations.dart';
 import '../ir/constants.dart';
-import '../ir/debug.dart';
 import '../ir/element_map.dart';
 import '../ir/impact.dart';
 import '../ir/impact_data.dart';
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index a02c499..c2c5c5f 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -4,11 +4,12 @@
 
 library tracer;
 
+import 'package:kernel/text/indentation.dart' show Indentation;
+
 import '../compiler_new.dart' as api;
 import 'options.dart' show CompilerOptions;
 import 'ssa/nodes.dart' as ssa show HGraph;
 import 'ssa/ssa_tracer.dart' show HTracer;
-import 'util/util.dart' show Indentation;
 import 'world.dart' show JClosedWorld;
 
 String TRACE_FILTER_PATTERN_FOR_TEST;
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index 703bf10..6a7894f 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -7,13 +7,11 @@
 library dart2js.util;
 
 import 'package:front_end/src/api_unstable/dart2js.dart'
-    show $BACKSLASH, $CR, $DEL, $DQ, $LF, $LS, $PS, $TAB, Link;
+    show $BACKSLASH, $CR, $DEL, $DQ, $LF, $LS, $PS, $TAB;
 
 export 'maplet.dart';
 export 'setlet.dart';
 
-part 'indentation.dart';
-
 /// Helper functions for creating hash codes.
 class Hashing {
   /// If an integer is masked by this constant, the result is guaranteed to be
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 2de20df3..408d757 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -18,6 +18,7 @@
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart' as kernel show Printer;
+import 'package:kernel/text/debug_printer.dart';
 import 'package:path/path.dart' as p;
 import 'package:source_maps/source_maps.dart' show SourceMapBuilder;
 
@@ -88,7 +89,7 @@
     ..addOption('packages', help: 'The package spec file to use.')
     // TODO(jmesserly): is this still useful for us, or can we remove it now?
     ..addFlag('summarize-text',
-        help: 'Emit API summary in a .js.txt file.',
+        help: 'Emit API summary and AST in .js.txt and .ast.xml files.',
         defaultsTo: false,
         hide: true)
     ..addFlag('track-widget-creation',
@@ -413,6 +414,8 @@
     var sb = StringBuffer();
     kernel.Printer(sb).writeComponentFile(component);
     outFiles.add(File(outPaths.first + '.txt').writeAsString(sb.toString()));
+    outFiles.add(File(outPaths.first.split('.')[0] + '.ast.xml')
+        .writeAsString(DebugPrinter.prettyPrint(compiledLibraries)));
   }
 
   final importToSummary = Map<Library, Component>.identity();
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index b0e58b2..6a43fbe 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -299,6 +299,7 @@
 deepest
 deeply
 def
+defaulting
 degrades
 degree
 del
@@ -821,6 +822,7 @@
 ogham
 oked
 op
+opens
 opt
 optimizations
 opting
@@ -1037,6 +1039,7 @@
 residue
 resource
 respond
+restoring
 restriction
 resumed
 ret
@@ -1211,6 +1214,7 @@
 t
 tagged
 tagger
+tagging
 tags
 tailor
 taking
diff --git a/pkg/compiler/lib/src/ir/debug.dart b/pkg/kernel/lib/text/debug_printer.dart
similarity index 93%
rename from pkg/compiler/lib/src/ir/debug.dart
rename to pkg/kernel/lib/text/debug_printer.dart
index 3b9e11a..fa700c1 100644
--- a/pkg/compiler/lib/src/ir/debug.dart
+++ b/pkg/kernel/lib/text/debug_printer.dart
@@ -8,14 +8,14 @@
 
 import 'package:kernel/ast.dart';
 
-import '../util/util.dart' show Indentation, Tagging;
+import 'indentation.dart' show Indentation, Tagging;
 
 class DebugPrinter extends Visitor<void>
     with Indentation, Tagging<Node>, VisitorVoidMixin {
   @override
   StringBuffer sb = new StringBuffer();
 
-  void visitNodeWithChildren(Node node, String type, [Map params]) {
+  void visitNodeWithChildren(Node node, String type, [Map? params]) {
     openNode(node, type, params);
     node.visitChildren(this);
     closeNode();
@@ -102,7 +102,7 @@
 
   /// Pretty-prints given node tree into string.
   static String prettyPrint(Node node) {
-    var p = new DebugPrinter();
+    DebugPrinter p = new DebugPrinter();
     node.accept(p);
     return p.sb.toString();
   }
diff --git a/pkg/compiler/lib/src/util/indentation.dart b/pkg/kernel/lib/text/indentation.dart
similarity index 95%
rename from pkg/compiler/lib/src/util/indentation.dart
rename to pkg/kernel/lib/text/indentation.dart
index d792f2f..0b7f8ee 100644
--- a/pkg/compiler/lib/src/util/indentation.dart
+++ b/pkg/kernel/lib/text/indentation.dart
@@ -2,9 +2,7 @@
 // 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.
 
-// @dart=2.12
-
-part of dart2js.util;
+import 'package:_fe_analyzer_shared/src/util/link.dart' show Link;
 
 /// Indentation utility class. Should be used as a mixin in most cases.
 class Indentation {
@@ -48,7 +46,7 @@
   /// upon return of [f] and returning its result.
   indentBlock(Function f) {
     indentMore();
-    var result = f();
+    dynamic result = f();
     indentLess();
     return result;
   }
@@ -135,5 +133,5 @@
   }
 
   /// Converts a parameter value into a string.
-  String valueToString(var value) => value;
+  String valueToString(dynamic value) => value;
 }
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 72c0820..c8300b2 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -8,6 +8,8 @@
 environment:
   sdk: '>=2.12.0 <3.0.0'
 dependencies:
+  _fe_analyzer_shared:
+    path: ../_fe_analyzer_shared
 dev_dependencies:
   args: '>=0.13.4 <2.0.0'
   expect:
diff --git a/pkg/compiler/test/model/indentation_test.dart b/pkg/kernel/test/indentation_test.dart
similarity index 88%
rename from pkg/compiler/test/model/indentation_test.dart
rename to pkg/kernel/test/indentation_test.dart
index 98a4f41..94bf983 100644
--- a/pkg/compiler/test/model/indentation_test.dart
+++ b/pkg/kernel/test/indentation_test.dart
@@ -2,10 +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.
 
-// @dart = 2.7
-
-import "package:expect/expect.dart";
-import 'package:compiler/src/util/util.dart' show Indentation;
+import 'package:expect/expect.dart';
+import 'package:kernel/text/indentation.dart' show Indentation;
 
 main() {
   Indentation ind = new Indentation();