library /*isNonNullableByDefault*/;
import self as self;
import "dart:ffi" as ffi;
import "dart:core" as core;
import "package:ffi/src/allocation.dart" as all;

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

class Coordinate extends ffi::Struct {
  @#C1
  external get x() → core::double;
  @#C1
  external set x(core::double #externalFieldValue) → void;
  @#C1
  external get y() → core::double;
  @#C1
  external set y(core::double #externalFieldValue) → void;
  external get next() → ffi::Pointer<self::Coordinate>;
  external set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void;
  static factory allocate(core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
    return let final self::Coordinate #t1 = ffi::StructPointer|get#ref<self::Coordinate>(all::allocate<self::Coordinate>()) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
}
static method main() → dynamic {}

constants  {
  #C1 = ffi::Double {}
}


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