library;
import self as self;
import "dart:core" as core;

class Struct extends core::Object {
  synthetic constructor •() → self::Struct*
    ;
}
class StructA extends self::Struct {
  synthetic constructor •() → self::StructA*
    ;
}
class StructB extends self::Struct {
  synthetic constructor •() → self::StructB*
    ;
}
class NonStruct extends core::Object {
  synthetic constructor •() → self::NonStruct*
    ;
}
extension Extension<T extends self::Struct* = dynamic> on T* {
  method method = self::Extension|method;
  tearoff method = self::Extension|get#method;
  get property = self::Extension|get#property;
  set property = self::Extension|set#property;
}
static method Extension|method<T extends self::Struct* = dynamic>(final self::Extension|method::T* #this) → self::Extension|method::T*
  ;
static method Extension|get#method<T extends self::Struct* = dynamic>(final self::Extension|get#method::T* #this) → () →* self::Extension|get#method::T*
  return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
static method Extension|get#property<T extends self::Struct* = dynamic>(final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
  ;
static method Extension|set#property<T extends self::Struct* = dynamic>(final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void
  ;
static method main() → dynamic
  ;
static method testNonStruct() → dynamic
  ;
