[cfe] Write constant field initializers into outlines

For constant field initializers, compile the initializer expression
to Kernel, perform local type inference, and perform necessary
rewrites during outline construction.  This will support constant
evaluation during separate compilation.

Change-Id: I65fe601595c04c45d586d0bac97c2ade6ab15a90
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/104564
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Kevin Millikin <kmillikin@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 0ef4745..199e65c 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -77,7 +77,7 @@
     return library.partOfLibrary ?? library;
   }
 
-  void buildAnnotations(LibraryBuilder library) {}
+  void buildOutlineExpressions(LibraryBuilder library) {}
 
   /// Registers a constructor redirection for this class and returns true if
   /// this redirection gives rise to a cycle that has not been reported before.
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index ed544d6..51e0852 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -236,7 +236,7 @@
 
   void recordAccess(int charOffset, int length, Uri fileUri) {}
 
-  void buildAnnotations() {}
+  void buildOutlineExpressions() {}
 }
 
 class LibraryLocalDeclarationIterator implements Iterator<Declaration> {
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 2dd5099..0b99bf5 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -37,7 +37,7 @@
     }
   }
 
-  void buildAnnotations(LibraryBuilder library) {}
+  void buildOutlineExpressions(LibraryBuilder library) {}
 
   @override
   String get fullNameForErrors => name;
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 393be7d..3ef41dc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -171,7 +171,7 @@
   @override
   final Uri uri;
 
-  final TypeInferrer _typeInferrer;
+  final TypeInferrer typeInferrer;
 
   @override
   final TypePromoter typePromoter;
@@ -262,7 +262,7 @@
       this.classBuilder,
       this.isInstanceMember,
       this.uri,
-      this._typeInferrer)
+      this.typeInferrer)
       : enableNative =
             library.loader.target.backendTarget.enableNative(library.uri),
         stringExpectedAfterNative =
@@ -271,7 +271,7 @@
             (library.uri.path == "_builtin" || library.uri.path == "ui"),
         needsImplicitSuperInitializer =
             coreTypes?.objectClass != classBuilder?.cls,
-        typePromoter = _typeInferrer?.typePromoter,
+        typePromoter = typeInferrer?.typePromoter,
         legacyMode = library.legacyMode,
         super(enclosingScope);
 
@@ -306,7 +306,7 @@
     return isInstanceMember || member is KernelConstructorBuilder;
   }
 
-  TypeEnvironment get typeEnvironment => _typeInferrer?.typeSchemaEnvironment;
+  TypeEnvironment get typeEnvironment => typeInferrer?.typeSchemaEnvironment;
 
   DartType get implicitTypeArgument =>
       legacyMode ? const DynamicType() : const ImplicitTypeArgument();
@@ -463,7 +463,7 @@
 
   void inferAnnotations(List<Expression> annotations) {
     if (annotations != null) {
-      _typeInferrer?.inferMetadata(this, annotations);
+      typeInferrer?.inferMetadata(this, annotations);
       library.loader.transformListPostInference(
           annotations, transformSetLiterals, transformCollections);
     }
@@ -582,9 +582,13 @@
           // Duplicate definition. The field might not be the correct one,
           // so we skip inference of the initializer.
           // Error reporting and recovery is handled elsewhere.
+        } else if (field.target.initializer != null) {
+          // The initializer was already compiled (e.g., if it appear in the
+          // outline, like constant field initializers) so we do not need to
+          // perform type inference or transformations.
         } else {
           field.initializer = initializer;
-          _typeInferrer?.inferFieldInitializer(
+          typeInferrer?.inferFieldInitializer(
               this, field.builtType, initializer);
           library.loader.transformPostInference(
               field.target, transformSetLiterals, transformCollections);
@@ -711,7 +715,7 @@
       }
       initializer = buildInvalidInitializer(node, token.charOffset);
     }
-    _typeInferrer?.inferInitializer(this, initializer);
+    typeInferrer?.inferInitializer(this, initializer);
     if (member is KernelConstructorBuilder && !member.isExternal) {
       member.addInitializer(initializer, this);
     } else {
@@ -752,7 +756,7 @@
                 null);
           }
           realParameter.initializer = initializer..parent = realParameter;
