summaryrefslogtreecommitdiffstats
path: root/third_party/rust/zerocopy-derive/src/ext.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
commit8dd16259287f58f9273002717ec4d27e97127719 (patch)
tree3863e62a53829a84037444beab3abd4ed9dfc7d0 /third_party/rust/zerocopy-derive/src/ext.rs
parentReleasing progress-linux version 126.0.1-1~progress7.99u1. (diff)
downloadfirefox-8dd16259287f58f9273002717ec4d27e97127719.tar.xz
firefox-8dd16259287f58f9273002717ec4d27e97127719.zip
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/zerocopy-derive/src/ext.rs')
-rw-r--r--third_party/rust/zerocopy-derive/src/ext.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/third_party/rust/zerocopy-derive/src/ext.rs b/third_party/rust/zerocopy-derive/src/ext.rs
new file mode 100644
index 0000000000..87cf838f88
--- /dev/null
+++ b/third_party/rust/zerocopy-derive/src/ext.rs
@@ -0,0 +1,53 @@
+// Copyright 2019 The Fuchsia Authors
+//
+// Licensed under a BSD-style license <LICENSE-BSD>, Apache License, Version 2.0
+// <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0>, or the MIT
+// license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
+// This file may not be copied, modified, or distributed except according to
+// those terms.
+
+use syn::{Data, DataEnum, DataStruct, DataUnion, Type};
+
+pub trait DataExt {
+ /// Extract the types of all fields. For enums, extract the types of fields
+ /// from each variant.
+ fn field_types(&self) -> Vec<&Type>;
+}
+
+impl DataExt for Data {
+ fn field_types(&self) -> Vec<&Type> {
+ match self {
+ Data::Struct(strc) => strc.field_types(),
+ Data::Enum(enm) => enm.field_types(),
+ Data::Union(un) => un.field_types(),
+ }
+ }
+}
+
+impl DataExt for DataStruct {
+ fn field_types(&self) -> Vec<&Type> {
+ self.fields.iter().map(|f| &f.ty).collect()
+ }
+}
+
+impl DataExt for DataEnum {
+ fn field_types(&self) -> Vec<&Type> {
+ self.variants.iter().flat_map(|var| &var.fields).map(|f| &f.ty).collect()
+ }
+}
+
+impl DataExt for DataUnion {
+ fn field_types(&self) -> Vec<&Type> {
+ self.fields.named.iter().map(|f| &f.ty).collect()
+ }
+}
+
+pub trait EnumExt {
+ fn is_c_like(&self) -> bool;
+}
+
+impl EnumExt for DataEnum {
+ fn is_c_like(&self) -> bool {
+ self.field_types().is_empty()
+ }
+}