Finish Proxied impls for rust repeated scalars
PiperOrigin-RevId: 575935874
diff --git a/rust/cpp.rs b/rust/cpp.rs
index 6ef1240..7c4998f 100644
--- a/rust/cpp.rs
+++ b/rust/cpp.rs
@@ -197,7 +197,7 @@
/// must be different fields, and not be in the same oneof. As such, a `Mut`
/// cannot be `Clone` but *can* reborrow itself with `.as_mut()`, which
/// converts `&'b mut Mut<'a, T>` to `Mut<'b, T>`.
-#[derive(Clone, Copy)]
+#[derive(Debug)]
pub struct RepeatedField<'msg, T: ?Sized> {
inner: RepeatedFieldInner<'msg>,
_phantom: PhantomData<&'msg mut T>,
@@ -206,7 +206,7 @@
/// CPP runtime-specific arguments for initializing a RepeatedField.
/// See RepeatedField comment about mutation invariants for when this type can
/// be copied.
-#[derive(Clone, Copy)]
+#[derive(Clone, Copy, Debug)]
pub struct RepeatedFieldInner<'msg> {
pub raw: RawRepeatedField,
pub _phantom: PhantomData<&'msg ()>,
@@ -217,7 +217,16 @@
RepeatedField { inner, _phantom: PhantomData }
}
}
-impl<'msg> RepeatedField<'msg, i32> {}
+
+// These use manual impls instead of derives to avoid unnecessary bounds on `T`.
+// This problem is referred to as "perfect derive".
+// https://smallcultfollowing.com/babysteps/blog/2022/04/12/implied-bounds-and-perfect-derive/
+impl<'msg, T: ?Sized> Copy for RepeatedField<'msg, T> {}
+impl<'msg, T: ?Sized> Clone for RepeatedField<'msg, T> {
+ fn clone(&self) -> RepeatedField<'msg, T> {
+ *self
+ }
+}
pub trait RepeatedScalarOps {
fn new_repeated_field() -> RawRepeatedField;
@@ -225,6 +234,7 @@
fn len(f: RawRepeatedField) -> usize;
fn get(f: RawRepeatedField, i: usize) -> Self;
fn set(f: RawRepeatedField, i: usize, v: Self);
+ fn copy_from(src: RawRepeatedField, dst: RawRepeatedField);
}
macro_rules! impl_repeated_scalar_ops {
@@ -236,6 +246,7 @@
fn [< __pb_rust_RepeatedField_ $t _size >](f: RawRepeatedField) -> usize;
fn [< __pb_rust_RepeatedField_ $t _get >](f: RawRepeatedField, i: usize) -> $t;
fn [< __pb_rust_RepeatedField_ $t _set >](f: RawRepeatedField, i: usize, v: $t);
+ fn [< __pb_rust_RepeatedField_ $t _copy_from >](src: RawRepeatedField, dst: RawRepeatedField);
}
impl RepeatedScalarOps for $t {
fn new_repeated_field() -> RawRepeatedField {
@@ -253,6 +264,9 @@
fn set(f: RawRepeatedField, i: usize, v: Self) {
unsafe { [< __pb_rust_RepeatedField_ $t _set >](f, i, v) }
}
+ fn copy_from(src: RawRepeatedField, dst: RawRepeatedField) {
+ unsafe { [< __pb_rust_RepeatedField_ $t _copy_from >](src, dst) }
+ }
}
)* }
};
@@ -292,6 +306,9 @@
}
T::set(self.inner.raw, index, val)
}
+ pub fn copy_from(&mut self, src: &RepeatedField<'_, T>) {
+ T::copy_from(src.inner.raw, self.inner.raw)
+ }
}
#[cfg(test)]
diff --git a/rust/cpp_kernel/cpp_api.cc b/rust/cpp_kernel/cpp_api.cc
index 8ff79d8..1381611 100644
--- a/rust/cpp_kernel/cpp_api.cc
+++ b/rust/cpp_kernel/cpp_api.cc
@@ -2,25 +2,29 @@
extern "C" {
-#define expose_repeated_field_methods(ty, rust_ty) \
- google::protobuf::RepeatedField<ty>* __pb_rust_RepeatedField_##rust_ty##_new() { \
- return new google::protobuf::RepeatedField<ty>(); \
- } \
- void __pb_rust_RepeatedField_##rust_ty##_add(google::protobuf::RepeatedField<ty>* r, \
- ty val) { \
- r->Add(val); \
- } \
- size_t __pb_rust_RepeatedField_##rust_ty##_size( \
- google::protobuf::RepeatedField<ty>* r) { \
- return r->size(); \
- } \
- ty __pb_rust_RepeatedField_##rust_ty##_get(google::protobuf::RepeatedField<ty>* r, \
- size_t index) { \
- return r->Get(index); \
- } \
- void __pb_rust_RepeatedField_##rust_ty##_set(google::protobuf::RepeatedField<ty>* r, \
- size_t index, ty val) { \
- return r->Set(index, val); \
+#define expose_repeated_field_methods(ty, rust_ty) \
+ google::protobuf::RepeatedField<ty>* __pb_rust_RepeatedField_##rust_ty##_new() { \
+ return new google::protobuf::RepeatedField<ty>(); \
+ } \
+ void __pb_rust_RepeatedField_##rust_ty##_add(google::protobuf::RepeatedField<ty>* r, \
+ ty val) { \
+ r->Add(val); \
+ } \
+ size_t __pb_rust_RepeatedField_##rust_ty##_size( \
+ google::protobuf::RepeatedField<ty>* r) { \
+ return r->size(); \
+ } \
+ ty __pb_rust_RepeatedField_##rust_ty##_get(google::protobuf::RepeatedField<ty>* r, \
+ size_t index) { \
+ return r->Get(index); \
+ } \
+ void __pb_rust_RepeatedField_##rust_ty##_set(google::protobuf::RepeatedField<ty>* r, \
+ size_t index, ty val) { \
+ return r->Set(index, val); \
+ } \
+ void __pb_rust_RepeatedField_##rust_ty##_copy_from( \
+ google::protobuf::RepeatedField<ty> const& src, google::protobuf::RepeatedField<ty>& dst) { \
+ dst.CopyFrom(src); \
}
expose_repeated_field_methods(int32_t, i32);
diff --git a/rust/primitive.rs b/rust/primitive.rs
index e69afe6..dd2fec1 100644
--- a/rust/primitive.rs
+++ b/rust/primitive.rs
@@ -7,6 +7,7 @@
use crate::__internal::Private;
use crate::__runtime::InnerPrimitiveMut;
+use crate::repeated::RepeatedMut;
use crate::vtable::{
PrimitiveOptionalMutVTable, PrimitiveVTable, ProxiedWithRawOptionalVTable,
ProxiedWithRawVTable, RawVTableOptionalMutatorData,
@@ -14,18 +15,31 @@
use crate::{Mut, MutProxy, Proxied, ProxiedWithPresence, SettableValue, View, ViewProxy};
#[derive(Debug)]
-pub struct PrimitiveMut<'a, T: ProxiedWithRawVTable> {
+pub struct SingularPrimitiveMut<'a, T: ProxiedWithRawVTable> {
inner: InnerPrimitiveMut<'a, T>,
}
+#[derive(Debug)]
+pub enum PrimitiveMut<'a, T: ProxiedWithRawVTable> {
+ Singular(SingularPrimitiveMut<'a, T>),
+ Repeated(RepeatedMut<'a, T>, usize),
+}
+
impl<'a, T: ProxiedWithRawVTable> PrimitiveMut<'a, T> {
#[doc(hidden)]
+ pub fn from_singular(_private: Private, inner: InnerPrimitiveMut<'a, T>) -> Self {
+ PrimitiveMut::Singular(SingularPrimitiveMut::from_inner(_private, inner))
+ }
+}
+
+impl<'a, T: ProxiedWithRawVTable> SingularPrimitiveMut<'a, T> {
+ #[doc(hidden)]
pub fn from_inner(_private: Private, inner: InnerPrimitiveMut<'a, T>) -> Self {
Self { inner }
}
}
-unsafe impl<'a, T: ProxiedWithRawVTable> Sync for PrimitiveMut<'a, T> {}
+unsafe impl<'a, T: ProxiedWithRawVTable> Sync for SingularPrimitiveMut<'a, T> {}
macro_rules! impl_singular_primitives {
($($t:ty),*) => {
@@ -47,6 +61,29 @@
}
}
+ impl<'a> PrimitiveMut<'a, $t> {
+ pub fn get(&self) -> View<'_, $t> {
+ match self {
+ PrimitiveMut::Singular(s) => {
+ s.get()
+ }
+ PrimitiveMut::Repeated(r, i) => {
+ r.get().get(*i).unwrap()
+ }
+ }
+ }
+
+ pub fn set(&mut self, val: impl SettableValue<$t>) {
+ val.set_on(Private, self.as_mut());
+ }
+
+ pub fn clear(&mut self) {
+ // The default value for a boolean field is false and 0 for numerical types. It
+ // matches the Rust default values for corresponding types. Let's use this fact.
+ SettableValue::<$t>::set_on(<$t>::default(), Private, MutProxy::as_mut(self));
+ }
+ }
+
impl<'a> ViewProxy<'a> for PrimitiveMut<'a, $t> {
type Proxied = $t;
@@ -61,7 +98,14 @@
impl<'a> MutProxy<'a> for PrimitiveMut<'a, $t> {
fn as_mut(&mut self) -> Mut<'_, Self::Proxied> {
- PrimitiveMut::from_inner(Private, self.inner)
+ match self {
+ PrimitiveMut::Singular(s) => {
+ PrimitiveMut::Singular(s.as_mut())
+ }
+ PrimitiveMut::Repeated(r, i) => {
+ PrimitiveMut::Repeated(r.as_mut(), *i)
+ }
+ }
}
fn into_mut<'shorter>(self) -> Mut<'shorter, Self::Proxied>
@@ -73,23 +117,23 @@
impl SettableValue<$t> for $t {
fn set_on(self, _private: Private, mutator: Mut<'_, $t>) {
- unsafe { (mutator.inner).set(self) };
+ match mutator {
+ PrimitiveMut::Singular(s) => {
+ unsafe { (s.inner).set(self) };
+ }
+ PrimitiveMut::Repeated(mut r, i) => {
+ r.set(i, self);
+ }
+ }
}
}
- impl<'a> PrimitiveMut<'a, $t> {
- pub fn set(&mut self, val: impl SettableValue<$t>) {
- val.set_on(Private, self.as_mut());
- }
-
+ impl<'a> SingularPrimitiveMut<'a, $t> {
pub fn get(&self) -> $t {
self.inner.get()
}
-
- pub fn clear(&mut self) {
- // The default value for a boolean field is false and 0 for numerical types. It
- // matches the Rust default values for corresponding types. Let's use this fact.
- SettableValue::<$t>::set_on(<$t>::default(), Private, MutProxy::as_mut(self));
+ pub fn as_mut(&mut self) -> SingularPrimitiveMut<'_, $t> {
+ SingularPrimitiveMut::from_inner(Private, self.inner)
}
}
@@ -104,7 +148,7 @@
}
fn make_mut(_private: Private, inner: InnerPrimitiveMut<'_, Self>) -> Mut<'_, Self> {
- PrimitiveMut::from_inner(Private, inner)
+ PrimitiveMut::Singular(SingularPrimitiveMut::from_inner(Private, inner))
}
}
@@ -121,7 +165,7 @@
fn set_absent_to_default(
absent_mutator: Self::AbsentMutData<'_>,
) -> Self::PresentMutData<'_> {
- absent_mutator.set_absent_to_default()
+ absent_mutator.set_absent_to_default()
}
}
diff --git a/rust/repeated.rs b/rust/repeated.rs
index b824de8..1abb715 100644
--- a/rust/repeated.rs
+++ b/rust/repeated.rs
@@ -12,8 +12,11 @@
use std::marker::PhantomData;
use crate::{
+ Mut, MutProxy, Proxied, SettableValue, View, ViewProxy,
__internal::{Private, RawRepeatedField},
__runtime::{RepeatedField, RepeatedFieldInner},
+ primitive::PrimitiveMut,
+ vtable::ProxiedWithRawVTable,
};
#[derive(Clone, Copy)]
@@ -31,6 +34,9 @@
inner: RepeatedField<'a, T>,
}
+unsafe impl<'a, T: ProxiedWithRawVTable> Sync for RepeatedView<'a, T> {}
+unsafe impl<'a, T: ProxiedWithRawVTable> Send for RepeatedView<'a, T> {}
+
impl<'msg, T: ?Sized> RepeatedView<'msg, T> {
pub fn from_inner(_private: Private, inner: RepeatedFieldInner<'msg>) -> Self {
Self { inner: RepeatedField::<'msg>::from_inner(_private, inner) }
@@ -49,14 +55,20 @@
}
#[repr(transparent)]
+#[derive(Debug)]
pub struct RepeatedMut<'a, T: ?Sized> {
inner: RepeatedField<'a, T>,
}
+unsafe impl<'a, T: ProxiedWithRawVTable> Sync for RepeatedMut<'a, T> {}
+
impl<'msg, T: ?Sized> RepeatedMut<'msg, T> {
pub fn from_inner(_private: Private, inner: RepeatedFieldInner<'msg>) -> Self {
Self { inner: RepeatedField::from_inner(_private, inner) }
}
+ pub fn as_mut(&self) -> RepeatedMut<'_, T> {
+ Self { inner: self.inner }
+ }
}
impl<'a, T> std::ops::Deref for RepeatedMut<'a, T> {
@@ -70,9 +82,67 @@
}
}
+pub struct RepeatedFieldIterMut<'a, T> {
+ inner: RepeatedMut<'a, T>,
+ current_index: usize,
+}
+
+pub struct Repeated<T>(PhantomData<T>);
+
macro_rules! impl_repeated_primitives {
($($t:ty),*) => {
$(
+ impl Proxied for Repeated<$t> {
+ type View<'a> = RepeatedView<'a, $t>;
+ type Mut<'a> = RepeatedMut<'a, $t>;
+ }
+
+ impl<'a> ViewProxy<'a> for RepeatedView<'a, $t> {
+ type Proxied = Repeated<$t>;
+
+ fn as_view(&self) -> View<'_, Self::Proxied> {
+ *self
+ }
+
+ fn into_view<'shorter>(self) -> View<'shorter, Self::Proxied>
+ where 'a: 'shorter,
+ {
+ RepeatedView { inner: self.inner }
+ }
+ }
+
+ impl<'a> ViewProxy<'a> for RepeatedMut<'a, $t> {
+ type Proxied = Repeated<$t>;
+
+ fn as_view(&self) -> View<'_, Self::Proxied> {
+ **self
+ }
+
+ fn into_view<'shorter>(self) -> View<'shorter, Self::Proxied>
+ where 'a: 'shorter,
+ {
+ *self.into_mut::<'shorter>()
+ }
+ }
+
+ impl<'a> MutProxy<'a> for RepeatedMut<'a, $t> {
+ fn as_mut(&mut self) -> Mut<'_, Self::Proxied> {
+ RepeatedMut { inner: self.inner }
+ }
+
+ fn into_mut<'shorter>(self) -> Mut<'shorter, Self::Proxied>
+ where 'a: 'shorter,
+ {
+ RepeatedMut { inner: self.inner }
+ }
+ }
+
+ impl <'a> SettableValue<Repeated<$t>> for RepeatedView<'a, $t> {
+ fn set_on(self, _private: Private, mut mutator: Mut<'_, Repeated<$t>>) {
+ mutator.copy_from(self);
+ }
+ }
+
impl<'a> RepeatedView<'a, $t> {
pub fn len(&self) -> usize {
self.inner.len()
@@ -83,6 +153,9 @@
pub fn get(&self, index: usize) -> Option<$t> {
self.inner.get(index)
}
+ pub fn iter(&self) -> RepeatedFieldIter<'_, $t> {
+ (*self).into_iter()
+ }
}
impl<'a> RepeatedMut<'a, $t> {
@@ -92,6 +165,21 @@
pub fn set(&mut self, index: usize, val: $t) {
self.inner.set(index, val)
}
+ pub fn get_mut(&mut self, index: usize) -> Option<Mut<'_, $t>> {
+ if index >= self.len() {
+ return None;
+ }
+ Some(PrimitiveMut::Repeated(self.as_mut(), index))
+ }
+ pub fn iter(&self) -> RepeatedFieldIter<'_, $t> {
+ self.as_view().into_iter()
+ }
+ pub fn iter_mut(&mut self) -> RepeatedFieldIterMut<'_, $t> {
+ self.as_mut().into_iter()
+ }
+ pub fn copy_from(&mut self, src: RepeatedView<'_, $t>) {
+ self.inner.copy_from(&src.inner);
+ }
}
impl<'a> std::iter::Iterator for RepeatedFieldIter<'a, $t> {
@@ -112,6 +200,32 @@
RepeatedFieldIter { inner: self.inner, current_index: 0 }
}
}
+
+ impl <'a> std::iter::Iterator for RepeatedFieldIterMut<'a, $t> {
+ type Item = Mut<'a, $t>;
+ fn next(&mut self) -> Option<Self::Item> {
+ if self.current_index >= self.inner.len() {
+ return None;
+ }
+ let elem = PrimitiveMut::Repeated(
+ // While this appears to allow mutable aliasing
+ // (multiple `Self::Item`s can co-exist), each `Item`
+ // only references a specific unique index.
+ RepeatedMut{ inner: self.inner.inner },
+ self.current_index,
+ );
+ self.current_index += 1;
+ Some(elem)
+ }
+ }
+
+ impl<'a> std::iter::IntoIterator for RepeatedMut<'a, $t> {
+ type Item = Mut<'a, $t>;
+ type IntoIter = RepeatedFieldIterMut<'a, $t>;
+ fn into_iter(self) -> Self::IntoIter {
+ RepeatedFieldIterMut { inner: self, current_index: 0 }
+ }
+ }
)*
}
}
diff --git a/rust/shared.rs b/rust/shared.rs
index f8a9d11..7c3a3d1 100644
--- a/rust/shared.rs
+++ b/rust/shared.rs
@@ -18,7 +18,7 @@
#[doc(hidden)]
pub mod __public {
pub use crate::optional::{AbsentField, FieldEntry, Optional, PresentField};
- pub use crate::primitive::PrimitiveMut;
+ pub use crate::primitive::{PrimitiveMut, SingularPrimitiveMut};
pub use crate::proxied::{
Mut, MutProxy, Proxied, ProxiedWithPresence, SettableValue, View, ViewProxy,
};
diff --git a/rust/test/shared/accessors_test.rs b/rust/test/shared/accessors_test.rs
index ef33f21..f1f55f6 100644
--- a/rust/test/shared/accessors_test.rs
+++ b/rust/test/shared/accessors_test.rs
@@ -714,7 +714,47 @@
assert_that!(mutator.get(0), some(eq(2 as $t)));
mutator.push(1 as $t);
- assert_that!(mutator.into_iter().collect::<Vec<_>>(), eq(vec![2 as $t, 1 as $t]));
+ mutator.push(3 as $t);
+ assert_that!(mutator.get_mut(2).is_some(), eq(true));
+ let mut mut_elem = mutator.get_mut(2).unwrap();
+ mut_elem.set(4 as $t);
+ assert_that!(mut_elem.get(), eq(4 as $t));
+ mut_elem.clear();
+ assert_that!(mut_elem.get(), eq(0 as $t));
+
+ assert_that!(
+ mutator.iter().collect::<Vec<_>>(),
+ eq(vec![2 as $t, 1 as $t, 0 as $t])
+ );
+ assert_that!(
+ (*mutator).into_iter().collect::<Vec<_>>(),
+ eq(vec![2 as $t, 1 as $t, 0 as $t])
+ );
+
+ for mut mutable_elem in msg.[<repeated_ $field _mut >]() {
+ mutable_elem.set(0 as $t);
+ }
+ assert_that!(
+ msg.[<repeated_ $field _mut >]().iter().all(|v| v == (0 as $t)),
+ eq(true)
+ );
+ }
+
+ #[test]
+ fn [< test_repeated_ $field _set >]() {
+ let mut msg = TestAllTypes::new();
+ let mut mutator = msg.[<repeated_ $field _mut>]();
+ let mut msg2 = TestAllTypes::new();
+ let mut mutator2 = msg2.[<repeated_ $field _mut>]();
+ for i in 0..5 {
+ mutator2.push(i as $t);
+ }
+ protobuf::MutProxy::set(&mut mutator, *mutator2);
+
+ assert_that!(
+ mutator.iter().collect::<Vec<_>>(),
+ eq(mutator2.iter().collect::<Vec<_>>())
+ );
}
)* }
};
@@ -742,5 +782,34 @@
mutator.set(0, false);
assert_that!(mutator.get(0), some(eq(false)));
mutator.push(true);
- assert_that!(mutator.into_iter().collect::<Vec<_>>(), eq(vec![false, true]));
+
+ mutator.push(false);
+ assert_that!(mutator.get_mut(2), pat!(Some(_)));
+ let mut mut_elem = mutator.get_mut(2).unwrap();
+ mut_elem.set(true);
+ assert_that!(mut_elem.get(), eq(true));
+ mut_elem.clear();
+ assert_that!(mut_elem.get(), eq(false));
+
+ assert_that!(mutator.iter().collect::<Vec<_>>(), eq(vec![false, true, false]));
+ assert_that!((*mutator).into_iter().collect::<Vec<_>>(), eq(vec![false, true, false]));
+
+ for mut mutable_elem in msg.repeated_bool_mut() {
+ mutable_elem.set(false);
+ }
+ assert_that!(msg.repeated_bool().iter().all(|v| v), eq(false));
+}
+
+#[test]
+fn test_repeated_bool_set() {
+ let mut msg = TestAllTypes::new();
+ let mut mutator = msg.repeated_bool_mut();
+ let mut msg2 = TestAllTypes::new();
+ let mut mutator2 = msg2.repeated_bool_mut();
+ for _ in 0..5 {
+ mutator2.push(true);
+ }
+ protobuf::MutProxy::set(&mut mutator, *mutator2);
+
+ assert_that!(mutator.iter().collect::<Vec<_>>(), eq(mutator2.iter().collect::<Vec<_>>()));
}
diff --git a/rust/upb.rs b/rust/upb.rs
index 24edbce..b6fd7b3 100644
--- a/rust/upb.rs
+++ b/rust/upb.rs
@@ -293,12 +293,22 @@
pub arena: &'msg Arena,
}
-#[derive(Clone, Copy, Debug)]
+#[derive(Debug)]
pub struct RepeatedField<'msg, T: ?Sized> {
inner: RepeatedFieldInner<'msg>,
_phantom: PhantomData<&'msg mut T>,
}
+// These use manual impls instead of derives to avoid unnecessary bounds on `T`.
+// This problem is referred to as "perfect derive".
+// https://smallcultfollowing.com/babysteps/blog/2022/04/12/implied-bounds-and-perfect-derive/
+impl<'msg, T: ?Sized> Copy for RepeatedField<'msg, T> {}
+impl<'msg, T: ?Sized> Clone for RepeatedField<'msg, T> {
+ fn clone(&self) -> RepeatedField<'msg, T> {
+ *self
+ }
+}
+
impl<'msg, T: ?Sized> RepeatedField<'msg, T> {
pub fn len(&self) -> usize {
unsafe { upb_Array_Size(self.inner.raw) }
@@ -352,6 +362,7 @@
fn upb_Array_Set(arr: RawRepeatedField, i: usize, val: upb_MessageValue);
fn upb_Array_Get(arr: RawRepeatedField, i: usize) -> upb_MessageValue;
fn upb_Array_Append(arr: RawRepeatedField, val: upb_MessageValue, arena: RawArena);
+ fn upb_Array_Resize(arr: RawRepeatedField, size: usize, arena: RawArena);
}
macro_rules! impl_repeated_primitives {
@@ -392,6 +403,19 @@
upb_MessageValue { $union_field: val },
) }
}
+ pub fn copy_from(&mut self, src: &RepeatedField<'_, $rs_type>) {
+ // TODO: Optimize this copy_from implementation using memcopy.
+ // NOTE: `src` cannot be `self` because this would violate borrowing rules.
+ unsafe { upb_Array_Resize(self.inner.raw, 0, self.inner.arena.raw()) };
+ // `upb_Array_DeepClone` is not used here because it returns
+ // a new `upb_Array*`. The contained `RawRepeatedField` must
+ // then be set to this new pointer, but other copies of this
+ // pointer may exist because of re-borrowed `RepeatedMut`s.
+ // Alternatively, a `clone_into` method could be exposed by upb.
+ for i in 0..src.len() {
+ self.push(src.get(i).unwrap());
+ }
+ }
}
)*
}
diff --git a/src/google/protobuf/compiler/rust/accessors/singular_scalar.cc b/src/google/protobuf/compiler/rust/accessors/singular_scalar.cc
index 818dc7c..b7b7a55 100644
--- a/src/google/protobuf/compiler/rust/accessors/singular_scalar.cc
+++ b/src/google/protobuf/compiler/rust/accessors/singular_scalar.cc
@@ -162,7 +162,7 @@
)rs");
} else {
field.Emit({}, R"rs(
- pub fn r#$field$_mut(&mut self) -> $pb$::PrimitiveMut<'_, $Scalar$> {
+ pub fn r#$field$_mut(&mut self) -> $pb$::Mut<'_, $Scalar$> {
static VTABLE: $pbi$::PrimitiveVTable<$Scalar$> =
$pbi$::PrimitiveVTable::new(
$pbi$::Private,
@@ -170,7 +170,7 @@
$setter_thunk$,
);
- $pb$::PrimitiveMut::from_inner(
+ $pb$::PrimitiveMut::from_singular(
$pbi$::Private,
unsafe {
$pbi$::RawVTableMutator::new(