Skip to content

Commit 0c0cfee

Browse files
committed
Parse unsafety on extern blocks
1 parent 02550c0 commit 0c0cfee

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

syntax/file.rs

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use quote::quote;
33
use syn::parse::{Error, Parse, ParseStream, Result};
44
use syn::{
55
braced, token, Abi, Attribute, ForeignItem, Ident, Item as RustItem, ItemEnum, ItemStruct,
6-
ItemUse, Token, Visibility,
6+
ItemUse, LitStr, Token, Visibility,
77
};
88

99
pub struct Module {
@@ -75,18 +75,31 @@ impl Parse for Module {
7575

7676
impl Parse for Item {
7777
fn parse(input: ParseStream) -> Result<Self> {
78+
let attrs = input.call(Attribute::parse_outer)?;
79+
80+
let ahead = input.fork();
81+
let unsafety = if ahead.parse::<Option<Token![unsafe]>>()?.is_some()
82+
&& ahead.parse::<Option<Token![extern]>>()?.is_some()
83+
&& ahead.parse::<Option<LitStr>>().is_ok()
84+
&& ahead.peek(token::Brace)
85+
{
86+
Some(input.parse()?)
87+
} else {
88+
None
89+
};
90+
7891
let item = input.parse()?;
7992
match item {
80-
RustItem::Struct(item) => Ok(Item::Struct(item)),
81-
RustItem::Enum(item) => Ok(Item::Enum(item)),
93+
RustItem::Struct(item) => Ok(Item::Struct(ItemStruct { attrs, ..item })),
94+
RustItem::Enum(item) => Ok(Item::Enum(ItemEnum { attrs, ..item })),
8295
RustItem::ForeignMod(item) => Ok(Item::ForeignMod(ItemForeignMod {
8396
attrs: item.attrs,
84-
unsafety: None,
97+
unsafety,
8598
abi: item.abi,
8699
brace_token: item.brace_token,
87100
items: item.items,
88101
})),
89-
RustItem::Use(item) => Ok(Item::Use(item)),
102+
RustItem::Use(item) => Ok(Item::Use(ItemUse { attrs, ..item })),
90103
other => Ok(Item::Other(other)),
91104
}
92105
}

0 commit comments

Comments
 (0)