[ffigen] Handle function argument dart keywords and setup travis (#49)

Closes #47 , closes #44
- Fixed function argument name conflicts with dart keywords.
- Updated tests, examples
- Updated Travis: libclang-dev and clang are installed, `pub run ffigen:setup` is called before running tasks.
diff --git a/pkgs/ffigen/.travis.yml b/pkgs/ffigen/.travis.yml
index 6ec14e5..fe0efef 100644
--- a/pkgs/ffigen/.travis.yml
+++ b/pkgs/ffigen/.travis.yml
@@ -11,3 +11,15 @@
 cache:
   directories:
     - $HOME/.pub-cache
+before_install:
+  # install libclang-dev
+  - sudo add-apt-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main"
+  - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add -
+  - sudo apt-get update
+  - sudo apt-get install clang-10 libclang-10-dev
+  # use clang from installed llvm
+  - export PATH="/usr/lib/llvm-10/bin:$PATH"
+
+before_script:
+  - 'pub run ffigen:setup'
+  - cd test/native_test && dart build_test_dylib.dart && cd ../..
diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md
index 83afb0b..bd81e15 100644
--- a/pkgs/ffigen/CHANGELOG.md
+++ b/pkgs/ffigen/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.1.3
+- Handled function arguments - dart keyword name collision
+- Fix travis tests: the dynamic library is created using `pub run ffigen:setup` before running the tests.
+
 # 0.1.2
 - Fixed wrapper not found error when running `pub run ffigen`.
 
diff --git a/pkgs/ffigen/example/libclang-example/generated_bindings.dart b/pkgs/ffigen/example/libclang-example/generated_bindings.dart
index b58ac84..bd5b8ce 100644
--- a/pkgs/ffigen/example/libclang-example/generated_bindings.dart
+++ b/pkgs/ffigen/example/libclang-example/generated_bindings.dart
@@ -14,12 +14,12 @@
 
   /// Free the given string set.
   void clang_disposeStringSet(
-    ffi.Pointer<CXStringSet> set,
+    ffi.Pointer<CXStringSet> set_1,
   ) {
     _clang_disposeStringSet ??= _dylib.lookupFunction<_c_clang_disposeStringSet,
         _dart_clang_disposeStringSet>('clang_disposeStringSet');
     return _clang_disposeStringSet(
-      set,
+      set_1,
     );
   }
 
@@ -3294,11 +3294,11 @@
 }
 
 typedef _c_clang_disposeStringSet = ffi.Void Function(
-  ffi.Pointer<CXStringSet> set,
+  ffi.Pointer<CXStringSet> set_1,
 );
 
 typedef _dart_clang_disposeStringSet = void Function(
-  ffi.Pointer<CXStringSet> set,
+  ffi.Pointer<CXStringSet> set_1,
 );
 
 typedef _c_clang_createIndex = ffi.Pointer<ffi.Void> Function(
diff --git a/pkgs/ffigen/lib/src/code_generator/func.dart b/pkgs/ffigen/lib/src/code_generator/func.dart
index c6e6e83..62194c1 100644
--- a/pkgs/ffigen/lib/src/code_generator/func.dart
+++ b/pkgs/ffigen/lib/src/code_generator/func.dart
@@ -117,7 +117,11 @@
     if (dartDoc != null) {
       s.write(makeDartDoc(dartDoc));
     }
-
+    // Resolve name conflicts in function parameter names.
+    final paramNamer = UniqueNamer({});
+    for (final p in parameters) {
+      p.name = paramNamer.makeUnique(p.name);
+    }
     // Write enclosing function.
     s.write('${returnType.getDartType(w)} $enclosingFuncName(\n');
     for (final p in parameters) {
diff --git a/pkgs/ffigen/lib/src/code_generator/typedef.dart b/pkgs/ffigen/lib/src/code_generator/typedef.dart
index 17b6dee..0cf7f84 100644
--- a/pkgs/ffigen/lib/src/code_generator/typedef.dart
+++ b/pkgs/ffigen/lib/src/code_generator/typedef.dart
@@ -44,18 +44,21 @@
       s.write(makeDartDoc(dartDoc));
     }
     final typedefName = name;
-
+    final paramNamer = UniqueNamer({});
     if (typedefType == TypedefType.C) {
       s.write('typedef $typedefName = ${returnType.getCType(w)} Function(\n');
       for (final p in parameters) {
-        s.write('  ${p.type.getCType(w)} ${p.name},\n');
+        final name = p.name.isNotEmpty ? paramNamer.makeUnique(p.name) : p.name;
+        s.write('  ${p.type.getCType(w)} ${name},\n');
       }
       s.write(');\n\n');
     } else {
       s.write(
           'typedef $typedefName = ${returnType.getDartType(w)} Function(\n');
       for (final p in parameters) {
-        s.write('  ${p.type.getDartType(w)} ${p.name},\n');
+        final name = p.name.isNotEmpty ? paramNamer.makeUnique(p.name) : p.name;
+
+        s.write('  ${p.type.getDartType(w)} ${name},\n');
       }
       s.write(');\n\n');
     }
diff --git a/pkgs/ffigen/pubspec.yaml b/pkgs/ffigen/pubspec.yaml
index 8da3a6a..be2b32e 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: 0.1.2
+version: 0.1.3
 homepage: https://github.com/dart-lang/ffigen
 description: Experimental generator for FFI bindings, using LibClang to parse C/C++ header files.
 
diff --git a/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart b/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart
index 24bd079..e0ebb25 100644
--- a/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/decl_decl_collision_test.dart
@@ -5,7 +5,6 @@
 import 'package:ffigen/src/code_generator.dart';
 import 'package:logging/logging.dart';
 import 'package:test/test.dart';
-
 import '../test_utils.dart';
 
 void main() {
diff --git a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
index a41e939..964d7ea 100644
--- a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
+++ b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision_test.dart
@@ -16,6 +16,7 @@
     test('reserved keyword collision', () {
       final l1 = Library(name: 'Bindings', bindings: [
         Struc(name: 'abstract'),
+        Struc(name: 'abstract'),
         Struc(name: 'if'),
         EnumClass(name: 'return'),
         EnumClass(name: 'export'),
@@ -24,10 +25,25 @@
             returnType: Type.nativeType(SupportedNativeType.Void)),
         Func(
             name: 'implements',
+            parameters: [
+              Parameter(
+                type: Type.nativeType(SupportedNativeType.Int32),
+                name: 'if',
+              ),
+              Parameter(
+                type: Type.nativeType(SupportedNativeType.Int32),
+                name: 'abstract',
+              ),
+              Parameter(
+                type: Type.nativeType(SupportedNativeType.Int32),
+                name: 'in',
+              ),
+            ],
             returnType: Type.nativeType(SupportedNativeType.Void)),
       ]);
       final l2 = Library(name: 'Bindings', bindings: [
         Struc(name: 'abstract_1'),
+        Struc(name: 'abstract_2'),
         Struc(name: 'if_1'),
         EnumClass(name: 'return_1'),
         EnumClass(name: 'export_1'),
@@ -38,9 +54,22 @@
         Func(
             name: 'implements_1',
             originalName: 'implements',
+            parameters: [
+              Parameter(
+                type: Type.nativeType(SupportedNativeType.Int32),
+                name: 'if_1',
+              ),
+              Parameter(
+                type: Type.nativeType(SupportedNativeType.Int32),
+                name: 'abstract_1',
+              ),
+              Parameter(
+                type: Type.nativeType(SupportedNativeType.Int32),
+                name: 'in_1',
+              ),
+            ],
             returnType: Type.nativeType(SupportedNativeType.Void)),
       ]);
-
       expect(l1.generate(), l2.generate());
     });
   });
diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
index 7cb48a1..c6642d8 100644
--- a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
+++ b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
@@ -13,12 +13,12 @@
 
   /// Free the given string set.
   void clang_disposeStringSet(
-    ffi.Pointer<CXStringSet> set,
+    ffi.Pointer<CXStringSet> set_1,
   ) {
     _clang_disposeStringSet ??= _dylib.lookupFunction<_c_clang_disposeStringSet,
         _dart_clang_disposeStringSet>('clang_disposeStringSet');
     return _clang_disposeStringSet(
-      set,
+      set_1,
     );
   }
 
@@ -4419,11 +4419,11 @@
 }
 
 typedef _c_clang_disposeStringSet = ffi.Void Function(
-  ffi.Pointer<CXStringSet> set,
+  ffi.Pointer<CXStringSet> set_1,
 );
 
 typedef _dart_clang_disposeStringSet = void Function(
-  ffi.Pointer<CXStringSet> set,
+  ffi.Pointer<CXStringSet> set_1,
 );
 
 typedef _c_clang_getBuildSessionTimestamp = ffi.Uint64 Function();
diff --git a/pkgs/ffigen/test/native_test/native_test.dart b/pkgs/ffigen/test/native_test/native_test.dart
index efb4ead..0cec0cc 100644
--- a/pkgs/ffigen/test/native_test/native_test.dart
+++ b/pkgs/ffigen/test/native_test/native_test.dart
@@ -7,6 +7,7 @@
 import 'dart:math';
 
 import 'package:test/test.dart';
+
 import '../test_utils.dart';
 import 'native_test_bindings.dart' as bindings;