Fix `sort: true` not working, remove //+ from full comments. (#187)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a849f3..abc7d7b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 2.2.4
+- Fix `sort: true` not working.
+- Fix extra `//` or `///` in comments when using `comments -> style`: `full`.
+
# 2.2.3
- Added new subkey `dependency-only` (options - `full (default) | opaque`) under `structs`.
When set to `opaque`, ffigen will generate empty `Opaque` structs if structs
diff --git a/example/libclang-example/pubspec.yaml b/example/libclang-example/pubspec.yaml
index 9c67f6b..fe0f30b 100644
--- a/example/libclang-example/pubspec.yaml
+++ b/example/libclang-example/pubspec.yaml
@@ -13,7 +13,9 @@
ffigen:
output: 'generated_bindings.dart'
- sort: true
+
+ # This will sort the bindings alphabetically.
+ # sort: true
# This is required if LLVM can't be found in default locations by ffigen.
# llvm-lib: '/usr/local/opt/llvm/lib'
diff --git a/lib/src/code_generator/library.dart b/lib/src/code_generator/library.dart
index 893289d..d83a19d 100644
--- a/lib/src/code_generator/library.dart
+++ b/lib/src/code_generator/library.dart
@@ -27,7 +27,10 @@
required this.bindings,
String? header,
bool dartBool = true,
+ bool sort = false,
}) {
+ if (sort) _sort();
+
// Seperate bindings which require lookup.
final lookUpBindings = bindings.whereType<LookUpBinding>().toList();
final noLookUpBindings = bindings.whereType<NoLookUpBinding>().toList();
@@ -79,7 +82,7 @@
}
/// Sort all bindings in alphabetical order.
- void sort() {
+ void _sort() {
bindings.sort((b1, b2) => b1.name.compareTo(b2.name));
}
diff --git a/lib/src/header_parser/parser.dart b/lib/src/header_parser/parser.dart
index 3d4c5f0..a8473af 100644
--- a/lib/src/header_parser/parser.dart
+++ b/lib/src/header_parser/parser.dart
@@ -29,11 +29,9 @@
description: config.wrapperDocComment,
header: config.preamble,
dartBool: config.dartBool,
+ sort: config.sort,
);
- if (config.sort) {
- library.sort();
- }
return library;
}
diff --git a/lib/src/header_parser/utils.dart b/lib/src/header_parser/utils.dart
index ef91924..e1b205c 100644
--- a/lib/src/header_parser/utils.dart
+++ b/lib/src/header_parser/utils.dart
@@ -193,15 +193,21 @@
}
final sb = StringBuffer();
- // Remove comment identifiers.
- string = string.replaceAll('/*', '');
- string = string.replaceAll('*/', '');
+ // Remove comment identifiers (`/** * */`, `///`, `//`) from lines.
+ if (string.contains(RegExp(r'^\s*\/\*+'))) {
+ string = string.replaceFirst(RegExp(r'^\s*\/\*+\s*'), '');
+ string = string.replaceFirst(RegExp(r'\s*\*+\/$'), '');
+ string.split('\n').forEach((element) {
+ element = element.replaceFirst(RegExp(r'^\s*\**\s*'), '');
+ sb.writeln(element);
+ });
+ } else if (string.contains(RegExp(r'^\s*\/\/\/?\s*'))) {
+ string.split('\n').forEach((element) {
+ element = element.replaceFirst(RegExp(r'^\s*\/\/\/?\s*'), '');
+ sb.writeln(element);
+ });
+ }
- // Remove any *'s in the beginning of a every line.
- string.split('\n').forEach((element) {
- element = element.trim().replaceFirst(RegExp(r'\**'), '').trim();
- sb.writeln(element);
- });
return sb.toString().trim();
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 21c65c3..e986dfd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@
# BSD-style license that can be found in the LICENSE file.
name: ffigen
-version: 2.2.3
+version: 2.2.4
homepage: https://github.com/dart-lang/ffigen
description: Generator for FFI bindings, using LibClang to parse C header files.
diff --git a/test/code_generator_tests/code_generator_test.dart b/test/code_generator_tests/code_generator_test.dart
index 350b799..806ae22 100644
--- a/test/code_generator_tests/code_generator_test.dart
+++ b/test/code_generator_tests/code_generator_test.dart
@@ -365,6 +365,19 @@
);
_matchLib(library, 'boolean_no_dartbool');
});
+ test('sort bindings', () {
+ final library = Library(
+ name: 'Bindings',
+ sort: true,
+ bindings: [
+ Func(name: 'b', returnType: Type.nativeType(SupportedNativeType.Void)),
+ Func(name: 'a', returnType: Type.nativeType(SupportedNativeType.Void)),
+ Struc(name: 'd'),
+ Struc(name: 'c'),
+ ],
+ );
+ _matchLib(library, 'sort_bindings');
+ });
}
/// Utility to match expected bindings to the generated bindings.
diff --git a/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart b/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
new file mode 100644
index 0000000..aaa8f2d
--- /dev/null
+++ b/test/code_generator_tests/expected_bindings/_expected_sort_bindings_bindings.dart
@@ -0,0 +1,45 @@
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+import 'dart:ffi' as ffi;
+
+class Bindings {
+ /// Holds the symbol lookup function.
+ final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+ _lookup;
+
+ /// The symbols are looked up in [dynamicLibrary].
+ Bindings(ffi.DynamicLibrary dynamicLibrary) : _lookup = dynamicLibrary.lookup;
+
+ /// The symbols are looked up with [lookup].
+ Bindings.fromLookup(
+ ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+ lookup)
+ : _lookup = lookup;
+
+ void a() {
+ return _a();
+ }
+
+ late final _a_ptr = _lookup<ffi.NativeFunction<_c_a>>('a');
+ late final _dart_a _a = _a_ptr.asFunction<_dart_a>();
+
+ void b() {
+ return _b();
+ }
+
+ late final _b_ptr = _lookup<ffi.NativeFunction<_c_b>>('b');
+ late final _dart_b _b = _b_ptr.asFunction<_dart_b>();
+}
+
+class c extends ffi.Opaque {}
+
+class d extends ffi.Opaque {}
+
+typedef _c_a = ffi.Void Function();
+
+typedef _dart_a = void Function();
+
+typedef _c_b = ffi.Void Function();
+
+typedef _dart_b = void Function();
diff --git a/test/example_tests/libclang_example_test.dart b/test/example_tests/libclang_example_test.dart
index e7cbc56..f385b00 100644
--- a/test/example_tests/libclang_example_test.dart
+++ b/test/example_tests/libclang_example_test.dart
@@ -19,7 +19,6 @@
test('libclang-example', () {
final config = Config.fromYaml(loadYaml('''
${strings.output}: 'generated_bindings.dart'
-${strings.sort}: true
${strings.headers}:
${strings.entryPoints}:
- third_party/libclang/include/clang-c/Index.h
diff --git a/test/header_parser_tests/comment_markup.h b/test/header_parser_tests/comment_markup.h
new file mode 100644
index 0000000..1201e87
--- /dev/null
+++ b/test/header_parser_tests/comment_markup.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2021, 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.
+
+/// This is a single line test comment.
+void com1();
+
+/// This is a multi-line
+/// test comment.
+void com2();
+
+/** This is a multi-line
+ * doxygen style
+ * test comment.
+ */
+void com3();
+
+// Test comment for struct.
+struct com4{
+ /// Muli-line test comment for struct field
+ // With multiple line and both // and ///.
+ int a;
+
+ /* Single line field comment. */
+ float b;
+};
diff --git a/test/header_parser_tests/comment_markup_test.dart b/test/header_parser_tests/comment_markup_test.dart
new file mode 100644
index 0000000..6d3f8ba
--- /dev/null
+++ b/test/header_parser_tests/comment_markup_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2021, 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 'package:ffigen/src/code_generator.dart';
+import 'package:ffigen/src/header_parser.dart' as parser;
+import 'package:ffigen/src/config_provider.dart';
+import 'package:logging/logging.dart';
+import 'package:test/test.dart';
+import 'package:yaml/yaml.dart' as yaml;
+import 'package:ffigen/src/strings.dart' as strings;
+
+import '../test_utils.dart';
+
+late Library actual;
+void main() {
+ group('comment_markup_test', () {
+ setUpAll(() {
+ logWarnings(Level.SEVERE);
+ actual = parser.parse(
+ Config.fromYaml(yaml.loadYaml('''
+${strings.name}: 'NativeLibrary'
+${strings.description}: 'Comment Markup Test'
+${strings.output}: 'unused'
+${strings.headers}:
+ ${strings.entryPoints}:
+ - 'test/header_parser_tests/comment_markup.h'
+${strings.comments}:
+ ${strings.style}: ${strings.any}
+ ${strings.length}: ${strings.full}
+ ''') as yaml.YamlMap),
+ );
+ });
+
+ test('Expected bindings', () {
+ matchLibraryWithExpected(actual, [
+ 'test',
+ 'debug_generated',
+ 'comment_markup_test_output.dart'
+ ], [
+ 'test',
+ 'header_parser_tests',
+ 'expected_bindings',
+ '_expected_comment_markup_bindings.dart'
+ ]);
+ });
+ });
+}
diff --git a/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart b/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
new file mode 100644
index 0000000..75bc7c7
--- /dev/null
+++ b/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
@@ -0,0 +1,72 @@
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+import 'dart:ffi' as ffi;
+
+/// Comment Markup Test
+class NativeLibrary {
+ /// Holds the symbol lookup function.
+ final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+ _lookup;
+
+ /// The symbols are looked up in [dynamicLibrary].
+ NativeLibrary(ffi.DynamicLibrary dynamicLibrary)
+ : _lookup = dynamicLibrary.lookup;
+
+ /// The symbols are looked up with [lookup].
+ NativeLibrary.fromLookup(
+ ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
+ lookup)
+ : _lookup = lookup;
+
+ /// This is a single line test comment.
+ void com1() {
+ return _com1();
+ }
+
+ late final _com1_ptr = _lookup<ffi.NativeFunction<_c_com1>>('com1');
+ late final _dart_com1 _com1 = _com1_ptr.asFunction<_dart_com1>();
+
+ /// This is a multi-line
+ /// test comment.
+ void com2() {
+ return _com2();
+ }
+
+ late final _com2_ptr = _lookup<ffi.NativeFunction<_c_com2>>('com2');
+ late final _dart_com2 _com2 = _com2_ptr.asFunction<_dart_com2>();
+
+ /// This is a multi-line
+ /// doxygen style
+ /// test comment.
+ void com3() {
+ return _com3();
+ }
+
+ late final _com3_ptr = _lookup<ffi.NativeFunction<_c_com3>>('com3');
+ late final _dart_com3 _com3 = _com3_ptr.asFunction<_dart_com3>();
+}
+
+/// Test comment for struct.
+class com4 extends ffi.Struct {
+ /// Muli-line test comment for struct field
+ /// With multiple line and both // and ///.
+ @ffi.Int32()
+ external int a;
+
+ /// Single line field comment.
+ @ffi.Float()
+ external double b;
+}
+
+typedef _c_com1 = ffi.Void Function();
+
+typedef _dart_com1 = void Function();
+
+typedef _c_com2 = ffi.Void Function();
+
+typedef _dart_com2 = void Function();
+
+typedef _c_com3 = ffi.Void Function();
+
+typedef _dart_com3 = void Function();
diff --git a/test/native_test/config.yaml b/test/native_test/config.yaml
index 3933518..7abdce4 100644
--- a/test/native_test/config.yaml
+++ b/test/native_test/config.yaml
@@ -9,7 +9,6 @@
name: NativeLibrary
description: 'Native tests.'
output: 'test/native_test/native_test_bindings.dart'
-sort: true
headers:
entry-points:
- 'test/native_test/native_test.c'