[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