[ffigen] Address pub score (#37)
Address pub score: follow dart File conventions, provide documentation, and pass static analysis.
diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md
index 40872de..2d65c34 100644
--- a/pkgs/ffigen/CHANGELOG.md
+++ b/pkgs/ffigen/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 0.1.1
+- Address pub score: follow dart File conventions, provide documentation, and pass static analysis.
+
# 0.1.0
- Support for Functions, Structs and Enums.
- Glob support for specifying headers.
diff --git a/pkgs/ffigen/analysis_options.yaml b/pkgs/ffigen/analysis_options.yaml
index fb0e867..4113a7c 100644
--- a/pkgs/ffigen/analysis_options.yaml
+++ b/pkgs/ffigen/analysis_options.yaml
@@ -8,8 +8,6 @@
strong-mode:
implicit-casts: false
implicit-dynamic: false
- errors:
- omit_local_variable_types: ignore
linter:
rules:
diff --git a/pkgs/ffigen/bin/ffigen.dart b/pkgs/ffigen/bin/ffigen.dart
index 2f0a07f..9328b28 100644
--- a/pkgs/ffigen/bin/ffigen.dart
+++ b/pkgs/ffigen/bin/ffigen.dart
@@ -6,8 +6,7 @@
import 'dart:io';
import 'package:args/args.dart';
-import 'package:ffigen/src/config_provider.dart';
-import 'package:ffigen/src/header_parser.dart' as parser;
+import 'package:ffigen/ffigen.dart';
import 'package:logging/logging.dart';
import 'package:yaml/yaml.dart' as yaml;
@@ -16,6 +15,9 @@
var _logger = Logger('ffigen.ffigen');
void main(List<String> args) {
+ // Parses the cmd args. This will print usage and exit if --help was passed.
+ final argResult = getArgResults(args);
+
/// Prompt user if dylib doesn't exist and cannot be auto created to run
/// `pub run ffigen:setup -Ipath/to/llvm/include -Lpath/to/llvm/lib`.
if (!checkDylibExist() && !autoCreateDylib()) {
@@ -25,23 +27,20 @@
exit(1);
}
- // Parses the cmd args.
- final result = getArgResults(args);
-
// Setup logging level and printing.
- setupLogger(result);
+ setupLogger(argResult);
// Create a config object.
Config config;
try {
- config = getConfig(result);
+ config = getConfig(argResult);
} on ConfigError {
print('Please fix configuration errors and re-run the tool.');
exit(1);
}
// Parse the bindings according to config object provided.
- final library = parser.parse(config);
+ final library = parse(config);
if (config.sort) {
library.sort();
diff --git a/pkgs/ffigen/bin/setup.dart b/pkgs/ffigen/bin/setup.dart
index ee52412..e933691 100644
--- a/pkgs/ffigen/bin/setup.dart
+++ b/pkgs/ffigen/bin/setup.dart
@@ -76,16 +76,19 @@
/// If main is called directly we always re-create the dynamic library.
void main(List<String> arguments) {
+ // Parses the cmd args. This will print usage and exit if --help was passed.
+ final argResults = _getArgResults(arguments);
+
print('Building Dynamic Library for libclang wrapper...');
final options = _getPlatformOptions();
_deleteOldDylib();
// Updates header/lib includes in platform options.
- _changeIncludesUsingCmdArgs(arguments, options);
+ _changeIncludesUsingCmdArgs(argResults, options);
// Run clang compiler to generate the dynamic library.
- final ProcessResult result = _runClangProcess(options);
- _printDetails(result, options);
+ final processResult = _runClangProcess(options);
+ _printDetails(processResult, options);
}
/// Returns true if auto creating dylib was successful.
@@ -95,8 +98,8 @@
bool autoCreateDylib() {
_deleteOldDylib();
final options = _getPlatformOptions();
- final ProcessResult result = _runClangProcess(options);
- if ((result.stderr as String).isNotEmpty) {
+ final processResult = _runClangProcess(options);
+ if ((processResult.stderr as String).isNotEmpty) {
print(stderr);
}
return checkDylibExist();
@@ -195,8 +198,7 @@
ArgResults _getArgResults(List<String> args) {
final parser = ArgParser(allowTrailingOptions: true);
- parser.addSeparator(
- 'Build Script to generate dynamic library used by this package:');
+ parser.addSeparator('Generates LLVM Wrapper used by this package:');
parser.addMultiOption('include-header',
abbr: 'I', help: 'Path to header include directories');
parser.addMultiOption('include-lib',
@@ -226,8 +228,7 @@
}
/// Use cmd args(if any) to change header/lib include paths.
-void _changeIncludesUsingCmdArgs(List<String> arguments, _Options options) {
- final argResult = _getArgResults(arguments);
+void _changeIncludesUsingCmdArgs(ArgResults argResult, _Options options) {
if (argResult.wasParsed('include-header')) {
options.headerIncludes = (argResult['include-header'] as List<String>)
.map((header) => '-I$header')
diff --git a/pkgs/ffigen/example/README.md b/pkgs/ffigen/example/README.md
new file mode 100644
index 0000000..954249d
--- /dev/null
+++ b/pkgs/ffigen/example/README.md
@@ -0,0 +1,5 @@
+## Examples
+
+- [Simple](https://github.com/dart-lang/ffigen/tree/master/example/simple)
+- [cJSON](https://github.com/dart-lang/ffigen/tree/master/example/c_json)
+- [LibClang](https://github.com/dart-lang/ffigen/tree/master/example/libclang-example)
diff --git a/pkgs/ffigen/lib/ffigen.dart b/pkgs/ffigen/lib/ffigen.dart
new file mode 100644
index 0000000..2b0a304
--- /dev/null
+++ b/pkgs/ffigen/lib/ffigen.dart
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, 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.
+
+/// A bindings generator for dart.
+///
+/// See complete usage at - https://pub.dev/packages/ffigen.
+library ffigen;
+
+export 'src/code_generator.dart' show Library;
+export 'src/config_provider.dart' show Config, ConfigError;
+export 'src/header_parser.dart' show parse;
diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart
index f0f317e..c6e6e83 100644
--- a/pkgs/ffigen/lib/src/code_generator/func.dart
+++ b/pkgs/ffigen/lib/src/code_generator/func.dart
@@ -33,7 +33,8 @@
final Type returnType;
final List<Parameter> parameters;
- /// [lookupSymbolName], if not provided, takes the value of [name].
+ /// [originalName] is looked up in dynamic library, if not
+ /// provided, takes the value of [name].
Func({
@required String name,
String originalName,
@@ -82,8 +83,8 @@
/// And only marks it as used at top-level.
String _uniqueTypedefName(String name, Writer w) {
final base = name;
- String uniqueName = name;
- int suffix = 0;
+ var uniqueName = name;
+ var suffix = 0;
while (w.topLevelUniqueNamer.isUsed(uniqueName) ||
w.wrapperLevelUniqueNamer.isUsed(uniqueName)) {
suffix++;
diff --git a/pkgs/ffigen/lib/src/code_generator/struc.dart b/pkgs/ffigen/lib/src/code_generator/struc.dart
index 11bae3d..9fd8d05 100644
--- a/pkgs/ffigen/lib/src/code_generator/struc.dart
+++ b/pkgs/ffigen/lib/src/code_generator/struc.dart
@@ -135,9 +135,9 @@
/// Gets a unique prefix in local namespace for expanded array items.
String getUniqueExpandedArrayItemPrefix() {
final base = '_unique';
- String expandedArrayItemPrefix = base;
- int suffixInt = 0;
- for (int i = 0; i < members.length; i++) {
+ var expandedArrayItemPrefix = base;
+ var suffixInt = 0;
+ for (var i = 0; i < members.length; i++) {
if (members[i].name.startsWith(expandedArrayItemPrefix)) {
// Not a unique prefix, start over with a new suffix.
i = -1;
@@ -171,7 +171,7 @@
int get expandedArrayLength {
if (_expandedArrayLength != null) return _expandedArrayLength;
- int arrayLength = 1;
+ var arrayLength = 1;
for (final i in dimensions) {
arrayLength = arrayLength * i;
}
@@ -193,7 +193,7 @@
final arrayDartType = elementType.getDartType(w);
final arrayCType = elementType.getCType(w);
- for (int i = 0; i < expandedArrayLength; i++) {
+ for (var i = 0; i < expandedArrayLength; i++) {
if (elementType.isPrimitive) {
s.write(' @${arrayCType}()\n');
}
@@ -210,7 +210,7 @@
String helperClassString(Writer w) {
final s = StringBuffer();
final arrayType = elementType.getDartType(w);
- for (int dim = 0; dim < dimensions.length; dim++) {
+ for (var dim = 0; dim < dimensions.length; dim++) {
final helperClassName = '${helperClassGroupName}_level${dim}';
final structIdentifier = '_struct';
final dimensionsIdentifier = 'dimensions';
@@ -262,7 +262,7 @@
s.write('$arrayType operator[](int index){\n');
s.write('$checkBoundsFunctionIdentifier(index);\n');
s.write('switch($absoluteIndexIdentifier+index){\n');
- for (int i = 0; i < expandedArrayLength; i++) {
+ for (var i = 0; i < expandedArrayLength; i++) {
s.write('case $i:\n');
s.write(' return $structIdentifier.${elementNamePrefix}$i;\n');
}
@@ -275,7 +275,7 @@
s.write('void operator[]=(int index, $arrayType value){\n');
s.write('$checkBoundsFunctionIdentifier(index);\n');
s.write('switch($absoluteIndexIdentifier+index){\n');
- for (int i = 0; i < expandedArrayLength; i++) {
+ for (var i = 0; i < expandedArrayLength; i++) {
s.write('case $i:\n');
s.write(' $structIdentifier.${elementNamePrefix}$i = value;\n');
s.write(' break;\n');
diff --git a/pkgs/ffigen/lib/src/code_generator/type.dart b/pkgs/ffigen/lib/src/code_generator/type.dart
index ad69ea4..9622ee4 100644
--- a/pkgs/ffigen/lib/src/code_generator/type.dart
+++ b/pkgs/ffigen/lib/src/code_generator/type.dart
@@ -127,8 +127,8 @@
/// Get base type for any type.
///
- /// E.g int** has base [Type] with [Broadtype] as NativeType,
- /// double[2][3] has base [Type] with [Broadtype] as double.
+ /// E.g int** has base [Type] of int.
+ /// double[2][3] has base [Type] of double.
Type getBaseType() {
if (child != null) {
return child.getBaseType();
diff --git a/pkgs/ffigen/lib/src/code_generator/utils.dart b/pkgs/ffigen/lib/src/code_generator/utils.dart
index 6bc9f2c..e91b5ee 100644
--- a/pkgs/ffigen/lib/src/code_generator/utils.dart
+++ b/pkgs/ffigen/lib/src/code_generator/utils.dart
@@ -15,8 +15,8 @@
///
/// Adds the resulting name to the used names by default.
String makeUnique(String name, [bool addToUsedUpNames = true]) {
- String cr_name = name;
- int i = 1;
+ var cr_name = name;
+ var i = 1;
while (_usedUpNames.contains(cr_name)) {
cr_name = '${name}_$i';
i++;
diff --git a/pkgs/ffigen/lib/src/code_generator/writer.dart b/pkgs/ffigen/lib/src/code_generator/writer.dart
index b46c4f9..06ea9d7 100644
--- a/pkgs/ffigen/lib/src/code_generator/writer.dart
+++ b/pkgs/ffigen/lib/src/code_generator/writer.dart
@@ -75,8 +75,8 @@
/// [_arrayHelperClassPrefix].
final base = 'ArrayHelper';
_arrayHelperClassPrefix = base;
- int suffixInt = 0;
- for (int i = 0; i < allNameSet.length; i++) {
+ var suffixInt = 0;
+ for (var i = 0; i < allNameSet.length; i++) {
if (allNameSet.elementAt(i).startsWith(_arrayHelperClassPrefix)) {
// Not a unique prefix, start over with a new suffix.
i = -1;
diff --git a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
index 2c0f666..d95b771 100644
--- a/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
+++ b/pkgs/ffigen/lib/src/header_parser/type_extractor/extractor.dart
@@ -168,7 +168,7 @@
/// Generate a unique string for naming in [Typedef].
String _getNextIncrementedString(String prefix) {
- int i = _incrementedStringCounters[prefix] ?? 0;
+ var i = _incrementedStringCounters[prefix] ?? 0;
i++;
_incrementedStringCounters[prefix] = i;
return '${prefix}_$i';
diff --git a/pkgs/ffigen/lib/src/header_parser/utils.dart b/pkgs/ffigen/lib/src/header_parser/utils.dart
index 052ea5f..f8c9507 100644
--- a/pkgs/ffigen/lib/src/header_parser/utils.dart
+++ b/pkgs/ffigen/lib/src/header_parser/utils.dart
@@ -181,7 +181,7 @@
final words = string.split(' ');
sb.write(words[0]);
- int trackLineWidth = words[0].length;
+ var trackLineWidth = words[0].length;
for (var i = 1; i < words.length; i++) {
final word = words[i];
if (trackLineWidth + word.length < lineWidth) {
diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml
index c412a92..201cf67 100644
--- a/pkgs/ffigen/pubspec.yaml
+++ b/pkgs/ffigen/pubspec.yaml
@@ -3,9 +3,9 @@
# BSD-style license that can be found in the LICENSE file.
name: ffigen
-version: 0.1.0
+version: 0.1.1
homepage: https://github.com/dart-lang/ffigen
-description: Experimental generator for FFI bindings.
+description: Experimental generator for FFI bindings, using LibClang to parse C/C++ header files.
environment:
sdk: '>=2.7.0 <3.0.0'
@@ -13,12 +13,12 @@
dependencies:
ffi: ^0.1.3
yaml: ^2.2.1
- meta: ^1.1.8
+ meta: ^1.2.2
args: ^1.6.0
logging: ^0.11.4
glob: ^1.2.0
path: ^1.7.0
dev_dependencies:
- pedantic: ^1.9.0
- test: ^1.14.3
+ pedantic: ^1.9.2
+ test: ^1.15.3
diff --git a/pkgs/ffigen/test/native_test/build_test_dylib.dart b/pkgs/ffigen/test/native_test/build_test_dylib.dart
index a41f874..e829231 100644
--- a/pkgs/ffigen/test/native_test/build_test_dylib.dart
+++ b/pkgs/ffigen/test/native_test/build_test_dylib.dart
@@ -60,8 +60,9 @@
final options = getPlatformOptions();
// Run clang compiler to generate the dynamic library.
- final ProcessResult result = runClangProcess(options);
- printSuccess(result, options);
+ // ignore: omit_local_variable_types
+ final processResult = runClangProcess(options);
+ printSuccess(processResult, options);
}
/// Calls the clang compiler.
diff --git a/pkgs/ffigen/test/native_test/native_test.dart b/pkgs/ffigen/test/native_test/native_test.dart
index c829a59..efb4ead 100644
--- a/pkgs/ffigen/test/native_test/native_test.dart
+++ b/pkgs/ffigen/test/native_test/native_test.dart
@@ -62,10 +62,10 @@
});
test('array-workaround: Order of access', () {
final struct1 = bindings.getStruct1();
- int expectedValue = 1;
- for (int i = 0; i < struct1.ref.data.dimensions[0]; i++) {
- for (int j = 0; j < struct1.ref.data.dimensions[1]; j++) {
- for (int k = 0; k < struct1.ref.data.dimensions[2]; k++) {
+ var expectedValue = 1;
+ for (var i = 0; i < struct1.ref.data.dimensions[0]; i++) {
+ for (var j = 0; j < struct1.ref.data.dimensions[1]; j++) {
+ for (var k = 0; k < struct1.ref.data.dimensions[2]; k++) {
expect(struct1.ref.data[i][j][k], expectedValue);
expectedValue++;
}
diff --git a/pkgs/ffigen/test/native_test/native_test_bindings.dart b/pkgs/ffigen/test/native_test/native_test_bindings.dart
index a9c5309..a49d622 100644
--- a/pkgs/ffigen/test/native_test/native_test_bindings.dart
+++ b/pkgs/ffigen/test/native_test/native_test_bindings.dart
@@ -265,8 +265,8 @@
ArrayHelper_Struct1_data_level1 operator [](int index) {
_checkBounds(index);
- int offset = index;
- for (int i = level + 1; i < dimensions.length; i++) {
+ var offset = index;
+ for (var i = level + 1; i < dimensions.length; i++) {
offset *= dimensions[i];
}
return ArrayHelper_Struct1_data_level1(
@@ -292,8 +292,8 @@
ArrayHelper_Struct1_data_level2 operator [](int index) {
_checkBounds(index);
- int offset = index;
- for (int i = level + 1; i < dimensions.length; i++) {
+ var offset = index;
+ for (var i = level + 1; i < dimensions.length; i++) {
offset *= dimensions[i];
}
return ArrayHelper_Struct1_data_level2(
diff --git a/pkgs/ffigen/tool/libclang_config.yaml b/pkgs/ffigen/tool/libclang_config.yaml
index aec3071..8159870 100644
--- a/pkgs/ffigen/tool/libclang_config.yaml
+++ b/pkgs/ffigen/tool/libclang_config.yaml
@@ -6,7 +6,7 @@
# ===================== GENERATING BINDINGS =====================
# cd to project's root, and run -
-# pub run ffigen --config libclang_config.yaml
+# pub run ffigen --config tool/libclang_config.yaml
# ===============================================================
name: Clang