Keep items that have attr parse errors
diff --git a/syntax/parse.rs b/syntax/parse.rs
index b5070c7..f84ff32 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -25,11 +25,11 @@
     let mut apis = Vec::new();
     for item in items {
         match item {
-            Item::Struct(item) => match parse_struct(item) {
+            Item::Struct(item) => match parse_struct(cx, item) {
                 Ok(strct) => apis.push(strct),
                 Err(err) => cx.push(err),
             },
-            Item::Enum(item) => match parse_enum(item) {
+            Item::Enum(item) => match parse_enum(cx, item) {
                 Ok(enm) => apis.push(enm),
                 Err(err) => cx.push(err),
             },
@@ -41,7 +41,7 @@
     apis
 }
 
-fn parse_struct(item: ItemStruct) -> Result<Api> {
+fn parse_struct(cx: &mut Errors, item: ItemStruct) -> Result<Api> {
     let generics = &item.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
         let struct_token = item.struct_token;
@@ -57,12 +57,13 @@
     let mut doc = Doc::new();
     let mut derives = Vec::new();
     attrs::parse(
+        cx,
         &item.attrs,
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
         },
-    )?;
+    );
 
     let fields = match item.fields {
         Fields::Named(fields) => fields,
@@ -91,7 +92,7 @@
     }))
 }
 
-fn parse_enum(item: ItemEnum) -> Result<Api> {
+fn parse_enum(cx: &mut Errors, item: ItemEnum) -> Result<Api> {
     let generics = &item.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
         let enum_token = item.enum_token;
@@ -104,7 +105,7 @@
         ));
     }
 
-    let doc = attrs::parse_doc(&item.attrs)?;
+    let doc = attrs::parse_doc(cx, &item.attrs);
 
     let mut variants = Vec::new();
     let mut discriminants = HashSet::new();
@@ -176,11 +177,11 @@
     let mut items = Vec::new();
     for foreign in &foreign_mod.items {
         match foreign {
-            ForeignItem::Type(foreign) => match parse_extern_type(foreign, lang) {
+            ForeignItem::Type(foreign) => match parse_extern_type(cx, foreign, lang) {
                 Ok(ety) => items.push(ety),
                 Err(err) => cx.push(err),
             },
-            ForeignItem::Fn(foreign) => match parse_extern_fn(foreign, lang) {
+            ForeignItem::Fn(foreign) => match parse_extern_fn(cx, foreign, lang) {
                 Ok(efn) => items.push(efn),
                 Err(err) => cx.push(err),
             },
@@ -190,7 +191,7 @@
                     Err(err) => cx.push(err),
                 }
             }
-            ForeignItem::Verbatim(tokens) => match parse_extern_verbatim(tokens, lang) {
+            ForeignItem::Verbatim(tokens) => match parse_extern_verbatim(cx, tokens, lang) {
                 Ok(api) => items.push(api),
                 Err(err) => cx.push(err),
             },
@@ -236,8 +237,8 @@
     }
 }
 
-fn parse_extern_type(foreign_type: &ForeignItemType, lang: Lang) -> Result<Api> {
-    let doc = attrs::parse_doc(&foreign_type.attrs)?;
+fn parse_extern_type(cx: &mut Errors, foreign_type: &ForeignItemType, lang: Lang) -> Result<Api> {
+    let doc = attrs::parse_doc(cx, &foreign_type.attrs);
     let type_token = foreign_type.type_token;
     let ident = foreign_type.ident.clone();
     let api_type = match lang {
@@ -251,7 +252,7 @@
     }))
 }
 
-fn parse_extern_fn(foreign_fn: &ForeignItemFn, lang: Lang) -> Result<Api> {
+fn parse_extern_fn(cx: &mut Errors, foreign_fn: &ForeignItemFn, lang: Lang) -> Result<Api> {
     let generics = &foreign_fn.sig.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
         return Err(Error::new_spanned(
@@ -322,7 +323,7 @@
     let mut throws_tokens = None;
     let ret = parse_return_type(&foreign_fn.sig.output, &mut throws_tokens)?;
     let throws = throws_tokens.is_some();
-    let doc = attrs::parse_doc(&foreign_fn.attrs)?;
+    let doc = attrs::parse_doc(cx, &foreign_fn.attrs);
     let fn_token = foreign_fn.sig.fn_token;
     let ident = foreign_fn.sig.ident.clone();
     let paren_token = foreign_fn.sig.paren_token;
@@ -349,9 +350,9 @@
     }))
 }
 
-fn parse_extern_verbatim(tokens: &TokenStream, lang: Lang) -> Result<Api> {
+fn parse_extern_verbatim(cx: &mut Errors, tokens: &TokenStream, lang: Lang) -> Result<Api> {
     // type Alias = crate::path::to::Type;
-    fn parse(input: ParseStream) -> Result<TypeAlias> {
+    let parse = |input: ParseStream| -> Result<TypeAlias> {
         let attrs = input.call(Attribute::parse_outer)?;
         let type_token: Token![type] = match input.parse()? {
             Some(type_token) => type_token,
@@ -364,7 +365,7 @@
         let eq_token: Token![=] = input.parse()?;
         let ty: RustType = input.parse()?;
         let semi_token: Token![;] = input.parse()?;
-        attrs::parse_doc(&attrs)?;
+        attrs::parse_doc(cx, &attrs);
 
         Ok(TypeAlias {
             type_token,
@@ -373,7 +374,7 @@
             ty,
             semi_token,
         })
-    }
+    };
 
     let type_alias = parse.parse2(tokens.clone())?;
     match lang {