-          _typeInferrer?.inferParameterInitializer(
+          typeInferrer?.inferParameterInitializer(
               this, initializer, realParameter.type);
           library.loader.transformPostInference(
               realParameter, transformSetLiterals, transformCollections);
@@ -760,7 +764,7 @@
       }
     }
 
-    _typeInferrer?.inferFunctionBody(
+    typeInferrer?.inferFunctionBody(
         this, _computeReturnTypeContext(member), asyncModifier, body);
     if (body != null) {
       library.loader.transformPostInference(
@@ -907,7 +911,7 @@
       // set its inferredType field.  If type inference is disabled, reach to
       // the outtermost parent to check if the node is a dead code.
       if (invocation.parent == null) continue;
-      if (_typeInferrer != null) {
+      if (typeInferrer != null) {
         if (invocation is FactoryConstructorInvocationJudgment &&
             invocation.inferredType == null) {
           continue;
@@ -1118,7 +1122,7 @@
 
     ReturnJudgment fakeReturn = new ReturnJudgment(null, expression);
 
-    _typeInferrer?.inferFunctionBody(
+    typeInferrer?.inferFunctionBody(
         this, const DynamicType(), AsyncMarker.Sync, fakeReturn);
 
     return fakeReturn.expression;
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index 902db15..c82886b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -15,9 +15,9 @@
 
 class ImplicitFieldType extends DartType {
   final MemberBuilder member;
-  final Token initializerToken;
+  Token initializerToken;
 
-  const ImplicitFieldType(this.member, this.initializerToken);
+  ImplicitFieldType(this.member, this.initializerToken);
 
   accept(DartTypeVisitor<Object> v) {
     unsupported("accept", member.charOffset, member.fileUri);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
index c37724b..278e742 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
@@ -42,7 +42,7 @@
       : forest = const Fangorn(),
         super.forField(member, typeInferrer);
 
-  KernelBodyBuilder.forAnnotation(
+  KernelBodyBuilder.forOutlineExpression(
       KernelLibraryBuilder library,
       KernelClassBuilder classBuilder,
       ModifierBuilder member,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
index 31214d6..5e4ac3a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
@@ -226,10 +226,10 @@
   }
 
   @override
-  void buildAnnotations(LibraryBuilder library) {
+  void buildOutlineExpressions(LibraryBuilder library) {
     void build(String ignore, Declaration declaration) {
       MemberBuilder member = declaration;
-      member.buildAnnotations(library);
+      member.buildOutlineExpressions(library);
     }
 
     KernelMetadataBuilder.buildAnnotations(
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
index 39c70c9..88a91b4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
@@ -7,10 +7,18 @@
 import 'package:kernel/ast.dart'
     show Class, DartType, DynamicType, Expression, Field, Name, NullLiteral;
 
+import '../constant_context.dart' show ConstantContext;
+
 import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
 
 import '../problems.dart' show internalProblem, unsupported;
 
+import '../scanner.dart' show Token;
+
+import '../scope.dart' show Scope;
+
+import '../source/source_loader.dart' show SourceLoader;
+
 import '../type_inference/type_inference_engine.dart'
     show IncludesTypeParametersCovariantly;
 
@@ -34,6 +42,7 @@
   final ShadowField field;
   final List<MetadataBuilder> metadata;
   final KernelTypeBuilder type;
+  Token constInitializerToken;
 
   KernelFieldBuilder(this.metadata, this.type, String name, int modifiers,
       Declaration compilationUnit, int charOffset, int charEndOffset)
@@ -94,10 +103,29 @@
   }
 
   @override
-  void buildAnnotations(LibraryBuilder library) {
+  void buildOutlineExpressions(LibraryBuilder library) {
     ClassBuilder classBuilder = isClassMember ? parent : null;
     KernelMetadataBuilder.buildAnnotations(
         field, metadata, library, classBuilder, this, null);
+    if (constInitializerToken != null) {
+      Scope scope = classBuilder?.scope ?? library.scope;
+      KernelBodyBuilder bodyBuilder =
+          new KernelBodyBuilder.forOutlineExpression(
+              library, classBuilder, this, scope, null, fileUri);
+      bodyBuilder.constantContext =
+          isConst ? ConstantContext.inferred : ConstantContext.none;
+      initializer = bodyBuilder.parseFieldInitializer(constInitializerToken)
+        ..parent = field;
+      constInitializerToken = null;
+      bodyBuilder.typeInferrer
+          ?.inferFieldInitializer(bodyBuilder, field.type, field.initializer);
+      if (library.loader is SourceLoader) {
+        SourceLoader loader = library.loader;
+        loader.transformPostInference(field, bodyBuilder.transformSetLiterals,
+            bodyBuilder.transformCollections);
+      }
+      bodyBuilder.resolveRedirectingFactoryTargets();
+    }
   }
 
   Field get target => field;
@@ -116,8 +144,12 @@
       }
       ImplicitFieldType type = field.type;
       field.type = const DynamicType();
-      initializer = new KernelBodyBuilder.forField(this, typeInferrer)
-          .parseFieldInitializer(type.initializerToken);
+      KernelBodyBuilder bodyBuilder =
+          new KernelBodyBuilder.forField(this, typeInferrer);
+      bodyBuilder.constantContext =
+          isConst ? ConstantContext.inferred : ConstantContext.none;
+      initializer = bodyBuilder.parseFieldInitializer(type.initializerToken);
+      type.initializerToken = null;
     }
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 983b7c7..1532c58 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -636,18 +636,18 @@
       String name,
       int charOffset,
       int charEndOffset,
-      Token initializerTokenForInference,
-      bool hasInitializer) {
+      Token initializerToken,
+      bool hasInitializer,
+      {Token constInitializerToken}) {
     if (hasInitializer) {
       modifiers |= hasInitializerMask;
     }
     KernelFieldBuilder field = new KernelFieldBuilder(
         metadata, type, name, modifiers, this, charOffset, charEndOffset);
+    field.constInitializerToken = constInitializerToken;
     addBuilder(name, field, charOffset);
-    if (initializerTokenForInference != null) {
-      assert(type == null);
-      field.target.type =
-          new ImplicitFieldType(field, initializerTokenForInference);
+    if (!legacyMode && type == null && initializerToken != null) {
+      field.target.type = new ImplicitFieldType(field, initializerToken);
     }
     loader.target.metadataCollector
         ?.setDocumentationComment(field.target, documentationComment);
@@ -903,7 +903,7 @@
   }
 
   @override
-  void buildAnnotations() {
+  void buildOutlineExpressions() {
     KernelMetadataBuilder.buildAnnotations(
         library, metadata, this, null, null, null);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
index 7bc39e6..1c9f1f0 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
@@ -38,7 +38,7 @@
     Scope scope = parent is Library || parent is Class || classBuilder == null
         ? library.scope
         : classBuilder.scope;
-    KernelBodyBuilder bodyBuilder = new KernelBodyBuilder.forAnnotation(
+    KernelBodyBuilder bodyBuilder = new KernelBodyBuilder.forOutlineExpression(
         library, classBuilder, member, scope, parameterScope, fileUri);
     for (int i = 0; i < metadata.length; ++i) {
       KernelMetadataBuilder annotationBuilder = metadata[i];
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index c8d217b..0e9e42e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -363,7 +363,7 @@
   }
 
   @override
-  void buildAnnotations(LibraryBuilder library) {
+  void buildOutlineExpressions(LibraryBuilder library) {
     ClassBuilder classBuilder = isClassMember ? parent : null;
     KernelMetadataBuilder.buildAnnotations(
         target,
@@ -497,7 +497,7 @@
   }
 
   @override
-  void buildAnnotations(LibraryBuilder library) {
+  void buildOutlineExpressions(LibraryBuilder library) {
     ClassBuilder classBuilder = isClassMember ? parent : null;
     KernelMetadataBuilder.buildAnnotations(
         target,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 83e30e9..5d67c40 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -279,7 +279,7 @@
       loader.checkRedirectingFactories(myClasses);
       loader.addNoSuchMethodForwarders(myClasses);
       loader.checkMixins(myClasses);
-      loader.buildAnnotations();
+      loader.buildOutlineExpressions();
       installAllComponentProblems(loader.allComponentProblems);
       loader.allComponentProblems.clear();
       return component;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 3323184..89abbb2 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -34,6 +34,8 @@
 
 import '../combinator.dart' show Combinator;
 
+import '../configuration.dart' show Configuration;
+
 import '../export.dart' show Export;
 
 import '../fasta_codes.dart'
@@ -69,7 +71,7 @@
 
 import '../import.dart' show Import;
 
-import '../configuration.dart' show Configuration;
+import '../modifier.dart' show constMask;
 
 import '../problems.dart' show unexpected, unhandled;
 
@@ -390,14 +392,18 @@
       String name,
       int charOffset,
       int charEndOffset,
-      Token initializerTokenForInference,
-      bool hasInitializer);
+      Token initializerToken,
+      bool hasInitializer,
+      {Token constInitializerToken});
 
   void addFields(String documentationComment, List<MetadataBuilder> metadata,
       int modifiers, T type, List<FieldInfo> fieldInfos) {
     for (FieldInfo info in fieldInfos) {
-      Token startToken =
-          type != null || legacyMode ? null : info.initializerTokenForInference;
+      bool isConst = modifiers & constMask != 0;
+      Token startToken;
+      if (isConst || (type == null && !legacyMode)) {
+        startToken = info.initializerToken;
+      }
       if (startToken != null) {
         // Extract only the tokens for the initializer expression from the
         // token stream.
@@ -405,9 +411,10 @@
         endToken.setNext(new Token.eof(endToken.next.offset));
         new Token.eof(startToken.previous.offset).setNext(startToken);
       }
-      bool hasInitializer = info.initializerTokenForInference != null;
+      bool hasInitializer = info.initializerToken != null;
       addField(documentationComment, metadata, modifiers, type, info.name,
-          info.charOffset, info.charEndOffset, startToken, hasInitializer);
+          info.charOffset, info.charEndOffset, startToken, hasInitializer,
+          constInitializerToken: isConst ? startToken : null);
     }
   }
 
@@ -1013,10 +1020,10 @@
 class FieldInfo {
   final String name;
   final int charOffset;
-  final Token initializerTokenForInference;
+  final Token initializerToken;
   final Token beforeLast;
   final int charEndOffset;
 
-  const FieldInfo(this.name, this.charOffset, this.initializerTokenForInference,
+  const FieldInfo(this.name, this.charOffset, this.initializerToken,
       this.beforeLast, this.charEndOffset);
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index adffcbd..2fed846 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -948,17 +948,17 @@
     ticker.logMs("Checked mixin declaration applications");
   }
 
-  void buildAnnotations() {
+  void buildOutlineExpressions() {
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
-        library.buildAnnotations();
+        library.buildOutlineExpressions();
         Iterator<Declaration> iterator = library.iterator;
         while (iterator.moveNext()) {
           Declaration declaration = iterator.current;
           if (declaration is ClassBuilder) {
-            declaration.buildAnnotations(library);
+            declaration.buildOutlineExpressions(library);
           } else if (declaration is MemberBuilder) {
-            declaration.buildAnnotations(library);
+            declaration.buildOutlineExpressions(library);
           }
         }
       }
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
index 65edda0..85cc345 100644
--- a/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
+++ b/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
@@ -181,16 +181,16 @@
   method execute() → void
     ;
 }
-static const field dynamic REQUIRED;
-static const field dynamic STRONG_PREFERRED;
-static const field dynamic PREFERRED;
-static const field dynamic STRONG_DEFAULT;
-static const field dynamic NORMAL;
-static const field dynamic WEAK_DEFAULT;
-static const field dynamic WEAKEST;
-static const field core::int NONE;
-static const field core::int FORWARD;
-static const field core::int BACKWARD;
+static const field dynamic REQUIRED = const self::Strength::•(0, "required");
+static const field dynamic STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
+static const field dynamic PREFERRED = const self::Strength::•(2, "preferred");
+static const field dynamic STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
+static const field dynamic NORMAL = const self::Strength::•(4, "normal");
+static const field dynamic WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
+static const field dynamic WEAKEST = const self::Strength::•(6, "weakest");
+static const field core::int NONE = 1;
+static const field core::int FORWARD = 2;
+static const field core::int BACKWARD = 0;
 static field self::Planner planner;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
index a04857a..c705421 100644
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
@@ -22,6 +22,6 @@
   method toString() → core::String
     return this.{=self::Foo::_name};
 }
-static const field core::int hest;
+static const field core::int hest = 42;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/annotation_top.dart.outline.expect b/pkg/front_end/testcases/annotation_top.dart.outline.expect
index 579ecba..11b2fda 100644
--- a/pkg/front_end/testcases/annotation_top.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_top.dart.outline.expect
@@ -16,7 +16,7 @@
   synthetic constructor •() → self::C
     ;
 }
-static const field core::Object a;
+static const field core::Object a = const core::Object::•();
 @self::a
 @self::A::•(3)
 static field core::int f1;
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect
index 945da25..1cdad69 100644
--- a/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect
@@ -4,8 +4,8 @@
 
 typedef F = (core::int, core::num, {w: core::Object, z: core::String}) → void;
 typedef G = (core::int, core::num, [core::String, core::Object]) → void;
-static const field core::int foo;
-static const field core::int bar;
-static const field core::int baz;
+static const field core::int foo = 21;
+static const field core::int bar = 42;
+static const field core::int baz = 84;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect
index e9a1864..8aca7b0 100644
--- a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 typedef F = (core::int) → core::int;
-static const field core::int app;
+static const field core::int app = 0;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
index 3eb241b..faa7175 100644
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
+++ b/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
@@ -19,6 +19,6 @@
   method hest({dynamic named}) → dynamic
     ;
 }
-static const field core::int foo;
+static const field core::int foo = 42;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/bug33099.dart.outline.expect b/pkg/front_end/testcases/bug33099.dart.outline.expect
index 24e4823..1753eb4 100644
--- a/pkg/front_end/testcases/bug33099.dart.outline.expect
+++ b/pkg/front_end/testcases/bug33099.dart.outline.expect
@@ -25,7 +25,7 @@
   synthetic constructor •() → self::MyTest2
     ;
 }
-static const field self::_FailingTest failingTest;
+static const field self::_FailingTest failingTest = const self::_FailingTest::•();
 static method main() → dynamic
   ;
 static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect
index 8e3f873..8658511 100644
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static const field dynamic constField;
+  static const field dynamic constField = 87;
   const constructor •(dynamic x) → self::C
     ;
 }
-static const field dynamic constTopLevelField;
+static const field dynamic constTopLevelField = 42;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/metadata_enum.dart.outline.expect b/pkg/front_end/testcases/metadata_enum.dart.outline.expect
index 1ecf0f8..16c0355 100644
--- a/pkg/front_end/testcases/metadata_enum.dart.outline.expect
+++ b/pkg/front_end/testcases/metadata_enum.dart.outline.expect
@@ -16,6 +16,6 @@
   method toString() → core::String
     return this.{=self::E::_name};
 }
-static const field dynamic a;
+static const field dynamic a = null;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
index ec64387..b3c6bd0 100644
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
@@ -16,6 +16,6 @@
   synthetic constructor •() → self::E
     ;
 }
-static const field dynamic a;
+static const field dynamic a = null;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect
index 2a8f6986..00b4657 100644
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect
+++ b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect
@@ -18,6 +18,6 @@
   method fun() → dynamic
     ;
 }
-static const field core::int foo;
+static const field core::int foo = const core::int::fromEnvironment("fisk");
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect
index 7c08d7a..c9b0d8b 100644
--- a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.outline.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
 
-static const field dynamic c;
+static const field dynamic c = 1;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/static.dart.outline.expect b/pkg/front_end/testcases/rasta/static.dart.outline.expect
index 970c3bb..f9b177a 100644
--- a/pkg/front_end/testcases/rasta/static.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static const field dynamic staticConstant;
+  static const field dynamic staticConstant = 42;
   static field dynamic staticField;
   synthetic constructor •() → self::Foo
     ;
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
index dc87a52..4830e5f 100644
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
+++ b/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
@@ -10,8 +10,8 @@
   static factory •(dynamic p) → self::Foo
     let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
 }
-static const field dynamic forParameter;
-static const field dynamic forFactoryItself;
-static const field dynamic anotherForParameter;
+static const field dynamic forParameter = 1;
+static const field dynamic forFactoryItself = 2;
+static const field dynamic anotherForParameter = 3;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
index b13488b..bd4a7de 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
@@ -12,7 +12,7 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int y;
+static const field core::int y = 42;
 @self::y
 static field core::int x;
 static method main() → dynamic