Dart 2 fixes. (#106)

* Breaking change: Generated RpcClient stubs use the generic invoke method. Requires package:protobuf version 0.8.0 or newer.
* Dart 2 fixes.
diff --git a/.travis.yml b/.travis.yml
index 8f75be8..e7bbdc3 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,9 +5,9 @@
 # them against each Dart version.
 matrix:
   include:
-  - dart: stable
+  - dart: dev
     dart_task: dartfmt
-  - dart: stable
+  - dart: dev
     env: PROTOC_VERSION=3.0.0
     install: ./tool/travis/setup.sh
     script: ./tool/travis/test.sh
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ae3eb3..ec97eda 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.8.0 - 2018-05-17
+
+* Breaking change: Generated RpcClient stubs use the generic invoke method.
+  Requires package:protobuf version 0.8.0 or newer.
+* Dart 2 fixes.
+
 ## 0.7.11 - 2018-04-09
 
 * Dart 2 fix.
diff --git a/benchmark/lib/report.dart b/benchmark/lib/report.dart
index 0eed239..89b79fc 100644
--- a/benchmark/lib/report.dart
+++ b/benchmark/lib/report.dart
@@ -4,7 +4,7 @@
 
 library protoc.benchmark.report;
 
-import 'dart:convert' show JSON;
+import 'dart:convert' show jsonEncode;
 
 import 'generated/benchmark.pb.dart' as pb;
 
@@ -159,7 +159,7 @@
 
     var value = json[key];
     out.write(childIndent);
-    out.write(JSON.encode(key));
+    out.write(jsonEncode(key));
     out.write(": ");
 
     if (value is List) {
@@ -167,7 +167,7 @@
     } else if (value is Map && indent.length < 4) {
       _stringifyMap(out, value, childIndent);
     } else {
-      out.write(JSON.encode(value));
+      out.write(jsonEncode(value));
     }
   }
   out.write("\n$indent}");
@@ -182,7 +182,7 @@
     if (!first) out.write(",\n");
     first = false;
     out.write(childIndent);
-    out.write(JSON.encode(item));
+    out.write(jsonEncode(item));
   }
   out.write("\n$indent]");
 }
diff --git a/lib/base_type.dart b/lib/base_type.dart
index 6c664f6..743bd86 100644
--- a/lib/base_type.dart
+++ b/lib/base_type.dart
@@ -70,7 +70,7 @@
             "double", r"$_setDouble", null);
       case FieldDescriptorProto_Type.TYPE_INT32:
         return const BaseType._raw(FieldDescriptorProto_Type.TYPE_INT32, "3",
-            "int", r"$_setUnsignedInt32", null);
+            "int", r"$_setSignedInt32", null);
       case FieldDescriptorProto_Type.TYPE_UINT32:
         return const BaseType._raw(FieldDescriptorProto_Type.TYPE_UINT32, "U3",
             "int", r"$_setUnsignedInt32", null);
diff --git a/lib/client_generator.dart b/lib/client_generator.dart
index c0b0aba..3f16563 100644
--- a/lib/client_generator.dart
+++ b/lib/client_generator.dart
@@ -37,7 +37,8 @@
         'ClientContext ctx, $inputType request) {',
         '}', () {
       out.println('var emptyResponse = new $outputType();');
-      out.println('return _client.invoke(ctx, \'${service._descriptor.name}\', '
+      out.println(
+          'return _client.invoke<$outputType>(ctx, \'${service._descriptor.name}\', '
           '\'${m.name}\', request, emptyResponse);');
     });
   }
