main = main::main;
library from "org-dartlang-test:///lib.dart" as lib {

  import "dart:ffi";

  @#C7
  class Coordinate extends dart.ffi::Struct {
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → lib::Coordinate
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    @#C8
    get x() → dart.core::double
      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set x(dart.core::double #externalFieldValue) → void
      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    @#C8
    get y() → dart.core::double
      return dart.ffi::_loadDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C8
    set y(dart.core::double #externalFieldValue) → void
      return dart.ffi::_storeDouble(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue);
    get next() → dart.ffi::Pointer<lib::Coordinate>?
      return dart.ffi::_fromAddress<lib::Coordinate>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set next(dart.ffi::Pointer<lib::Coordinate>? #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    static factory allocate(dart.core::double x, dart.core::double y, dart.ffi::Pointer<lib::Coordinate>? next) → lib::Coordinate {
      throw "";
    }
    @#C16
    static get #sizeOf() → dart.core::int*
      return #C19.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
}
library from "org-dartlang-test:///main.dart" as main {

  import "org-dartlang-test:///lib.dart";

  late static field lib::Coordinate coordinate;
  static method main() → dynamic {
    main::coordinate = lib::Coordinate::allocate(42.0, 42.0, null);
    dart.core::print(main::coordinate.{lib::Coordinate::x}{dart.core::double});
    dart.core::print(main::coordinate.{lib::Coordinate::y}{dart.core::double});
    dart.core::print(main::coordinate.{lib::Coordinate::next}{dart.ffi::Pointer<lib::Coordinate>?});
  }
}
constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(dart.ffi::Double)
  #C3 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
  #C4 = <dart.core::Type>[#C2, #C2, #C3]
  #C5 = null
  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
  #C7 = dart.core::pragma {name:#C1, options:#C6}
  #C8 = dart.ffi::Double {}
  #C9 = 0
  #C10 = <dart.core::int*>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
  #C11 = 8
  #C12 = <dart.core::int*>[#C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11, #C11]
  #C13 = 16
  #C14 = <dart.core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]
  #C15 = "vm:prefer-inline"
  #C16 = dart.core::pragma {name:#C15, options:#C5}
  #C17 = 24
  #C18 = 20
  #C19 = <dart.core::int*>[#C17, #C17, #C18, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C18, #C17, #C17, #C17, #C17, #C17, #C17, #C17, #C17]
}


Constructor coverage from constants:
org-dartlang-test:///lib.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart)
- _NativeDouble. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart)
- NativeType. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)

