Copy oneof state when doing copyWith() (#262)

diff --git a/protobuf/lib/src/protobuf/field_set.dart b/protobuf/lib/src/protobuf/field_set.dart
index 1b76048..97071c6 100644
--- a/protobuf/lib/src/protobuf/field_set.dart
+++ b/protobuf/lib/src/protobuf/field_set.dart
@@ -797,5 +797,7 @@
     if (original._hasUnknownFields) {
       _ensureUnknownFields()._fields?.addAll(original._unknownFields._fields);
     }
+
+    _oneofCases?.addAll(original._oneofCases);
   }
 }
diff --git a/protoc_plugin/CHANGELOG.md b/protoc_plugin/CHANGELOG.md
index d4f4014..843e395 100644
--- a/protoc_plugin/CHANGELOG.md
+++ b/protoc_plugin/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 17.0.3
+
+* Fix: Copy oneof state when doing `copyWith()`.
+
 ## 17.0.2
 
 * Fix: Avoiding argument_type_not_assignable and return_of_invalid_type lint warnings.
diff --git a/protoc_plugin/pubspec.yaml b/protoc_plugin/pubspec.yaml
index 44d3c58..8656ed5 100644
--- a/protoc_plugin/pubspec.yaml
+++ b/protoc_plugin/pubspec.yaml
@@ -1,5 +1,5 @@
 name: protoc_plugin
-version: 17.0.2
+version: 17.0.3
 author: Dart Team <misc@dartlang.org>
 description: Protoc compiler plugin to generate Dart code
 homepage: https://github.com/dart-lang/protobuf
diff --git a/protoc_plugin/test/oneof_test.dart b/protoc_plugin/test/oneof_test.dart
index 42a3041..d59a1cb 100644
--- a/protoc_plugin/test/oneof_test.dart
+++ b/protoc_plugin/test/oneof_test.dart
@@ -160,6 +160,17 @@
     expect(foo.hasGreen(), true);
     expect(foo.green, 'g');
   });
+
+  test('copyWith preserves oneof state', () {
+    Foo foo = Foo();
+    expectOneofNotSet(foo);
+    Foo copy1 = foo.copyWith((_) {});
+    expectOneofNotSet(copy1);
+    foo..first = 'oneof';
+    expectFirstSet(foo);
+    Foo copy2 = foo.copyWith((_) {});
+    expectFirstSet(copy2);
+  });
 }
 
 void expectSecondSet(Foo foo) {