fune/third_party/rust/syn/tests/test_derive_input.rs
Nicolas Silva 23b86e3def Bug 1872658 - Update wgpu to revision 46757372cc02d6608124502104a0c225e1744fd7. r=webgpu-reviewers,supply-chain-reviewers,teoxoy
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
2024-01-03 09:33:06 +00:00

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,
},
}
"###);
}