Updated tool to use dart format when sdk >=2.10.0 (#110)

diff --git a/.travis.yml b/.travis.yml
index cd06229..e535a1a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,7 +21,7 @@
   - export PATH="/usr/lib/llvm-10/bin:$PATH"
 
 before_script:
-  - 'pub run ffigen:setup'
+  - 'dart pub run ffigen:setup'
   - cd test/native_test && dart build_test_dylib.dart && cd ../..
 
 matrix:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a59311b..7b452c5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 1.0.4
+- Updated code to use `dart format` instead of `dartfmt` for sdk version `>= 2.10.0`.
+
 # 1.0.3
 - Fixed errors due to extended ASCII and control characters in macro strings.
 
diff --git a/lib/src/code_generator/library.dart b/lib/src/code_generator/library.dart
index 978105e..e1d2390 100644
--- a/lib/src/code_generator/library.dart
+++ b/lib/src/code_generator/library.dart
@@ -8,6 +8,7 @@
 import 'package:logging/logging.dart';
 import 'package:meta/meta.dart';
 import 'package:path/path.dart' as p;
+import 'package:pub_semver/pub_semver.dart';
 import 'binding.dart';
 import 'utils.dart';
 import 'writer.dart';
@@ -96,15 +97,20 @@
 
   /// Formats a file using `dartfmt`.
   void _dartFmt(String path) {
-    final dartFmt = p.join(getSdkPath(), 'bin', 'dartfmt');
-    try {
-      final result = Process.runSync(dartFmt, ['-w', path],
-          runInShell: Platform.isWindows);
-      if (result.stderr.toString().isNotEmpty) {
-        _logger.severe(result.stderr);
-      }
-    } on ProcessException {
-      _logger.severe("Couldn't format bindings, unable to call $dartFmt.");
+    final sdkPath = getSdkPath();
+    final versionAtleast2dot10 = Version.parse(
+            File(p.join(sdkPath, 'version')).readAsStringSync().trim()) >=
+        Version(2, 10, 0);
+
+    /// Starting from version `>=2.10.0` the dart sdk has a unified `dart` tool
+    /// So we call `dart format` instead of `dartfmt`.
+    final result = versionAtleast2dot10
+        ? Process.runSync(p.join(sdkPath, 'bin', 'dart'), ['format', path],
+            runInShell: Platform.isWindows)
+        : Process.runSync(p.join(sdkPath, 'bin', 'dartfmt'), ['-w', path],
+            runInShell: Platform.isWindows);
+    if (result.stderr.toString().isNotEmpty) {
+      _logger.severe(result.stderr);
     }
   }
 
diff --git a/pubspec.yaml b/pubspec.yaml
index 578efe9..a03c62e 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: 1.0.3
+version: 1.0.4
 homepage: https://github.com/dart-lang/ffigen
 description: Experimental generator for FFI bindings, using LibClang to parse C header files.
 
@@ -20,6 +20,7 @@
   glob: ^1.2.0
   path: ^1.7.0
   quiver: ^2.1.3
+  pub_semver: ^1.4.4
 
 dev_dependencies:
   pedantic: ^1.9.2