diff --git a/lib/protobuf_field.dart b/lib/protobuf_field.dart
index 6aa2e74..735fad9 100644
--- a/lib/protobuf_field.dart
+++ b/lib/protobuf_field.dart
@@ -203,11 +203,11 @@
             '0' == descriptor.defaultValue) {
           return null;
         } else if (descriptor.defaultValue == 'inf') {
-          return 'double.INFINITY';
+          return 'double.infinity';
         } else if (descriptor.defaultValue == '-inf') {
-          return 'double.NEGATIVE_INFINITY';
+          return 'double.negativeInfinity';
         } else if (descriptor.defaultValue == 'nan') {
-          return 'double.NAN';
+          return 'double.nan';
         } else if (HEX_LITERAL_REGEX.hasMatch(descriptor.defaultValue)) {
           return '(${descriptor.defaultValue}).toDouble()';
         } else if (INTEGER_LITERAL_REGEX.hasMatch(descriptor.defaultValue)) {
diff --git a/lib/src/descriptor.pb.dart b/lib/src/descriptor.pb.dart
index b21aa95..925a457 100644
--- a/lib/src/descriptor.pb.dart
+++ b/lib/src/descriptor.pb.dart
@@ -186,7 +186,7 @@
 
   int get start => $_get(0, 0);
   set start(int v) {
-    $_setUnsignedInt32(0, v);
+    $_setSignedInt32(0, v);
   }
 
   bool hasStart() => $_has(0);
@@ -194,7 +194,7 @@
 
   int get end => $_get(1, 0);
   set end(int v) {
-    $_setUnsignedInt32(1, v);
+    $_setSignedInt32(1, v);
   }
 
   bool hasEnd() => $_has(1);
@@ -238,7 +238,7 @@
 
   int get start => $_get(0, 0);
   set start(int v) {
-    $_setUnsignedInt32(0, v);
+    $_setSignedInt32(0, v);
   }
 
   bool hasStart() => $_has(0);
@@ -246,7 +246,7 @@
 
   int get end => $_get(1, 0);
   set end(int v) {
-    $_setUnsignedInt32(1, v);
+    $_setSignedInt32(1, v);
   }
 
   bool hasEnd() => $_has(1);
@@ -412,7 +412,7 @@
 
   int get number => $_get(2, 0);
   set number(int v) {
-    $_setUnsignedInt32(2, v);
+    $_setSignedInt32(2, v);
   }
 
   bool hasNumber() => $_has(2);
@@ -460,7 +460,7 @@
 
   int get oneofIndex => $_get(8, 0);
   set oneofIndex(int v) {
-    $_setUnsignedInt32(8, v);
+    $_setSignedInt32(8, v);
   }
 
   bool hasOneofIndex() => $_has(8);
@@ -624,7 +624,7 @@
 
   int get number => $_get(1, 0);
   set number(int v) {
-    $_setUnsignedInt32(1, v);
+    $_setSignedInt32(1, v);
   }
 
   bool hasNumber() => $_has(1);
@@ -1658,7 +1658,7 @@
 
   int get begin => $_get(2, 0);
   set begin(int v) {
-    $_setUnsignedInt32(2, v);
+    $_setSignedInt32(2, v);
   }
 
   bool hasBegin() => $_has(2);
@@ -1666,7 +1666,7 @@
 
   int get end => $_get(3, 0);
   set end(int v) {
-    $_setUnsignedInt32(3, v);
+    $_setSignedInt32(3, v);
   }
 
   bool hasEnd() => $_has(3);
diff --git a/lib/src/plugin.pb.dart b/lib/src/plugin.pb.dart
index 2122589..be55531 100644
--- a/lib/src/plugin.pb.dart
+++ b/lib/src/plugin.pb.dart
@@ -41,7 +41,7 @@
 
   int get major => $_get(0, 0);
   set major(int v) {
-    $_setUnsignedInt32(0, v);
+    $_setSignedInt32(0, v);
   }
 
   bool hasMajor() => $_has(0);
@@ -49,7 +49,7 @@
 
   int get minor => $_get(1, 0);
   set minor(int v) {
-    $_setUnsignedInt32(1, v);
+    $_setSignedInt32(1, v);
   }
 
   bool hasMinor() => $_has(1);
@@ -57,7 +57,7 @@
 
   int get patch => $_get(2, 0);
   set patch(int v) {
-    $_setUnsignedInt32(2, v);
+    $_setSignedInt32(2, v);
   }
 
   bool hasPatch() => $_has(2);
diff --git a/pubspec.yaml b/pubspec.yaml
index b7597ff..953ae2d 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protoc_plugin
-version: 0.7.11
+version: 0.8.0
 author: Dart Team <misc@dartlang.org>
 description: Protoc compiler plugin to generate Dart code
 homepage: https://github.com/dart-lang/dart-protoc-plugin
@@ -8,7 +8,7 @@
 dependencies:
   fixnum: ^0.10.5
   path: ^1.0.0
-  protobuf: ^0.7.1
+  protobuf: ^0.8.0
   dart_style: ^1.0.6
 dev_dependencies:
   browser: any
diff --git a/test/client_generator_test.dart b/test/client_generator_test.dart
index adf6adf..3a735b0 100644
--- a/test/client_generator_test.dart
+++ b/test/client_generator_test.dart
@@ -21,11 +21,11 @@
 
   Future<SomeReply> aMethod(ClientContext ctx, SomeRequest request) {
     var emptyResponse = new SomeReply();
-    return _client.invoke(ctx, 'Test', 'AMethod', request, emptyResponse);
+    return _client.invoke<SomeReply>(ctx, 'Test', 'AMethod', request, emptyResponse);
   }
   Future<$foo$bar.AnotherReply> anotherMethod(ClientContext ctx, $foo$bar.EmptyMessage request) {
     var emptyResponse = new $foo$bar.AnotherReply();
-    return _client.invoke(ctx, 'Test', 'AnotherMethod', request, emptyResponse);
+    return _client.invoke<$foo$bar.AnotherReply>(ctx, 'Test', 'AnotherMethod', request, emptyResponse);
   }
 }
 
