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/private_nodes.dart
library;
import self as self;
import "dart:core" as core;
import "./private_nodes_lib.dart" as pri;

class _PrivateClass2 extends core::Object {
  field pri::A2 publicField2;
  constructor •() → void
    : super core::Object::•();
  method publicMethod2() → void;
}
class _PrivateClass21 extends self::_PrivateClass2 {
  field pri::A4 publicField21;
  constructor publicConstructor() → void
    : super self::_PrivateClass2::•();
  method publicMethod21() → void;
}
class PublicClass extends self::_PrivateClass21 {
  field pri::A6 publicField;
  constructor •() → void
    : super self::_PrivateClass21::publicConstructor();
  method publicMethod() → void;
}
static field pri::A8 publicField;
static method publicFunction() → pri::A10;

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

class A2 extends core::Object {
}
class A4 extends core::Object {
}
class A6 extends core::Object {
}
class A8 extends core::Object {
}
class A10 extends core::Object {
}

