diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md index be5348fc7..b2b5f7741 100644 --- a/pkgs/ffigen/CHANGELOG.md +++ b/pkgs/ffigen/CHANGELOG.md @@ -1,3 +1,8 @@ +## 20.0.0-dev.1 + +- Make the `Logger` argument of `FfiGenerator.generate` optional. It defaults to + a logger printing to stdout and stderr. + ## 20.0.0-dev.0 - __Breaking change__: Completely rewrite the public Dart API for FFIgen. diff --git a/pkgs/ffigen/lib/src/config_provider/config.dart b/pkgs/ffigen/lib/src/config_provider/config.dart index 8b76cabb4..6afc39538 100644 --- a/pkgs/ffigen/lib/src/config_provider/config.dart +++ b/pkgs/ffigen/lib/src/config_provider/config.dart @@ -118,7 +118,10 @@ final class FfiGenerator { }); /// Run this generator. - void generate({required Logger? logger, Uri? libclangDylib}) { + /// + /// If provided, uses [logger] to output logs. Otherwise, uses a default + /// logger that streams [Level.WARNING] to stdout and higher levels to stderr. + void generate({Logger? logger, Uri? libclangDylib}) { return FfiGenGenerator( this, ).generate(logger: logger, libclangDylib: libclangDylib); diff --git a/pkgs/ffigen/lib/src/ffigen.dart b/pkgs/ffigen/lib/src/ffigen.dart index 95f2ed2bd..e2243d9e6 100644 --- a/pkgs/ffigen/lib/src/ffigen.dart +++ b/pkgs/ffigen/lib/src/ffigen.dart @@ -10,13 +10,17 @@ import 'package:logging/logging.dart'; import 'config_provider.dart' show Config, FfiGenerator; import 'context.dart'; import 'header_parser.dart' show parse; +import 'logger.dart'; final _ansi = Ansi(Ansi.terminalSupportsAnsi); extension FfiGenGenerator on FfiGenerator { /// Runs the entire generation pipeline for the given config. - void generate({required Logger? logger, Uri? libclangDylib}) { - logger ??= Logger.detached('dev/null')..level = Level.OFF; + /// + /// If provided, uses [logger] to output logs. Otherwise, uses a default + /// logger that streams [Level.WARNING] to stdout and higher levels to stderr. + void generate({Logger? logger, Uri? libclangDylib}) { + logger ??= createDefaultLogger(); final config = Config(this); final context = Context(logger, config, libclangDylib: libclangDylib); diff --git a/pkgs/ffigen/lib/src/logger.dart b/pkgs/ffigen/lib/src/logger.dart new file mode 100644 index 000000000..50c932182 --- /dev/null +++ b/pkgs/ffigen/lib/src/logger.dart @@ -0,0 +1,27 @@ +// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:logging/logging.dart'; + +/// Creates a default logger that logs to stdout and stderr. +Logger createDefaultLogger() { + final logger = Logger.detached('FFIgen'); + logger.level = Level.INFO; + logger.onRecord.listen((record) { + if (record.level >= Level.WARNING) { + stderr.writeln(record.message); + } else { + stdout.writeln(record.message); + } + if (record.error != null) { + stderr.writeln(record.error); + } + if (record.stackTrace != null) { + stderr.writeln(record.stackTrace); + } + }); + return logger; +} diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml index e4fa60a4e..9517c6925 100644 --- a/pkgs/ffigen/pubspec.yaml +++ b/pkgs/ffigen/pubspec.yaml @@ -3,7 +3,7 @@ # BSD-style license that can be found in the LICENSE file. name: ffigen -version: 20.0.0-dev.0 +version: 20.0.0-dev.1 description: > Generator for FFI bindings, using LibClang to parse C, Objective-C, and Swift files.