diff --git a/gen/src/alphasort.rs b/gen/src/alphasort.rs
index 5c21bc4..08ce4b4 100644
--- a/gen/src/alphasort.rs
+++ b/gen/src/alphasort.rs
@@ -29,8 +29,8 @@
     let mut direct = Vec::new();
     let mut nested_namespaces = BTreeMap::new();
     for api in &apis {
-        if let Some(ns) = api.namespace() {
-            let first_ns_elem = ns.iter().nth(depth);
+        if let Some(namespace) = api.namespace() {
+            let first_ns_elem = namespace.iter().nth(depth);
             if let Some(first_ns_elem) = first_ns_elem {
                 nested_namespaces
                     .entry(first_ns_elem)
diff --git a/macro/src/lib.rs b/macro/src/lib.rs
index 3796431..e55a08a 100644
--- a/macro/src/lib.rs
+++ b/macro/src/lib.rs
@@ -43,7 +43,7 @@
     let _ = syntax::error::ERRORS;
 
     let namespace = match Namespace::parse_bridge_attr_namespace.parse(args) {
-        Ok(ns) => ns,
+        Ok(namespace) => namespace,
         Err(err) => return err.to_compile_error().into(),
     };
     let mut ffi = parse_macro_input!(input as Module);
diff --git a/syntax/ident.rs b/syntax/ident.rs
index 354790a..03c4380 100644
--- a/syntax/ident.rs
+++ b/syntax/ident.rs
@@ -13,7 +13,7 @@
 }
 
 fn check_ident(cx: &mut Check, ident: &CppName) {
-    for segment in &ident.ns {
+    for segment in &ident.namespace {
         check(cx, segment);
     }
     check(cx, &ident.ident);
diff --git a/syntax/mangle.rs b/syntax/mangle.rs
index 9255feb..d1f3adc 100644
--- a/syntax/mangle.rs
+++ b/syntax/mangle.rs
@@ -15,13 +15,13 @@
         Some(receiver) => {
             let receiver_ident = types.resolve(&receiver.ty);
             join!(
-                efn.ident.cxx.ns,
+                efn.ident.cxx.namespace,
                 CXXBRIDGE,
                 receiver_ident.ident,
                 efn.ident.rust
             )
         }
-        None => join!(efn.ident.cxx.ns, CXXBRIDGE, efn.ident.rust),
+        None => join!(efn.ident.cxx.namespace, CXXBRIDGE, efn.ident.rust),
     }
 }
 
diff --git a/syntax/mod.rs b/syntax/mod.rs
index 90af17f..b12d72b 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -197,7 +197,7 @@
 // to output it as a qualified name or as an unqualfied name.
 #[derive(Clone)]
 pub struct CppName {
-    pub ns: Namespace,
+    pub namespace: Namespace,
     pub ident: Ident,
 }
 
diff --git a/syntax/names.rs b/syntax/names.rs
index a61ffc3..ee010a9 100644
--- a/syntax/names.rs
+++ b/syntax/names.rs
@@ -5,19 +5,23 @@
 impl Pair {
     /// Use this constructor when the item can't have a different
     /// name in Rust and C++.
-    pub fn new(ns: Namespace, ident: Ident) -> Self {
+    pub fn new(namespace: Namespace, ident: Ident) -> Self {
         Self {
             rust: ident.clone(),
-            cxx: CppName::new(ns, ident),
+            cxx: CppName::new(namespace, ident),
         }
     }
 
     /// Use this constructor when attributes such as #[rust_name]
     /// can be used to potentially give a different name in Rust vs C++.
-    pub fn new_from_differing_names(ns: Namespace, cxx_ident: Ident, rust_ident: Ident) -> Self {
+    pub fn new_from_differing_names(
+        namespace: Namespace,
+        cxx_ident: Ident,
+        rust_ident: Ident,
+    ) -> Self {
         Self {
             rust: rust_ident,
-            cxx: CppName::new(ns, cxx_ident),
+            cxx: CppName::new(namespace, cxx_ident),
         }
     }
 }
@@ -47,12 +51,12 @@
 }
 
 impl CppName {
-    pub fn new(ns: Namespace, ident: Ident) -> Self {
-        Self { ns, ident }
+    pub fn new(namespace: Namespace, ident: Ident) -> Self {
+        Self { namespace, ident }
     }
 
     fn iter_all_segments(&self) -> impl Iterator<Item = &Ident> {
-        self.ns.iter().chain(std::iter::once(&self.ident))
+        self.namespace.iter().chain(std::iter::once(&self.ident))
     }
 
     fn join(&self, sep: &str) -> String {
diff --git a/syntax/namespace.rs b/syntax/namespace.rs
index 7628b0a..02e5dc2 100644
--- a/syntax/namespace.rs
+++ b/syntax/namespace.rs
@@ -32,9 +32,9 @@
 
         input.parse::<kw::namespace>()?;
         input.parse::<Token![=]>()?;
-        let ns = input.parse::<Namespace>()?;
+        let namespace = input.parse::<Namespace>()?;
         input.parse::<Option<Token![,]>>()?;
-        Ok(ns)
+        Ok(namespace)
     }
 }
 
@@ -88,10 +88,10 @@
 impl Api {
     pub fn namespace(&self) -> Option<&Namespace> {
         match self {
-            Api::CxxFunction(efn) | Api::RustFunction(efn) => Some(&efn.ident.cxx.ns),
-            Api::CxxType(ety) | Api::RustType(ety) => Some(&ety.ident.cxx.ns),
-            Api::Enum(enm) => Some(&enm.ident.cxx.ns),
-            Api::Struct(strct) => Some(&strct.ident.cxx.ns),
+            Api::CxxFunction(efn) | Api::RustFunction(efn) => Some(&efn.ident.cxx.namespace),
+            Api::CxxType(ety) | Api::RustType(ety) => Some(&ety.ident.cxx.namespace),
+            Api::Enum(enm) => Some(&enm.ident.cxx.namespace),
+            Api::Struct(strct) => Some(&strct.ident.cxx.namespace),
             Api::Impl(_) | Api::Include(_) | Api::TypeAlias(_) => None,
         }
     }
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 1927554..c170f79 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -21,22 +21,27 @@
     syn::custom_keyword!(Result);
 }
 
-pub fn parse_items(cx: &mut Errors, items: Vec<Item>, trusted: bool, ns: &Namespace) -> Vec<Api> {
+pub fn parse_items(
+    cx: &mut Errors,
+    items: Vec<Item>,
+    trusted: bool,
+    namespace: &Namespace,
+) -> Vec<Api> {
     let mut apis = Vec::new();
     for item in items {
         match item {
-            Item::Struct(item) => match parse_struct(cx, item, ns.clone()) {
+            Item::Struct(item) => match parse_struct(cx, item, namespace.clone()) {
                 Ok(strct) => apis.push(strct),
                 Err(err) => cx.push(err),
             },
-            Item::Enum(item) => match parse_enum(cx, item, ns.clone()) {
+            Item::Enum(item) => match parse_enum(cx, item, namespace.clone()) {
                 Ok(enm) => apis.push(enm),
                 Err(err) => cx.push(err),
             },
             Item::ForeignMod(foreign_mod) => {
-                parse_foreign_mod(cx, foreign_mod, &mut apis, trusted, ns)
+                parse_foreign_mod(cx, foreign_mod, &mut apis, trusted, namespace)
             }
-            Item::Impl(item) => match parse_impl(item, ns) {
+            Item::Impl(item) => match parse_impl(item, namespace) {
                 Ok(imp) => apis.push(imp),
                 Err(err) => cx.push(err),
             },
@@ -47,7 +52,7 @@
     apis
 }
 
-fn parse_struct(cx: &mut Errors, item: ItemStruct, mut ns: Namespace) -> Result<Api> {
+fn parse_struct(cx: &mut Errors, item: ItemStruct, mut namespace: Namespace) -> Result<Api> {
     let generics = &item.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
         let struct_token = item.struct_token;
@@ -68,7 +73,7 @@
         attrs::Parser {
             doc: Some(&mut doc),
             derives: Some(&mut derives),
-            namespace: Some(&mut ns),
+            namespace: Some(&mut namespace),
             ..Default::default()
         },
     );
@@ -85,7 +90,7 @@
         doc,
         derives,
         struct_token: item.struct_token,
-        ident: Pair::new(ns.clone(), item.ident),
+        ident: Pair::new(namespace.clone(), item.ident),
         brace_token: fields.brace_token,
         fields: fields
             .named
@@ -93,14 +98,14 @@
             .map(|field| {
                 Ok(Var {
                     ident: field.ident.unwrap(),
-                    ty: parse_type(&field.ty, &ns)?,
+                    ty: parse_type(&field.ty, &namespace)?,
                 })
             })
             .collect::<Result<_>>()?,
     }))
 }
 
-fn parse_enum(cx: &mut Errors, item: ItemEnum, mut ns: Namespace) -> Result<Api> {
+fn parse_enum(cx: &mut Errors, item: ItemEnum, mut namespace: Namespace) -> Result<Api> {
     let generics = &item.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
         let enum_token = item.enum_token;
@@ -121,7 +126,7 @@
         attrs::Parser {
             doc: Some(&mut doc),
             repr: Some(&mut repr),
-            namespace: Some(&mut ns),
+            namespace: Some(&mut namespace),
             ..Default::default()
         },
     );
@@ -172,7 +177,7 @@
     Ok(Api::Enum(Enum {
         doc,
         enum_token,
-        ident: Pair::new(ns, item.ident),
+        ident: Pair::new(namespace, item.ident),
         brace_token,
         variants,
         repr,
@@ -184,7 +189,7 @@
     foreign_mod: ItemForeignMod,
     out: &mut Vec<Api>,
     trusted: bool,
-    ns: &Namespace,
+    namespace: &Namespace,
 ) {
     let lang = match parse_lang(&foreign_mod.abi) {
         Ok(lang) => lang,
@@ -209,12 +214,13 @@
     for foreign in &foreign_mod.items {
         match foreign {
             ForeignItem::Type(foreign) => {
-                match parse_extern_type(cx, foreign, lang, trusted, ns.clone()) {
+                match parse_extern_type(cx, foreign, lang, trusted, namespace.clone()) {
                     Ok(ety) => items.push(ety),
                     Err(err) => cx.push(err),
                 }
             }
-            ForeignItem::Fn(foreign) => match parse_extern_fn(cx, foreign, lang, ns.clone()) {
+            ForeignItem::Fn(foreign) => match parse_extern_fn(cx, foreign, lang, namespace.clone())
+            {
                 Ok(efn) => items.push(efn),
                 Err(err) => cx.push(err),
             },
@@ -225,7 +231,7 @@
                 }
             }
             ForeignItem::Verbatim(tokens) => {
-                match parse_extern_verbatim(cx, tokens, lang, ns.clone()) {
+                match parse_extern_verbatim(cx, tokens, lang, namespace.clone()) {
                     Ok(api) => items.push(api),
                     Err(err) => cx.push(err),
                 }
@@ -277,7 +283,7 @@
     foreign_type: &ForeignItemType,
     lang: Lang,
     trusted: bool,
-    mut ns: Namespace,
+    mut namespace: Namespace,
 ) -> Result<Api> {
     let mut doc = Doc::new();
     attrs::parse(
@@ -285,7 +291,7 @@
         &foreign_type.attrs,
         attrs::Parser {
             doc: Some(&mut doc),
-            namespace: Some(&mut ns),
+            namespace: Some(&mut namespace),
             ..Default::default()
         },
     );
@@ -299,7 +305,7 @@
     Ok(api_type(ExternType {
         doc,
         type_token,
-        ident: Pair::new(ns, ident),
+        ident: Pair::new(namespace, ident),
         semi_token,
         trusted,
     }))
@@ -309,7 +315,7 @@
     cx: &mut Errors,
     foreign_fn: &ForeignItemFn,
     lang: Lang,
-    mut ns: Namespace,
+    mut namespace: Namespace,
 ) -> Result<Api> {
     let generics = &foreign_fn.sig.generics;
     if !generics.params.is_empty() || generics.where_clause.is_some() {
@@ -335,7 +341,7 @@
             doc: Some(&mut doc),
             cxx_name: Some(&mut cxx_name),
             rust_name: Some(&mut rust_name),
-            namespace: Some(&mut ns),
+            namespace: Some(&mut namespace),
             ..Default::default()
         },
     );
@@ -367,7 +373,7 @@
                     }
                     _ => return Err(Error::new_spanned(arg, "unsupported signature")),
                 };
-                let ty = parse_type(&arg.ty, &ns)?;
+                let ty = parse_type(&arg.ty, &namespace)?;
                 if ident != "self" {
                     args.push_value(Var { ident, ty });
                     if let Some(comma) = comma {
@@ -394,12 +400,12 @@
     }
 
     let mut throws_tokens = None;
-    let ret = parse_return_type(&foreign_fn.sig.output, &mut throws_tokens, &ns)?;
+    let ret = parse_return_type(&foreign_fn.sig.output, &mut throws_tokens, &namespace)?;
     let throws = throws_tokens.is_some();
     let unsafety = foreign_fn.sig.unsafety;
     let fn_token = foreign_fn.sig.fn_token;
     let ident = Pair::new_from_differing_names(
-        ns,
+        namespace,
         cxx_name.unwrap_or(foreign_fn.sig.ident.clone()),
         rust_name.unwrap_or(foreign_fn.sig.ident.clone()),
     );
@@ -432,7 +438,7 @@
     cx: &mut Errors,
     tokens: &TokenStream,
     lang: Lang,
-    mut ns: Namespace,
+    mut namespace: Namespace,
 ) -> Result<Api> {
     // type Alias = crate::path::to::Type;
     let parse = |input: ParseStream| -> Result<TypeAlias> {
@@ -454,7 +460,7 @@
             &attrs,
             attrs::Parser {
                 doc: Some(&mut doc),
-                namespace: Some(&mut ns),
+                namespace: Some(&mut namespace),
                 ..Default::default()
             },
         );
@@ -462,7 +468,7 @@
         Ok(TypeAlias {
             doc,
             type_token,
-            ident: Pair::new(ns, ident),
+            ident: Pair::new(namespace, ident),
             eq_token,
             ty,
             semi_token,
@@ -481,7 +487,7 @@
     }
 }
 
-fn parse_impl(imp: ItemImpl, ns: &Namespace) -> Result<Api> {
+fn parse_impl(imp: ItemImpl, namespace: &Namespace) -> Result<Api> {
     if !imp.items.is_empty() {
         let mut span = Group::new(Delimiter::Brace, TokenStream::new());
         span.set_span(imp.brace_token.span);
@@ -507,7 +513,7 @@
 
     Ok(Api::Impl(Impl {
         impl_token: imp.impl_token,
-        ty: parse_type(&self_ty, ns)?,
+        ty: parse_type(&self_ty, namespace)?,
         brace_token: imp.brace_token,
     }))
 }
@@ -556,19 +562,19 @@
     Err(input.error("expected \"quoted/path/to\" or <bracketed/path/to>"))
 }
 
-fn parse_type(ty: &RustType, ns: &Namespace) -> Result<Type> {
+fn parse_type(ty: &RustType, namespace: &Namespace) -> Result<Type> {
     match ty {
-        RustType::Reference(ty) => parse_type_reference(ty, ns),
-        RustType::Path(ty) => parse_type_path(ty, ns),
-        RustType::Slice(ty) => parse_type_slice(ty, ns),
-        RustType::BareFn(ty) => parse_type_fn(ty, ns),
+        RustType::Reference(ty) => parse_type_reference(ty, namespace),
+        RustType::Path(ty) => parse_type_path(ty, namespace),
+        RustType::Slice(ty) => parse_type_slice(ty, namespace),
+        RustType::BareFn(ty) => parse_type_fn(ty, namespace),
         RustType::Tuple(ty) if ty.elems.is_empty() => Ok(Type::Void(ty.paren_token.span)),
         _ => Err(Error::new_spanned(ty, "unsupported type")),
     }
 }
 
-fn parse_type_reference(ty: &TypeReference, ns: &Namespace) -> Result<Type> {
-    let inner = parse_type(&ty.elem, ns)?;
+fn parse_type_reference(ty: &TypeReference, namespace: &Namespace) -> Result<Type> {
+    let inner = parse_type(&ty.elem, namespace)?;
     let which = match &inner {
         Type::Ident(ident) if ident.rust == "str" => {
             if ty.mutability.is_some() {
@@ -591,7 +597,7 @@
     })))
 }
 
-fn parse_type_path(ty: &TypePath, ns: &Namespace) -> Result<Type> {
+fn parse_type_path(ty: &TypePath, namespace: &Namespace) -> Result<Type> {
     let path = &ty.path;
     if ty.qself.is_none() && path.leading_colon.is_none() && path.segments.len() == 1 {
         let segment = &path.segments[0];
@@ -602,7 +608,7 @@
             PathArguments::AngleBracketed(generic) => {
                 if ident == "UniquePtr" && generic.args.len() == 1 {
                     if let GenericArgument::Type(arg) = &generic.args[0] {
-                        let inner = parse_type(arg, ns)?;
+                        let inner = parse_type(arg, namespace)?;
                         return Ok(Type::UniquePtr(Box::new(Ty1 {
                             name: maybe_resolved_ident,
                             langle: generic.lt_token,
@@ -612,7 +618,7 @@
                     }
                 } else if ident == "CxxVector" && generic.args.len() == 1 {
                     if let GenericArgument::Type(arg) = &generic.args[0] {
-                        let inner = parse_type(arg, ns)?;
+                        let inner = parse_type(arg, namespace)?;
                         return Ok(Type::CxxVector(Box::new(Ty1 {
                             name: maybe_resolved_ident,
                             langle: generic.lt_token,
@@ -622,7 +628,7 @@
                     }
                 } else if ident == "Box" && generic.args.len() == 1 {
                     if let GenericArgument::Type(arg) = &generic.args[0] {
-                        let inner = parse_type(arg, ns)?;
+                        let inner = parse_type(arg, namespace)?;
                         return Ok(Type::RustBox(Box::new(Ty1 {
                             name: maybe_resolved_ident,
                             langle: generic.lt_token,
@@ -632,7 +638,7 @@
                     }
                 } else if ident == "Vec" && generic.args.len() == 1 {
                     if let GenericArgument::Type(arg) = &generic.args[0] {
-                        let inner = parse_type(arg, ns)?;
+                        let inner = parse_type(arg, namespace)?;
                         return Ok(Type::RustVec(Box::new(Ty1 {
                             name: maybe_resolved_ident,
                             langle: generic.lt_token,
@@ -648,15 +654,15 @@
     Err(Error::new_spanned(ty, "unsupported type"))
 }
 
-fn parse_type_slice(ty: &TypeSlice, ns: &Namespace) -> Result<Type> {
-    let inner = parse_type(&ty.elem, ns)?;
+fn parse_type_slice(ty: &TypeSlice, namespace: &Namespace) -> Result<Type> {
+    let inner = parse_type(&ty.elem, namespace)?;
     Ok(Type::Slice(Box::new(Slice {
         bracket: ty.bracket_token,
         inner,
     })))
 }
 
-fn parse_type_fn(ty: &TypeBareFn, ns: &Namespace) -> Result<Type> {
+fn parse_type_fn(ty: &TypeBareFn, namespace: &Namespace) -> Result<Type> {
     if ty.lifetimes.is_some() {
         return Err(Error::new_spanned(
             ty,
@@ -674,7 +680,7 @@
         .iter()
         .enumerate()
         .map(|(i, arg)| {
-            let ty = parse_type(&arg.ty, ns)?;
+            let ty = parse_type(&arg.ty, namespace)?;
             let ident = match &arg.name {
                 Some(ident) => ident.0.clone(),
                 None => format_ident!("_{}", i),
@@ -683,7 +689,7 @@
         })
         .collect::<Result<_>>()?;
     let mut throws_tokens = None;
-    let ret = parse_return_type(&ty.output, &mut throws_tokens, ns)?;
+    let ret = parse_return_type(&ty.output, &mut throws_tokens, namespace)?;
     let throws = throws_tokens.is_some();
     Ok(Type::Fn(Box::new(Signature {
         unsafety: ty.unsafety,
@@ -700,7 +706,7 @@
 fn parse_return_type(
     ty: &ReturnType,
     throws_tokens: &mut Option<(kw::Result, Token![<], Token![>])>,
-    ns: &Namespace,
+    namespace: &Namespace,
 ) -> Result<Option<Type>> {
     let mut ret = match ty {
         ReturnType::Default => return Ok(None),
@@ -722,7 +728,7 @@
             }
         }
     }
-    match parse_type(ret, ns)? {
+    match parse_type(ret, namespace)? {
         Type::Void(_) => Ok(None),
         ty => Ok(Some(ty)),
     }
diff --git a/syntax/symbol.rs b/syntax/symbol.rs
index 0b79d5f..c849a62 100644
--- a/syntax/symbol.rs
+++ b/syntax/symbol.rs
@@ -81,7 +81,7 @@
 
 impl Segment for CppName {
     fn write(&self, symbol: &mut Symbol) {
-        self.ns.write(symbol);
+        self.namespace.write(symbol);
         self.ident.write(symbol);
     }
 }
