Library constructor

Library({
  1. required String name,
  2. String? description,
  3. required List<Binding> bindings,
  4. String? header,
  5. bool sort = false,
  6. bool generateForPackageObjectiveC = false,
  7. StructPackingOverride? packingOverride,
  8. Set<LibraryImport>? libraryImports,
})

Implementation

Library({
  required String name,
  String? description,
  required List<Binding> bindings,
  String? header,
  bool sort = false,
  bool generateForPackageObjectiveC = false,
  StructPackingOverride? packingOverride,
  Set<LibraryImport>? libraryImports,
}) {
  _findBindings(bindings, sort);

  /// Handle any declaration-declaration name conflicts and emit warnings.
  final declConflictHandler = UniqueNamer({});
  for (final b in this.bindings) {
    _warnIfPrivateDeclaration(b);
    _resolveIfNameConflicts(declConflictHandler, b);
  }

  // Override pack values according to config. We do this after declaration
  // conflicts have been handled so that users can target the generated names.
  if (packingOverride != null) {
    for (final b in this.bindings) {
      if (b is Struct && packingOverride.isOverriden(b.name)) {
        b.pack = packingOverride.getOverridenPackValue(b.name);
      }
    }
  }

  // Seperate bindings which require lookup.
  final lookupBindings = <LookUpBinding>[];
  final nativeBindings = <LookUpBinding>[];
  FfiNativeConfig? nativeConfig;

  for (final binding in this.bindings.whereType<LookUpBinding>()) {
    final nativeConfigForBinding = switch (binding) {
      Func() => binding.ffiNativeConfig,
      Global() => binding.nativeConfig,
      _ => null,
    };

    // At the moment, all bindings share their native config.
    nativeConfig ??= nativeConfigForBinding;

    final usesLookup =
        nativeConfigForBinding == null || !nativeConfigForBinding.enabled;
    (usesLookup ? lookupBindings : nativeBindings).add(binding);
  }
  final noLookUpBindings =
      this.bindings.whereType<NoLookUpBinding>().toList();

  _writer = Writer(
    lookUpBindings: lookupBindings,
    ffiNativeBindings: nativeBindings,
    nativeAssetId: nativeConfig?.assetId,
    noLookUpBindings: noLookUpBindings,
    className: name,
    classDocComment: description,
    header: header,
    additionalImports: libraryImports,
    generateForPackageObjectiveC: generateForPackageObjectiveC,
  );
}