Reland "Change default of 'keepFields' in constant transformation to true"

Reviewed in https://dart-review.googlesource.com/c/sdk/+/97632

Change-Id: I042a81ffcf60b3dfb0666f69dcb97a8835036afc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97921
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 6da91e1..600ed94 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -58,7 +58,7 @@
 
 Component transformComponent(Component component, ConstantsBackend backend,
     Map<String, String> environmentDefines, ErrorReporter errorReporter,
-    {bool keepFields: false,
+    {bool keepFields: true,
     bool enableAsserts: false,
     bool evaluateAnnotations: true,
     CoreTypes coreTypes,
@@ -82,7 +82,7 @@
     Map<String, String> environmentDefines,
     TypeEnvironment typeEnvironment,
     ErrorReporter errorReporter,
-    {bool keepFields: false,
+    {bool keepFields: true,
     bool keepVariables: false,
     bool evaluateAnnotations: true,
     bool enableAsserts: false}) {
@@ -137,7 +137,7 @@
       // The transformer API does not iterate over `Library.additionalExports`,
       // so we manually delete the references to shaken nodes.
       library.additionalExports.removeWhere((Reference reference) {
-        return reference.canonicalName == null;
+        return reference.node is Field && reference.canonicalName == null;
       });
     }
   }
diff --git a/tests/compiler/dart2js/end_to_end/data/hello_world.dart b/tests/compiler/dart2js/end_to_end/data/hello_world.dart
new file mode 100644
index 0000000..3e3c4d4
--- /dev/null
+++ b/tests/compiler/dart2js/end_to_end/data/hello_world.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// 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.
+
+main() {
+  print("Hello World!");
+}
diff --git a/tests/compiler/dart2js/end_to_end/no_platform_test.dart b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
new file mode 100644
index 0000000..5a562a8
--- /dev/null
+++ b/tests/compiler/dart2js/end_to_end/no_platform_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// 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:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget;
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/target/targets.dart' hide DiagnosticReporter;
+import 'package:front_end/src/api_prototype/standard_file_system.dart' as fe;
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
+
+main() {
+  asyncTest(() async {
+    fe.InitializedCompilerState initializedCompilerState =
+        fe.initializeCompiler(
+            null,
+            new Dart2jsTarget('dart2js', new TargetFlags()),
+            Uri.base
+                .resolve('sdk/lib/libraries.json'), // librariesSpecificationUri
+            [], // linkedDependencies
+            Uri.base.resolve('.packages'), // packagesFileUri
+            experimentalFlags: const {
+              fe.ExperimentalFlag.constantUpdate2018: true
+            });
+    ir.Component component = await fe.compile(
+        initializedCompilerState, false, fe.StandardFileSystem.instance,
+        (fe.DiagnosticMessage message) {
+      message.plainTextFormatted.forEach(print);
+      Expect.notEquals(fe.Severity.error, message.severity);
+    },
+        Uri.base.resolve(
+            'tests/compiler/dart2js/end_to_end/data/hello_world.dart'));
+    Expect.isNotNull(new ir.CoreTypes(component).futureClass);
+  });
+}