Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 35 additions & 3 deletions src/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,8 @@ ast_struct! {
pub colon_token: Option<Token![:]>,

pub ty: Type,

pub default: Option<(Token![=], Expr)>,
}
}

Expand Down Expand Up @@ -380,26 +382,52 @@ pub(crate) mod parsing {
input.parse()?
};

let default = if input.peek(Token![=]) {
let eq_token: Token![=] = input.parse()?;
let expr: Expr = input.parse()?;
Some((eq_token, expr))
} else {
None
};

Ok(Field {
attrs,
vis,
modifiers: FieldModifiers {},
ident: Some(ident),
colon_token: Some(colon_token),
ty,
default,
})
}

/// Parses an unnamed (tuple struct) field.
#[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]
pub fn parse_unnamed(input: ParseStream) -> Result<Self> {
let attrs = input.call(Attribute::parse_outer)?;
let vis: Visibility = input.parse()?;
let ty: Type = input.parse()?;

if input.peek(Token![=]) {
input.parse::<Token![=]>()?;
let start_span = input.span();
input.parse::<Expr>()?;
let end_span = input.cursor().prev_span();
return Err(crate::error::new2(
start_span,
end_span,
"field default value is only supported in structs with named fields",
));
}

Ok(Field {
attrs: input.call(Attribute::parse_outer)?,
vis: input.parse()?,
attrs,
vis,
modifiers: FieldModifiers {},
ident: None,
colon_token: None,
ty: input.parse()?,
ty,
default: None,
})
}
}
Expand Down Expand Up @@ -453,6 +481,10 @@ mod printing {
TokensOrDefault(&self.colon_token).to_tokens(tokens);
}
self.ty.to_tokens(tokens);
if let Some((eq_token, default)) = &self.default {
eq_token.to_tokens(tokens);
default.to_tokens(tokens);
}
}
}
}
1 change: 1 addition & 0 deletions src/gen/clone.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/gen/debug.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/gen/eq.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/gen/fold.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions src/gen/hash.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/gen/visit.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/gen/visit_mut.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 10 additions & 1 deletion src/parse_quote.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ impl<T: Parse> ParseQuote for T {

use crate::punctuated::Punctuated;
#[cfg(any(feature = "full", feature = "derive"))]
use crate::{attr, Attribute, Field, FieldModifiers, Ident, Type, Visibility};
use crate::{attr, Attribute, Expr, Field, FieldModifiers, Ident, Type, Visibility};
#[cfg(feature = "full")]
use crate::{Arm, Block, Pat, Safety, Stmt};

Expand Down Expand Up @@ -199,13 +199,22 @@ impl ParseQuote for Field {

let ty: Type = input.parse()?;

let default = if is_named && input.peek(Token![=]) {
let eq_token: Token![=] = input.parse()?;
let expr: Expr = input.parse()?;
Some((eq_token, expr))
} else {
None
};

Ok(Field {
attrs,
vis,
modifiers: FieldModifiers {},
ident,
colon_token,
ty,
default,
})
}
}
Expand Down
12 changes: 12 additions & 0 deletions syn.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions tests/debug/gen.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 1 addition & 26 deletions tests/repo/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ static EXCLUDE_FILES: &[&str] = &[
"tests/ui/consts/trait_alias_method_call.rs",
"tests/ui/generic-const-items/const-trait-impl.rs",
"tests/ui/parser/impls-nested-within-fns-semantic-1.rs",
"tests/ui/structs/default-field-values/support.rs",
"tests/ui/traits/const-traits/assoc-type-const-bound-usage-0.rs",
"tests/ui/traits/const-traits/assoc-type-const-bound-usage-1.rs",
"tests/ui/traits/const-traits/auxiliary/associated-const-stability.rs",
Expand Down Expand Up @@ -232,32 +233,6 @@ static EXCLUDE_FILES: &[&str] = &[
"tests/ui/pattern/rfc-3637-guard-patterns/only-gather-locals-once.rs",
"tests/ui/reachable/guard_read_for_never.rs",

// TODO: struct field default: `struct S { field: i32 = 1 }`
// https://github.com/dtolnay/syn/issues/1774
"compiler/rustc_ast_lowering/src/delegation/generics.rs",
"compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs",
"compiler/rustc_errors/src/markdown/parse.rs",
"compiler/rustc_hir/src/attrs/diagnostic.rs",
"compiler/rustc_hir_analysis/src/hir_wf_check.rs",
"compiler/rustc_middle/src/hir/map.rs",
"compiler/rustc_middle/src/ty/mod.rs",
"compiler/rustc_parse/src/parser/mod.rs",
"compiler/rustc_parse/src/parser/stmt.rs",
"compiler/rustc_privacy/src/lib.rs",
"compiler/rustc_resolve/src/imports.rs",
"compiler/rustc_resolve/src/lib.rs",
"compiler/rustc_session/src/config.rs",
"compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs",
"src/tools/clippy/tests/ui/exhaustive_items.rs",
"src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/record_field_default_values.rs",
"src/tools/rustfmt/tests/source/default-field-values.rs",
"src/tools/rustfmt/tests/target/default-field-values.rs",
"tests/ui/structs/default-field-values/auxiliary/struct_field_default.rs",
"tests/ui/structs/default-field-values/const-trait-default-field-value.rs",
"tests/ui/structs/default-field-values/field-references-param.rs",
"tests/ui/structs/default-field-values/support.rs",
"tests/ui/structs/default-field-values/use-normalized-ty-for-default-struct-value.rs",

// TODO: final associated functions: `final fn`
// https://github.com/dtolnay/syn/issues/1981
"library/core/src/io/size_hint.rs",
Expand Down