library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;

import "dart:ffi";
import "package:ffi/ffi.dart";

@#C7
class Coordinate extends ffi::Struct {
  static final field core::int* #sizeOf = (#C10).{core::List::[]}(ffi::_abi())/*isLegacy*/;
  @#C12
  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
    : super ffi::Struct::_fromPointer(#pointer)
    ;
  @#C13
  get x() → core::double
    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
  @#C13
  set x(core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
  @#C13
  get y() → core::double
    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()));
  @#C13
  set y(core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue);
  get next() → ffi::Pointer<self::Coordinate>
    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi())));
  set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
  static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
    return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
}
static method main() → dynamic {}

constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(ffi::Double)
  #C3 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
  #C4 = <core::Type>[#C2, #C2, #C3]
  #C5 = null
  #C6 = ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
  #C7 = core::pragma {name:#C1, options:#C6}
  #C8 = 24
  #C9 = 20
  #C10 = <core::int*>[#C8, #C9, #C8]
  #C11 = "vm:entry-point"
  #C12 = core::pragma {name:#C11, options:#C5}
  #C13 = ffi::Double {}
  #C14 = 0
  #C15 = <core::int*>[#C14, #C14, #C14]
  #C16 = 8
  #C17 = <core::int*>[#C16, #C16, #C16]
  #C18 = 16
  #C19 = <core::int*>[#C18, #C18, #C18]
}


Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