diff --git a/test/file_generator_test.dart b/test/file_generator_test.dart
index 2106147..4a8d3ed 100644
--- a/test/file_generator_test.dart
+++ b/test/file_generator_test.dart
@@ -113,7 +113,7 @@
   void clearNumber() => clearField(1);
 
   int get type => $_get(1, 0);
-  set type(int v) { $_setUnsignedInt32(1, v); }
+  set type(int v) { $_setSignedInt32(1, v); }
   bool hasType() => $_has(1);
   void clearType() => clearField(2);
 
@@ -362,7 +362,7 @@
 
   Future<Empty> ping(ClientContext ctx, Empty request) {
     var emptyResponse = new Empty();
-    return _client.invoke(ctx, 'Test', 'Ping', request, emptyResponse);
+    return _client.invoke<Empty>(ctx, 'Test', 'Ping', request, emptyResponse);
   }
 }
 
diff --git a/test/repeated_field_test.dart b/test/repeated_field_test.dart
index 6dd55f4..bc58989 100644
--- a/test/repeated_field_test.dart
+++ b/test/repeated_field_test.dart
@@ -5,6 +5,7 @@
 
 library repeated_field_test;
 
+import 'package:protobuf/protobuf.dart';
 import 'package:test/test.dart';
 
 import '../out/protos/google/protobuf/unittest.pb.dart';
@@ -47,13 +48,22 @@
 
   test("check properties are initialized for repeated fields", () {
     var msg = new TestAllTypes();
-    expect(msg.info_.byName["repeatedNestedMessage"].check,
+    expect(
+        (msg.info_.byName["repeatedNestedMessage"]
+                as FieldInfo<TestAllTypes_NestedMessage>)
+            .check,
         same(TestAllTypes_NestedMessage.$checkItem));
 
-    expect(msg.info_.byName["repeatedGroup"].check,
+    expect(
+        (msg.info_.byName["repeatedGroup"]
+                as FieldInfo<TestAllTypes_RepeatedGroup>)
+            .check,
         same(TestAllTypes_RepeatedGroup.$checkItem));
 
-    expect(msg.info_.byName["repeatedNestedEnum"].check,
+    expect(
+        (msg.info_.byName["repeatedNestedEnum"]
+                as FieldInfo<TestAllTypes_NestedEnum>)
+            .check,
         same(TestAllTypes_NestedEnum.$checkItem));
   });
 }
diff --git a/test/service_test.dart b/test/service_test.dart
index d518d84..82b52c0 100644
--- a/test/service_test.dart
+++ b/test/service_test.dart
@@ -57,12 +57,12 @@
 
   FakeJsonClient(this.server);
 
-  Future<GeneratedMessage> invoke(
+  Future<T> invoke<T extends GeneratedMessage>(
       ClientContext ctx,
       String serviceName,
       String methodName,
       GeneratedMessage request,
-      GeneratedMessage response) async {
+      T response) async {
     String requestJson = request.writeToJson();
     String replyJson =
         await server.messageHandler(serviceName, methodName, requestJson);