This file was autogenerated from running the shaker test suite.
To update this file, either copy the output from a failing test or run
pkg/front_end/tool/fasta testing shaker -DupdateExpectations=true
----- pkg/front_end/testcases/shaker/target_constant.dart
library;
import self as self;
import "dart:core" as core;
import "./target_constant_lib.dart" as tar;

class RefStaticConstFields extends core::Object {
  static const field core::int staticConstField_from_staticConst = tar::A1::staticConstField1;
  static field core::int staticConstField_from_static;
  static final field core::int staticConstField_from_staticFinal;
  final field core::int staticConstField_from_final;
  field core::int staticConstField_from_regular;
  synthetic constructor •() → void
    : super core::Object::•();
}
class RefNotConstStaticFields extends core::Object {
  static field core::int ref_staticFinalField;
  static field core::int ref_staticField;
  synthetic constructor •() → void
    : super core::Object::•();
}
class RefNotConstInstanceFields extends core::Object {
  static field core::int ref_instanceFinalField;
  static field core::int ref_instanceField;
  synthetic constructor •() → void
    : super core::Object::•();
}
static const field dynamic b = const tar::B::•();

----- external pkg/front_end/testcases/shaker/target_constant_lib.dart
library;
import self as self;
import "dart:core" as core;

class A1 extends core::Object {
  static const field core::int staticConstField1 = self::_A12::staticConstField21;
}
class _A12 extends core::Object {
  static const field core::int staticConstField21 = 42;
}
class B extends core::Object {
  final field core::int instanceFinalField1 = self::B2::field21;
  final field core::int instanceFinalField2 = self::B2::field22;
  const constructor •() → void
    : super core::Object::•();
}
class B2 extends core::Object {
  static const field core::int field21 = 42;
  static const field core::int field22 = 42;
}

