Parse unsafety on extern blocks
diff --git a/syntax/file.rs b/syntax/file.rs
index dfe8e0d..2141c17 100644
--- a/syntax/file.rs
+++ b/syntax/file.rs
@@ -3,7 +3,7 @@
 use syn::parse::{Error, Parse, ParseStream, Result};
 use syn::{
     braced, token, Abi, Attribute, ForeignItem, Ident, Item as RustItem, ItemEnum, ItemStruct,
-    ItemUse, Token, Visibility,
+    ItemUse, LitStr, Token, Visibility,
 };
 
 pub struct Module {
@@ -75,18 +75,31 @@
 
 impl Parse for Item {
     fn parse(input: ParseStream) -> Result<Self> {
+        let attrs = input.call(Attribute::parse_outer)?;
+
+        let ahead = input.fork();
+        let unsafety = if ahead.parse::<Option<Token![unsafe]>>()?.is_some()
+            && ahead.parse::<Option<Token![extern]>>()?.is_some()
+            && ahead.parse::<Option<LitStr>>().is_ok()
+            && ahead.peek(token::Brace)
+        {
+            Some(input.parse()?)
+        } else {
+            None
+        };
+
         let item = input.parse()?;
         match item {
-            RustItem::Struct(item) => Ok(Item::Struct(item)),
-            RustItem::Enum(item) => Ok(Item::Enum(item)),
+            RustItem::Struct(item) => Ok(Item::Struct(ItemStruct { attrs, ..item })),
+            RustItem::Enum(item) => Ok(Item::Enum(ItemEnum { attrs, ..item })),
             RustItem::ForeignMod(item) => Ok(Item::ForeignMod(ItemForeignMod {
                 attrs: item.attrs,
-                unsafety: None,
+                unsafety,
                 abi: item.abi,
                 brace_token: item.brace_token,
                 items: item.items,
             })),
-            RustItem::Use(item) => Ok(Item::Use(item)),
+            RustItem::Use(item) => Ok(Item::Use(ItemUse { attrs, ..item })),
             other => Ok(Item::Other(other)),
         }
     }