library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/inline_class/external.dart:25:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
//   static external A staticMethod();
//          ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:27:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
//   static external T staticGenericMethod<T>(T t);
//          ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:29:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
//   static external B get staticGetter;
//          ^^^^^^^^
//
// pkg/front_end/testcases/inline_class/external.dart:31:10: Error: The modifier 'external' should be before the modifier 'static'.
// Try re-ordering the modifiers.
//   static external void set staticGetter(B b);
//          ^^^^^^^^
//
import self as self;
import "dart:core" as core;

abstract class A extends core::Object {
  synthetic constructor •() → self::A
    ;
}
inline class B /* declaredRepresentationType = self::A */ {
  method method = self::B|method;
  tearoff method = self::B|get#method;
  method genericMethod = self::B|genericMethod;
  tearoff genericMethod = self::B|get#genericMethod;
  get getter = self::B|get#getter;
  static method staticMethod = self::B|staticMethod;
  static method staticGenericMethod = self::B|staticGenericMethod;
  static get staticGetter = get self::B|staticGetter;
  set setter = self::B|set#setter;
  static set staticGetter = set self::B|staticGetter;
  constructor • = self::B|;
  constructor named = self::B|named;
}
external static method B|(self::A a) → self::B;
external static method B|named(core::int i) → self::B;
external static method B|method(lowered final self::B #this) → self::A;
static method B|get#method(lowered final self::B #this) → () → self::A
  return () → self::A => self::B|method(#this);
external static method B|genericMethod<T extends core::Object? = dynamic>(lowered final self::B #this, self::B|genericMethod::T% t) → self::B|genericMethod::T%;
static method B|get#genericMethod(lowered final self::B #this) → <T extends core::Object? = dynamic>(T%) → T%
  return <T extends core::Object? = dynamic>(T% t) → T% => self::B|genericMethod<T%>(#this, t);
external static method B|get#getter(lowered final self::B #this) → self::B;
external static method B|set#setter(lowered final self::B #this, self::B b) → void;
external static method B|staticMethod() → self::A;
external static method B|staticGenericMethod<T extends core::Object? = dynamic>(self::B|staticGenericMethod::T% t) → self::B|staticGenericMethod::T%;
external static get B|staticGetter() → self::B;
external static set B|staticGetter(self::B b) → void;
static method method(self::A a) → void
  ;
