forked from mirrors/gecko-dev
Changelog: * #4865 fix present mode for wgl By xiaopengli89 in https://github.com/gfx-rs/wgpu/pull/4865 * #4873 Bump ctor from 0.2.5 to 0.2.6 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4873 * #4874 Bump syn from 2.0.40 to 2.0.41 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4874 * #4869 [naga wgsl-out] Include the `f` suffix on `f32` literals. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4869 * #4850 [naga wgsl-in] Support abstract operands to binary operators. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4850 * #4850 [naga wgsl-in] Support abstract operands to binary operators. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4850 * #4850 [naga wgsl-in] Support abstract operands to binary operators. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4850 * #4850 [naga wgsl-in] Support abstract operands to binary operators. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4850 * #4850 [naga wgsl-in] Support abstract operands to binary operators. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4850 * #4870 [naga wgsl] Let unary operators accept and produce abstract types. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4870 * #4867 Reintroduce buffer snatching Part 1 By nical in https://github.com/gfx-rs/wgpu/pull/4867 * #4882 Bump zerocopy from 0.7.26 to 0.7.31 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4882 * #4878 Buffer snatching part 2 - Refactor create_buffer By nical in https://github.com/gfx-rs/wgpu/pull/4878 * #4815 Add `wgpu` crate features for backends By daxpedda in https://github.com/gfx-rs/wgpu/pull/4815 * #4887 Allow clippy::pattern_type_mismatch By nical in https://github.com/gfx-rs/wgpu/pull/4887 * #4886 Document wgpu & wgpu-core features By Wumpf in https://github.com/gfx-rs/wgpu/pull/4886 * #4826 validation: More detailed on incompatible BGL By scoopr in https://github.com/gfx-rs/wgpu/pull/4826 * #4888 Web: add support for more `RawWindowHandle` variants By daxpedda in https://github.com/gfx-rs/wgpu/pull/4888 * #4890 Bump thiserror from 1.0.50 to 1.0.51 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4890 * #4880 Simplify `ResourceMaps` By nical in https://github.com/gfx-rs/wgpu/pull/4880 * #4891 Make the naga version in trunk as high as the latest published one By nical in https://github.com/gfx-rs/wgpu/pull/4891 * #4893 Avoid allocating memory every time we might log a label By nical in https://github.com/gfx-rs/wgpu/pull/4893 * #4894 Remove some locks in BindGroup By nical in https://github.com/gfx-rs/wgpu/pull/4894 * #4862 Ensure that DeviceLostCallbackC is always called exactly once By bradwerth in https://github.com/gfx-rs/wgpu/pull/4862 * #4900 Support Device fence sharing with dx12 on Windows By sotaroikeda in https://github.com/gfx-rs/wgpu/pull/4900 * #4903 Bump tokio from 1.35.0 to 1.35.1 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4903 * #4895 Check that raw buffers and raw bind groups are valid By nical in https://github.com/gfx-rs/wgpu/pull/4895 * #4901 fix: docs By miaobuao in https://github.com/gfx-rs/wgpu/pull/4901 * #4892 Simplify some code around buffer unmapping By nical in https://github.com/gfx-rs/wgpu/pull/4892 * #4896 Buffer snatching By nical in https://github.com/gfx-rs/wgpu/pull/4896 * #4851 Eagerly release GPU resources when we lose the device. By bradwerth in https://github.com/gfx-rs/wgpu/pull/4851 * #4906 Use nightly for docs By cwfitzgerald in https://github.com/gfx-rs/wgpu/pull/4906 * #4908 Bump syn from 2.0.41 to 2.0.42 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4908 * #4909 Bump profiling from 1.0.12 to 1.0.13 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4909 * #4910 Bump anyhow from 1.0.75 to 1.0.76 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4910 * #4913 Remove id32 Feature By cwfitzgerald in https://github.com/gfx-rs/wgpu/pull/4913 * #4914 Add BGL Deduplication Index Test By cwfitzgerald in https://github.com/gfx-rs/wgpu/pull/4914 * #4921 Fix typo "layout pipeline layout" -> "pipeline layout" By HactarCE in https://github.com/gfx-rs/wgpu/pull/4921 * #4922 Bump winit from 0.29.4 to 0.29.5 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4922 * #4924 Inline `document-features` usage, remove dep. By ErichDonGubler in https://github.com/gfx-rs/wgpu/pull/4924 * #4871 Speed up Naga's `cargo xtask validate wgsl` from 12s to 0.8s By jimblandy in https://github.com/gfx-rs/wgpu/pull/4871 * #4871 Speed up Naga's `cargo xtask validate wgsl` from 12s to 0.8s By jimblandy in https://github.com/gfx-rs/wgpu/pull/4871 * #4871 Speed up Naga's `cargo xtask validate wgsl` from 12s to 0.8s By jimblandy in https://github.com/gfx-rs/wgpu/pull/4871 * #4930 Bump winit from 0.29.5 to 0.29.6 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4930 * #4929 Bump web-time from 0.2.3 to 0.2.4 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4929 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4902 [naga xtask] Run validation jobs in parallel, using jobserver. By jimblandy in https://github.com/gfx-rs/wgpu/pull/4902 * #4940 Align `wgpu_types::CompositeAlphaMode` serde serializations to spec By littledivy in https://github.com/gfx-rs/wgpu/pull/4940 * #4936 Bump anyhow from 1.0.76 to 1.0.77 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4936 * #4933 Bump thiserror from 1.0.51 to 1.0.52 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4933 * #4932 Bump syn from 2.0.42 to 2.0.43 By dependabot[bot] in https://github.com/gfx-rs/wgpu/pull/4932 Differential Revision: https://phabricator.services.mozilla.com/D197519
781 lines
21 KiB
Rust
781 lines
21 KiB
Rust
#![allow(
|
|
clippy::assertions_on_result_states,
|
|
clippy::manual_let_else,
|
|
clippy::too_many_lines,
|
|
clippy::uninlined_format_args
|
|
)]
|
|
|
|
#[macro_use]
|
|
mod macros;
|
|
|
|
use quote::quote;
|
|
use syn::{Data, DeriveInput};
|
|
|
|
#[test]
|
|
fn test_unit() {
|
|
let input = quote! {
|
|
struct Unit;
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Inherited,
|
|
ident: "Unit",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unit,
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_struct() {
|
|
let input = quote! {
|
|
#[derive(Debug, Clone)]
|
|
pub struct Item {
|
|
pub ident: Ident,
|
|
pub attrs: Vec<Attribute>
|
|
}
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
attrs: [
|
|
Attribute {
|
|
style: AttrStyle::Outer,
|
|
meta: Meta::List {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "derive",
|
|
},
|
|
],
|
|
},
|
|
delimiter: MacroDelimiter::Paren,
|
|
tokens: TokenStream(`Debug , Clone`),
|
|
},
|
|
},
|
|
],
|
|
vis: Visibility::Public,
|
|
ident: "Item",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Named {
|
|
named: [
|
|
Field {
|
|
vis: Visibility::Public,
|
|
ident: Some("ident"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "Ident",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
Token![,],
|
|
Field {
|
|
vis: Visibility::Public,
|
|
ident: Some("attrs"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "Vec",
|
|
arguments: PathArguments::AngleBracketed {
|
|
args: [
|
|
GenericArgument::Type(Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "Attribute",
|
|
},
|
|
],
|
|
},
|
|
}),
|
|
],
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
}
|
|
"###);
|
|
|
|
snapshot!(&input.attrs[0].meta, @r###"
|
|
Meta::List {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "derive",
|
|
},
|
|
],
|
|
},
|
|
delimiter: MacroDelimiter::Paren,
|
|
tokens: TokenStream(`Debug , Clone`),
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_union() {
|
|
let input = quote! {
|
|
union MaybeUninit<T> {
|
|
uninit: (),
|
|
value: T
|
|
}
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Inherited,
|
|
ident: "MaybeUninit",
|
|
generics: Generics {
|
|
lt_token: Some,
|
|
params: [
|
|
GenericParam::Type(TypeParam {
|
|
ident: "T",
|
|
}),
|
|
],
|
|
gt_token: Some,
|
|
},
|
|
data: Data::Union {
|
|
fields: FieldsNamed {
|
|
named: [
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ident: Some("uninit"),
|
|
colon_token: Some,
|
|
ty: Type::Tuple,
|
|
},
|
|
Token![,],
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ident: Some("value"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "T",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
#[cfg(feature = "full")]
|
|
fn test_enum() {
|
|
let input = quote! {
|
|
/// See the std::result module documentation for details.
|
|
#[must_use]
|
|
pub enum Result<T, E> {
|
|
Ok(T),
|
|
Err(E),
|
|
Surprise = 0isize,
|
|
|
|
// Smuggling data into a proc_macro_derive,
|
|
// in the style of https://github.com/dtolnay/proc-macro-hack
|
|
ProcMacroHack = (0, "data").0
|
|
}
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
attrs: [
|
|
Attribute {
|
|
style: AttrStyle::Outer,
|
|
meta: Meta::NameValue {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "doc",
|
|
},
|
|
],
|
|
},
|
|
value: Expr::Lit {
|
|
lit: " See the std::result module documentation for details.",
|
|
},
|
|
},
|
|
},
|
|
Attribute {
|
|
style: AttrStyle::Outer,
|
|
meta: Meta::Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "must_use",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
vis: Visibility::Public,
|
|
ident: "Result",
|
|
generics: Generics {
|
|
lt_token: Some,
|
|
params: [
|
|
GenericParam::Type(TypeParam {
|
|
ident: "T",
|
|
}),
|
|
Token![,],
|
|
GenericParam::Type(TypeParam {
|
|
ident: "E",
|
|
}),
|
|
],
|
|
gt_token: Some,
|
|
},
|
|
data: Data::Enum {
|
|
variants: [
|
|
Variant {
|
|
ident: "Ok",
|
|
fields: Fields::Unnamed {
|
|
unnamed: [
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "T",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
Token![,],
|
|
Variant {
|
|
ident: "Err",
|
|
fields: Fields::Unnamed {
|
|
unnamed: [
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "E",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
Token![,],
|
|
Variant {
|
|
ident: "Surprise",
|
|
fields: Fields::Unit,
|
|
discriminant: Some(Expr::Lit {
|
|
lit: 0isize,
|
|
}),
|
|
},
|
|
Token![,],
|
|
Variant {
|
|
ident: "ProcMacroHack",
|
|
fields: Fields::Unit,
|
|
discriminant: Some(Expr::Field {
|
|
base: Expr::Tuple {
|
|
elems: [
|
|
Expr::Lit {
|
|
lit: 0,
|
|
},
|
|
Token![,],
|
|
Expr::Lit {
|
|
lit: "data",
|
|
},
|
|
],
|
|
},
|
|
member: Member::Unnamed(Index {
|
|
index: 0,
|
|
}),
|
|
}),
|
|
},
|
|
],
|
|
},
|
|
}
|
|
"###);
|
|
|
|
let meta_items: Vec<_> = input.attrs.into_iter().map(|attr| attr.meta).collect();
|
|
|
|
snapshot!(meta_items, @r###"
|
|
[
|
|
Meta::NameValue {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "doc",
|
|
},
|
|
],
|
|
},
|
|
value: Expr::Lit {
|
|
lit: " See the std::result module documentation for details.",
|
|
},
|
|
},
|
|
Meta::Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "must_use",
|
|
},
|
|
],
|
|
},
|
|
]
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_attr_with_non_mod_style_path() {
|
|
let input = quote! {
|
|
#[inert <T>]
|
|
struct S;
|
|
};
|
|
|
|
syn::parse2::<DeriveInput>(input).unwrap_err();
|
|
}
|
|
|
|
#[test]
|
|
fn test_attr_with_mod_style_path_with_self() {
|
|
let input = quote! {
|
|
#[foo::self]
|
|
struct S;
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
attrs: [
|
|
Attribute {
|
|
style: AttrStyle::Outer,
|
|
meta: Meta::Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "foo",
|
|
},
|
|
Token![::],
|
|
PathSegment {
|
|
ident: "self",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
vis: Visibility::Inherited,
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unit,
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
|
|
snapshot!(&input.attrs[0].meta, @r###"
|
|
Meta::Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "foo",
|
|
},
|
|
Token![::],
|
|
PathSegment {
|
|
ident: "self",
|
|
},
|
|
],
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_pub_restricted() {
|
|
// Taken from tests/rust/src/test/ui/resolve/auxiliary/privacy-struct-ctor.rs
|
|
let input = quote! {
|
|
pub(in m) struct Z(pub(in m::n) u8);
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Restricted {
|
|
in_token: Some,
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "m",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
ident: "Z",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unnamed {
|
|
unnamed: [
|
|
Field {
|
|
vis: Visibility::Restricted {
|
|
in_token: Some,
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "m",
|
|
},
|
|
Token![::],
|
|
PathSegment {
|
|
ident: "n",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "u8",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_pub_restricted_crate() {
|
|
let input = quote! {
|
|
pub(crate) struct S;
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Restricted {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "crate",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unit,
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_pub_restricted_super() {
|
|
let input = quote! {
|
|
pub(super) struct S;
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Restricted {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "super",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unit,
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_pub_restricted_in_super() {
|
|
let input = quote! {
|
|
pub(in super) struct S;
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Restricted {
|
|
in_token: Some,
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "super",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unit,
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_fields_on_unit_struct() {
|
|
let input = quote! {
|
|
struct S;
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Inherited,
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unit,
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
|
|
let data = match input.data {
|
|
Data::Struct(data) => data,
|
|
_ => panic!("expected a struct"),
|
|
};
|
|
|
|
assert_eq!(0, data.fields.iter().count());
|
|
}
|
|
|
|
#[test]
|
|
fn test_fields_on_named_struct() {
|
|
let input = quote! {
|
|
struct S {
|
|
foo: i32,
|
|
pub bar: String,
|
|
}
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Inherited,
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Named {
|
|
named: [
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ident: Some("foo"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "i32",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
Token![,],
|
|
Field {
|
|
vis: Visibility::Public,
|
|
ident: Some("bar"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "String",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
Token![,],
|
|
],
|
|
},
|
|
},
|
|
}
|
|
"###);
|
|
|
|
let data = match input.data {
|
|
Data::Struct(data) => data,
|
|
_ => panic!("expected a struct"),
|
|
};
|
|
|
|
snapshot!(data.fields.into_iter().collect::<Vec<_>>(), @r###"
|
|
[
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ident: Some("foo"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "i32",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
Field {
|
|
vis: Visibility::Public,
|
|
ident: Some("bar"),
|
|
colon_token: Some,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "String",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
]
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_fields_on_tuple_struct() {
|
|
let input = quote! {
|
|
struct S(i32, pub String);
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Inherited,
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unnamed {
|
|
unnamed: [
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "i32",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
Token![,],
|
|
Field {
|
|
vis: Visibility::Public,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "String",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
|
|
let data = match input.data {
|
|
Data::Struct(data) => data,
|
|
_ => panic!("expected a struct"),
|
|
};
|
|
|
|
snapshot!(data.fields.iter().collect::<Vec<_>>(), @r###"
|
|
[
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "i32",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
Field {
|
|
vis: Visibility::Public,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "String",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
]
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn test_ambiguous_crate() {
|
|
let input = quote! {
|
|
// The field type is `(crate::X)` not `crate (::X)`.
|
|
struct S(crate::X);
|
|
};
|
|
|
|
snapshot!(input as DeriveInput, @r###"
|
|
DeriveInput {
|
|
vis: Visibility::Inherited,
|
|
ident: "S",
|
|
generics: Generics,
|
|
data: Data::Struct {
|
|
fields: Fields::Unnamed {
|
|
unnamed: [
|
|
Field {
|
|
vis: Visibility::Inherited,
|
|
ty: Type::Path {
|
|
path: Path {
|
|
segments: [
|
|
PathSegment {
|
|
ident: "crate",
|
|
},
|
|
Token![::],
|
|
PathSegment {
|
|
ident: "X",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
semi_token: Some,
|
|
},
|
|
}
|
|
"###);
|
|
}
|