generate method

void generate({
  1. required IOSink fileSink,
  2. required String target,
  3. Set<String> enumSet = const {},
  4. Set<String> structSet = const {},
  5. Set<String> callbackStructSet = const {},
})

Generates necessary code for a SteamStruct

Implementation

void generate({
  required IOSink fileSink,
  required String target,
  Set<String> enumSet = const {},
  Set<String> structSet = const {},
  Set<String> callbackStructSet = const {},
}) {
  fileSink.writeln(
    "// ignore_for_file: public_member_api_docs, always_specify_types, avoid_positional_boolean_parameters, avoid_classes_with_only_static_members",
  );
  fileSink.writeImport(packageName: "dart:ffi");
  fileSink.writeImport(packageName: "package:ffi/ffi.dart");

  fields.generateImport(
    fileSink: fileSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );

  methods.generateImport(
    fileSink: fileSink,
    enumSet: enumSet,
    structSet: structSet,
    callbackStructSet: callbackStructSet,
  );

  fileSink.writeImport(
    packageName: "../dl.dart",
  );
  fileSink.writeImport(
    packageName: "../typedefs.dart",
  );

  String correctedName = name.clearSteamNaming().pascalCase;

  fileSink.write("@Packed(${_getAlignment(target: target)})");
  fileSink.writeClass(
    className: correctedName,
    extend: fields.isNotEmpty ? "Struct" : "Opaque",
    isFinal: true,
  );
  fileSink.writeStartBlock();

  // write callback id before everything
  if (callbackId != -1) {
    fileSink.writeln("static int get callbackId => $callbackId;\n");
  }

  consts.generate(
    fileSink: fileSink,
  );

  fields.generate(
    fileSink: fileSink,
  );

  fileSink.writeEndBlock();

  if (methods.isNotEmpty || fields.isNotEmpty) {
    methods.generateLookup(
      fileSink: fileSink,
      owner: correctedName,
    );

    fileSink.writeExtension(
      extensionName: "${correctedName}Extensions",
      on: "Pointer<$correctedName>",
    );

    fileSink.writeStartBlock();

    methods.generate(
      fileSink: fileSink,
      owner: correctedName,
    );

    fields.generateFieldAccess(
      fileSink: fileSink,
    );

    fileSink.writeEndBlock();
  }
}