Skip to content

Commit db42150

Browse files
authored
[ffigen] API cleanup (#2409)
* API cleanup * changelog * objc pubspec
1 parent 692c2da commit db42150

36 files changed

+173
-185
lines changed

pkgs/ffigen/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
## 20.0.0-wip
2+
3+
- __Breaking change__: Refactor the Dart API a bit, to merge the `FfiGen` and
4+
`Config` classes. Rename `FfiGen.run` to `.generate`, and make it an extension
5+
method on the `Config` class. So `FfiGen().run(config)` becomes
6+
`config.generate(logger)`.
7+
18
## 19.1.0
29

310
- Bump minimum Dart version to 3.8.0.

pkgs/ffigen/lib/ffigen.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ export 'src/config_provider.dart'
1313
show
1414
CommentType,
1515
CompoundDependencies,
16-
Config,
1716
Declaration,
1817
DeclarationFilters,
1918
ExternalVersions,
19+
FfiGen,
2020
FfiNativeConfig,
2121
Language,
2222
PackingValue,
@@ -25,4 +25,4 @@ export 'src/config_provider.dart'
2525
Versions,
2626
YamlConfig,
2727
defaultCompilerOpts;
28-
export 'src/ffigen.dart' show FfiGen;
28+
export 'src/ffigen.dart' show FfiGenGenerator;

pkgs/ffigen/lib/src/code_generator/library.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:yaml_edit/yaml_edit.dart';
99

1010
import '../code_generator.dart';
1111
import '../code_generator/utils.dart';
12-
import '../config_provider/config.dart' show Config;
12+
import '../config_provider/config.dart' show FfiGen;
1313
import '../config_provider/config_types.dart';
1414

1515
import 'writer.dart';
@@ -26,7 +26,7 @@ class Library {
2626
Library._(this.bindings, this.writer);
2727

2828
static Library fromConfig({
29-
required Config config,
29+
required FfiGen config,
3030
required List<Binding> bindings,
3131
}) => Library(
3232
name: config.wrapperName,

pkgs/ffigen/lib/src/config_provider/config.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import 'config_types.dart';
1010
import 'spec_utils.dart';
1111

1212
/// Provides configurations to other modules.
13-
abstract interface class Config {
13+
abstract interface class FfiGen {
1414
/// Input config filename, if any.
1515
Uri? get filename;
1616

@@ -192,7 +192,7 @@ abstract interface class Config {
192192
/// before this version will not be generated.
193193
ExternalVersions get externalVersions;
194194

195-
factory Config({
195+
factory FfiGen({
196196
Uri? filename,
197197
PackageConfig? packageConfig,
198198
Uri? libclangDylib,

pkgs/ffigen/lib/src/config_provider/config_impl.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import '../code_generator.dart';
88
import 'config.dart';
99
import 'config_types.dart';
1010

11-
class ConfigImpl implements Config {
11+
class ConfigImpl implements FfiGen {
1212
@override
1313
final Uri? filename;
1414

pkgs/ffigen/lib/src/config_provider/yaml_config.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ final _logger = Logger('ffigen.config_provider.config');
2323
/// Provides configurations to other modules.
2424
///
2525
/// Handles validation, extraction of configurations from a yaml file.
26-
class YamlConfig implements Config {
26+
class YamlConfig implements FfiGen {
2727
/// Input config filename, if any.
2828
@override
2929
final Uri? filename;

pkgs/ffigen/lib/src/executables/ffigen.dart

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,27 @@
66
import 'dart:io';
77

88
import 'package:args/args.dart';
9+
import 'package:cli_util/cli_logging.dart' show Ansi;
910
import 'package:logging/logging.dart';
1011
import 'package:package_config/package_config.dart';
1112
import 'package:yaml/yaml.dart' as yaml;
1213

1314
import '../../ffigen.dart';
1415

15-
final _logger = Logger('ffigen.ffigen');
16+
final _ansi = Ansi(Ansi.terminalSupportsAnsi);
17+
final _logger = () {
18+
final logger = Logger('ffigen.ffigen');
19+
logger.onRecord.listen((record) {
20+
final levelStr = '[${record.level.name}]'.padRight(9);
21+
final log = '$levelStr: ${record.message}';
22+
if (record.level < Level.SEVERE) {
23+
print(log);
24+
} else {
25+
print('${_ansi.red}$log${_ansi.none}');
26+
}
27+
});
28+
return logger;
29+
}();
1630

1731
const compilerOpts = 'compiler-opts';
1832
const ignoreSourceErrors = 'ignore-source-errors';
@@ -32,21 +46,21 @@ Future<void> main(List<String> args) async {
3246
// Parses the cmd args. This will print usage and exit if --help was passed.
3347
final argResult = getArgResults(args);
3448

35-
final ffigen = FfiGen(logLevel: _parseLogLevel(argResult));
49+
Logger.root.level = _parseLogLevel(argResult);
3650

3751
// Create a config object.
38-
Config config;
52+
FfiGen config;
3953
try {
4054
config = getConfig(argResult, await findPackageConfig(Directory.current));
4155
} on FormatException {
4256
_logger.severe('Please fix configuration errors and re-run the tool.');
4357
exit(1);
4458
}
4559

46-
ffigen.run(config);
60+
config.generate(_logger);
4761
}
4862

49-
Config getConfig(ArgResults result, PackageConfig? packageConfig) {
63+
FfiGen getConfig(ArgResults result, PackageConfig? packageConfig) {
5064
_logger.info('Running in ${Directory.current}');
5165
YamlConfig config;
5266

pkgs/ffigen/lib/src/ffigen.dart

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,50 +7,41 @@ import 'dart:io';
77
import 'package:cli_util/cli_logging.dart' show Ansi;
88
import 'package:logging/logging.dart';
99

10-
import 'config_provider.dart' show Config;
10+
import 'config_provider.dart' show FfiGen;
1111
import 'header_parser.dart' show parse;
1212

13-
final _logger = Logger('ffigen.ffigen');
1413
final _ansi = Ansi(Ansi.terminalSupportsAnsi);
1514

16-
class FfiGen {
17-
FfiGen({Level logLevel = Level.INFO}) {
18-
Logger.root.level = logLevel;
19-
Logger.root.onRecord.listen((record) {
20-
final levelStr = '[${record.level.name}]'.padRight(9);
21-
_printLog('$levelStr: ${record.message}', record.level);
22-
});
23-
}
24-
15+
extension FfiGenGenerator on FfiGen {
2516
/// Runs the entire generation pipeline for the given config.
26-
void run(Config config) {
17+
void generate(Logger logger) {
2718
// Parse the bindings according to config object provided.
28-
final library = parse(config);
19+
final library = parse(this);
2920

3021
// Generate files for the parsed bindings.
31-
final gen = File(config.output.toFilePath());
32-
library.generateFile(gen, format: config.formatOutput);
33-
_logger.info(
22+
final gen = File(output.toFilePath());
23+
library.generateFile(gen, format: formatOutput);
24+
logger.info(
3425
_successPen('Finished, Bindings generated in ${gen.absolute.path}'),
3526
);
3627

37-
final objCGen = File(config.outputObjC.toFilePath());
28+
final objCGen = File(outputObjC.toFilePath());
3829
if (library.generateObjCFile(objCGen)) {
39-
_logger.info(
30+
logger.info(
4031
_successPen(
4132
'Finished, Objective C bindings generated '
4233
'in ${objCGen.absolute.path}',
4334
),
4435
);
4536
}
4637

47-
if (config.symbolFile != null) {
48-
final symbolFileGen = File(config.symbolFile!.output.toFilePath());
38+
if (symbolFile != null) {
39+
final symbolFileGen = File(symbolFile!.output.toFilePath());
4940
library.generateSymbolOutputFile(
5041
symbolFileGen,
51-
config.symbolFile!.importPath.toString(),
42+
symbolFile!.importPath.toString(),
5243
);
53-
_logger.info(
44+
logger.info(
5445
_successPen(
5546
'Finished, Symbol Output generated in '
5647
'${symbolFileGen.absolute.path}',
@@ -59,15 +50,5 @@ class FfiGen {
5950
}
6051
}
6152

62-
static void _printLog(String log, Level level) {
63-
// Prints text in red for Severe logs only.
64-
if (level < Level.SEVERE) {
65-
print(log);
66-
} else {
67-
print(_errorPen(log));
68-
}
69-
}
70-
7153
static String _successPen(String str) => '${_ansi.green}$str${_ansi.none}';
72-
static String _errorPen(String str) => '${_ansi.red}$str${_ansi.none}';
7354
}

pkgs/ffigen/lib/src/header_parser/data.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import 'dart:ffi';
66

77
import '../code_generator.dart' show Constant, ObjCBuiltInFunctions;
8-
import '../config_provider.dart' show Config;
8+
import '../config_provider.dart' show FfiGen;
99
import 'clang_bindings/clang_bindings.dart' show Clang;
1010

1111
import 'utils.dart';
1212

1313
/// Holds all Global shared variables.
1414
1515
/// Holds configurations.
16-
Config get config => _config;
17-
late Config _config;
16+
FfiGen get config => _config;
17+
late FfiGen _config;
1818

1919
/// Holds clang functions.
2020
Clang get clang => _clang;
@@ -48,7 +48,7 @@ late ObjCBuiltInFunctions _objCBuiltInFunctions;
4848
/// invalid generated bindings.
4949
bool hasSourceErrors = false;
5050

51-
void initializeGlobals({required Config config}) {
51+
void initializeGlobals({required FfiGen config}) {
5252
_config = config;
5353
_clang = Clang(DynamicLibrary.open(config.libclangDylib.toFilePath()));
5454
_incrementalNamer = IncrementalNamer();

pkgs/ffigen/lib/src/header_parser/parser.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import 'translation_unit_parser.dart';
3030
import 'utils.dart';
3131

3232
/// Main entrypoint for header_parser.
33-
Library parse(Config config) {
33+
Library parse(FfiGen config) {
3434
initParser(config);
3535

3636
return Library.fromConfig(
@@ -46,13 +46,13 @@ Library parse(Config config) {
4646
final _logger = Logger('ffigen.header_parser.parser');
4747

4848
/// Initializes parser, clears any previous values.
49-
void initParser(Config c) {
49+
void initParser(FfiGen c) {
5050
// Initialize global variables.
5151
initializeGlobals(config: c);
5252
}
5353

5454
/// Parses source files and returns the bindings.
55-
List<Binding> parseToBindings(Config c) {
55+
List<Binding> parseToBindings(FfiGen c) {
5656
final index = clang.clang_createIndex(0, 0);
5757

5858
Pointer<Pointer<Utf8>> clangCmdArgs = nullptr;
@@ -170,7 +170,7 @@ List<String> _findObjectiveCSysroot() => [
170170
];
171171

172172
@visibleForTesting
173-
List<Binding> transformBindings(Config config, List<Binding> bindings) {
173+
List<Binding> transformBindings(FfiGen config, List<Binding> bindings) {
174174
visit(CopyMethodsFromSuperTypesVisitation(), bindings);
175175
visit(FixOverriddenMethodsVisitation(), bindings);
176176
visit(FillMethodDependenciesVisitation(), bindings);

0 commit comments

Comments
 (0)