Store language identifier inside ExternFn for diagnostics
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 7bae707..00ea15c 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -1,5 +1,5 @@
 use crate::syntax::{
-    attrs, error, Api, Atom, Doc, ExternFn, ExternType, Receiver, Ref, Struct, Ty1, Type, Var,
+    attrs, error, Api, Atom, Doc, ExternFn, ExternType, Lang, Receiver, Ref, Struct, Ty1, Type, Var,
 };
 use proc_macro2::Ident;
 use quote::quote;
@@ -8,12 +8,6 @@
     ItemForeignMod, ItemStruct, Pat, PathArguments, Result, ReturnType, Type as RustType,
 };
 
-#[derive(Copy, Clone)]
-enum Lang {
-    Cxx,
-    Rust,
-}
-
 pub fn parse_items(items: Vec<Item>) -> Result<Vec<Api>> {
     let mut apis = Vec::new();
     for item in items {
@@ -92,7 +86,7 @@
                 items.push(api_type(ety));
             }
             ForeignItem::Fn(foreign) => {
-                let efn = parse_extern_fn(foreign)?;
+                let efn = parse_extern_fn(foreign, lang)?;
                 items.push(api_function(efn));
             }
             ForeignItem::Macro(foreign) if foreign.mac.path.is_ident("include") => {
@@ -133,7 +127,7 @@
     })
 }
 
-fn parse_extern_fn(foreign_fn: &ForeignItemFn) -> Result<ExternFn> {
+fn parse_extern_fn(foreign_fn: &ForeignItemFn, lang: Lang) -> Result<ExternFn> {
     let generics = &foreign_fn.sig.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
         return Err(Error::new_spanned(
@@ -211,6 +205,7 @@
     let ident = foreign_fn.sig.ident.clone();
     let semi_token = foreign_fn.semi_token;
     Ok(ExternFn {
+        lang,
         doc,
         fn_token,
         ident,