Preserve span of self var in Receiver
diff --git a/gen/write.rs b/gen/write.rs
index 2cb8b51..a8e3fd4 100644
--- a/gen/write.rs
+++ b/gen/write.rs
@@ -51,7 +51,7 @@
         if let Api::RustFunction(efn) = api {
             if let Some(receiver) = &efn.sig.receiver {
                 methods_for_type
-                    .entry(&receiver.ident)
+                    .entry(&receiver.ty)
                     .or_insert_with(Vec::new)
                     .push(efn);
             }
@@ -372,7 +372,7 @@
         if receiver.mutability.is_none() {
             write!(out, "const ");
         }
-        write!(out, "{} &self", receiver.ident);
+        write!(out, "{} &self", receiver.ty);
     }
     for (i, arg) in efn.args.iter().enumerate() {
         if i > 0 || efn.receiver.is_some() {
@@ -396,7 +396,7 @@
     write_return_type(out, &efn.ret);
     match &efn.receiver {
         None => write!(out, "(*{}$)(", efn.ident),
-        Some(receiver) => write!(out, "({}::*{}$)(", receiver.ident, efn.ident),
+        Some(receiver) => write!(out, "({}::*{}$)(", receiver.ty, efn.ident),
     }
     for (i, arg) in efn.args.iter().enumerate() {
         if i > 0 {
@@ -413,7 +413,7 @@
     write!(out, " = ");
     match &efn.receiver {
         None => write!(out, "{}", efn.ident),
-        Some(receiver) => write!(out, "&{}::{}", receiver.ident, efn.ident),
+        Some(receiver) => write!(out, "&{}::{}", receiver.ty, efn.ident),
     }
     writeln!(out, ";");
     write!(out, "  ");
@@ -539,7 +539,7 @@
         if receiver.mutability.is_none() {
             write!(out, "const ");
         }
-        write!(out, "{} &self", receiver.ident);
+        write!(out, "{} &self", receiver.ty);
         needs_comma = true;
     }
     for arg in &sig.args {
@@ -572,7 +572,7 @@
     }
     let local_name = match &efn.sig.receiver {
         None => efn.ident.to_string(),
-        Some(receiver) => format!("{}::{}", receiver.ident, efn.ident),
+        Some(receiver) => format!("{}::{}", receiver.ty, efn.ident),
     };
     let invoke = mangle::extern_fn(&out.namespace, efn);
     let indirect_call = false;
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index 207682e..4841794 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -302,7 +302,7 @@
     match &efn.receiver {
         None => function_shim,
         Some(receiver) => {
-            let receiver_type = &receiver.ident;
+            let receiver_type = &receiver.ty;
             quote!(impl #receiver_type { #function_shim })
         }
     }
@@ -414,7 +414,7 @@
         Some(ident) => match &sig.receiver {
             None => quote!(super::#ident),
             Some(receiver) => {
-                let receiver_type = &receiver.ident;
+                let receiver_type = &receiver.ty;
                 quote!(#receiver_type::#ident)
             }
         },
diff --git a/syntax/impls.rs b/syntax/impls.rs
index 3509899..7b2d746 100644
--- a/syntax/impls.rs
+++ b/syntax/impls.rs
@@ -187,14 +187,16 @@
         let Receiver {
             ampersand: _,
             mutability,
-            ident,
+            var: _,
+            ty,
         } = self;
         let Receiver {
             ampersand: _,
             mutability: mutability2,
-            ident: ident2,
+            var: _,
+            ty: ty2,
         } = other;
-        mutability.is_some() == mutability2.is_some() && ident == ident2
+        mutability.is_some() == mutability2.is_some() && ty == ty2
     }
 }
 
@@ -203,9 +205,10 @@
         let Receiver {
             ampersand: _,
             mutability,
-            ident,
+            var: _,
+            ty,
         } = self;
         mutability.is_some().hash(state);
-        ident.hash(state);
+        ty.hash(state);
     }
 }
diff --git a/syntax/mangle.rs b/syntax/mangle.rs
index 6f4e0d8..1380704 100644
--- a/syntax/mangle.rs
+++ b/syntax/mangle.rs
@@ -13,7 +13,7 @@
 
 pub fn extern_fn(namespace: &Namespace, efn: &ExternFn) -> Symbol {
     match &efn.receiver {
-        Some(receiver) => join!(namespace, CXXBRIDGE, receiver.ident, efn.ident),
+        Some(receiver) => join!(namespace, CXXBRIDGE, receiver.ty, efn.ident),
         None => join!(namespace, CXXBRIDGE, efn.ident),
     }
 }
diff --git a/syntax/mod.rs b/syntax/mod.rs
index b160e5a..3a2bb93 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -77,7 +77,8 @@
 pub struct Receiver {
     pub ampersand: Token![&],
     pub mutability: Option<Token![mut]>,
-    pub ident: Ident,
+    pub var: Token![self],
+    pub ty: Ident,
 }
 
 pub enum Type {
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 7bd36de..d8bc0e5 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -182,7 +182,8 @@
                         receiver = Some(Receiver {
                             ampersand: reference.ampersand,
                             mutability: reference.mutability,
-                            ident,
+                            var: Token![self](ident.span()),
+                            ty: ident,
                         });
                         continue;
                     }
diff --git a/syntax/tokens.rs b/syntax/tokens.rs
index 784de37..6e3db9b 100644
--- a/syntax/tokens.rs
+++ b/syntax/tokens.rs
@@ -102,6 +102,6 @@
     fn to_tokens(&self, tokens: &mut TokenStream) {
         self.ampersand.to_tokens(tokens);
         self.mutability.to_tokens(tokens);
-        self.ident.to_tokens(tokens);
+        self.ty.to_tokens(tokens);
     }
 }