Resolve manual_let_else clippy lint

    warning: this could be rewritten as `let...else`
      --> gen/build/src/cargo.rs:54:13
       |
    54 | /             let k = match k.to_str() {
    55 | |                 Some(k) => k,
    56 | |                 None => continue,
    57 | |             };
       | |______________^ help: consider writing: `let Some(k) = k.to_str() else { continue };`
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else
       = note: `-W clippy::manual-let-else` implied by `-W clippy::pedantic`
       = help: to override `-W clippy::pedantic` add `#[allow(clippy::manual_let_else)]`

    warning: this could be rewritten as `let...else`
      --> gen/build/src/cargo.rs:58:13
       |
    58 | /             let v = match v.into_string() {
    59 | |                 Ok(v) => v,
    60 | |                 Err(_) => continue,
    61 | |             };
       | |______________^ help: consider writing: `let Ok(v) = v.into_string() else { continue };`
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else

    warning: this could be rewritten as `let...else`
       --> gen/build/src/lib.rs:437:5
        |
    437 | /     let mut entries = match fs::read_dir(src) {
    438 | |         Ok(entries) => entries,
    439 | |         Err(_) => return,
    440 | |     };
        | |______^ help: consider writing: `let Ok(mut entries) = fs::read_dir(src) else { return };`
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else

    warning: this could be rewritten as `let...else`
       --> gen/build/src/out.rs:160:5
        |
    160 | /     let relative_path = match abstractly_relativize_symlink(original, link) {
    161 | |         Some(relative_path) => relative_path,
    162 | |         None => return original.to_path_buf(),
    163 | |     };
        | |______^ help: consider writing: `let Some(relative_path) = abstractly_relativize_symlink(original, link) else { return original.to_path_buf() };`
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else

    warning: this could be rewritten as `let...else`
       --> syntax/check.rs:558:9
        |
    558 | /         let resolve = match cx.types.try_resolve(&receiver.ty) {
    559 | |             Some(resolve) => resolve,
    560 | |             None => return,
    561 | |         };
        | |__________^ help: consider writing: `let Some(resolve) = cx.types.try_resolve(&receiver.ty) else { return };`
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else
        = note: `-W clippy::manual-let-else` implied by `-W clippy::pedantic`
        = help: to override `-W clippy::pedantic` add `#[allow(clippy::manual_let_else)]`

    warning: this could be rewritten as `let...else`
       --> syntax/parse.rs:439:5
        |
    439 | /     let name = match &abi.name {
    440 | |         Some(name) => name,
    441 | |         None => {
    442 | |             return Err(Error::new_spanned(
    ...   |
    446 | |         }
    447 | |     };
        | |______^
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else
    help: consider writing
        |
    439 ~     let Some(name) = &abi.name else {
    440 +             return Err(Error::new_spanned(
    441 +                 abi,
    442 +                 "ABI name is required, extern \"C++\" or extern \"Rust\"",
    443 +             ));
    444 +         };
        |

    warning: this could be rewritten as `let...else`
        --> syntax/parse.rs:1332:5
         |
    1332 | /     let len_expr = if let Expr::Lit(lit) = &ty.len {
    1333 | |         lit
    1334 | |     } else {
    1335 | |         let msg = "unsupported expression, array length must be an integer literal";
    1336 | |         return Err(Error::new_spanned(&ty.len, msg));
    1337 | |     };
         | |______^
         |
         = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else
    help: consider writing
         |
    1332 ~     let Expr::Lit(len_expr) = &ty.len else {
    1333 +         let msg = "unsupported expression, array length must be an integer literal";
    1334 +         return Err(Error::new_spanned(&ty.len, msg));
    1335 +     };
         |

    warning: this could be rewritten as `let...else`
      --> syntax/report.rs:24:9
       |
    24 | /         let mut all_errors = match iter.next() {
    25 | |             Some(err) => err,
    26 | |             None => return Ok(()),
    27 | |         };
       | |__________^ help: consider writing: `let Some(mut all_errors) = iter.next() else { return Ok(()) };`
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else

    warning: this could be rewritten as `let...else`
       --> syntax/types.rs:174:13
        |
    174 | /             let impl_key = match ty.impl_key() {
    175 | |                 Some(impl_key) => impl_key,
    176 | |                 None => continue,
    177 | |             };
        | |______________^ help: consider writing: `let Some(impl_key) = ty.impl_key() else { continue };`
        |
        = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else
diff --git a/gen/build/src/cargo.rs b/gen/build/src/cargo.rs
index cbaa58a..224f441 100644
--- a/gen/build/src/cargo.rs
+++ b/gen/build/src/cargo.rs
@@ -51,13 +51,11 @@
         let mut features = Set::new();
         let mut cfgs = Map::new();
         for (k, v) in env::vars_os() {
-            let k = match k.to_str() {
-                Some(k) => k,
-                None => continue,
+            let Some(k) = k.to_str() else {
+                continue;
             };
-            let v = match v.into_string() {
-                Ok(v) => v,
-                Err(_) => continue,
+            let Ok(v) = v.into_string() else {
+                continue;
             };
             if let Some(feature_name) = k.strip_prefix(CARGO_FEATURE_PREFIX) {
                 let feature_name = Name(feature_name.to_owned());
diff --git a/gen/build/src/lib.rs b/gen/build/src/lib.rs
index ef8aeaf..16ea0e3 100644
--- a/gen/build/src/lib.rs
+++ b/gen/build/src/lib.rs
@@ -58,7 +58,6 @@
     clippy::inherent_to_string,
     clippy::into_iter_without_iter,
     clippy::items_after_statements,
-    clippy::manual_let_else,
     clippy::match_bool,
     clippy::match_on_vec_items,
     clippy::match_same_arms,
@@ -435,9 +434,8 @@
     use std::fs;
 
     let mut dst_created = false;
-    let mut entries = match fs::read_dir(src) {
-        Ok(entries) => entries,
-        Err(_) => return,
+    let Ok(mut entries) = fs::read_dir(src) else {
+        return;
     };
 
     while let Some(Ok(entry)) = entries.next() {
diff --git a/gen/build/src/out.rs b/gen/build/src/out.rs
index 0095666..757105c 100644
--- a/gen/build/src/out.rs
+++ b/gen/build/src/out.rs
@@ -157,9 +157,8 @@
     let original = original.as_ref();
     let link = link.as_ref();
 
-    let relative_path = match abstractly_relativize_symlink(original, link) {
-        Some(relative_path) => relative_path,
-        None => return original.to_path_buf(),
+    let Some(relative_path) = abstractly_relativize_symlink(original, link) else {
+        return original.to_path_buf();
     };
 
     // Sometimes "a/b/../c" refers to a different canonical location than "a/c".
diff --git a/gen/lib/src/lib.rs b/gen/lib/src/lib.rs
index d78f8a2..e9e30e9 100644
--- a/gen/lib/src/lib.rs
+++ b/gen/lib/src/lib.rs
@@ -20,7 +20,6 @@
     clippy::inherent_to_string,
     clippy::into_iter_without_iter,
     clippy::items_after_statements,
-    clippy::manual_let_else,
     clippy::match_bool,
     clippy::match_on_vec_items,
     clippy::match_same_arms,
diff --git a/macro/src/lib.rs b/macro/src/lib.rs
index 50c3099..472dbc4 100644
--- a/macro/src/lib.rs
+++ b/macro/src/lib.rs
@@ -9,7 +9,6 @@
     clippy::into_iter_without_iter,
     clippy::items_after_statements,
     clippy::large_enum_variant,
-    clippy::manual_let_else,
     clippy::match_bool,
     clippy::match_same_arms,
     clippy::module_name_repetitions,
diff --git a/syntax/check.rs b/syntax/check.rs
index b5fd45e..39ee0b0 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -555,9 +555,8 @@
         if receiver.mutable {
             return;
         }
-        let resolve = match cx.types.try_resolve(&receiver.ty) {
-            Some(resolve) => resolve,
-            None => return,
+        let Some(resolve) = cx.types.try_resolve(&receiver.ty) else {
+            return;
         };
         if !resolve.generics.lifetimes.is_empty() {
             return;
diff --git a/syntax/parse.rs b/syntax/parse.rs
index 850dcc8..4d266a9 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -436,14 +436,11 @@
 }
 
 fn parse_lang(abi: &Abi) -> Result<Lang> {
-    let name = match &abi.name {
-        Some(name) => name,
-        None => {
-            return Err(Error::new_spanned(
-                abi,
-                "ABI name is required, extern \"C++\" or extern \"Rust\"",
-            ));
-        }
+    let Some(name) = &abi.name else {
+        return Err(Error::new_spanned(
+            abi,
+            "ABI name is required, extern \"C++\" or extern \"Rust\"",
+        ));
     };
 
     match name.value().as_str() {
@@ -1329,16 +1326,12 @@
 fn parse_type_array(ty: &TypeArray) -> Result<Type> {
     let inner = parse_type(&ty.elem)?;
 
-    let len_expr = if let Expr::Lit(lit) = &ty.len {
-        lit
-    } else {
+    let Expr::Lit(len_expr) = &ty.len else {
         let msg = "unsupported expression, array length must be an integer literal";
         return Err(Error::new_spanned(&ty.len, msg));
     };
 
-    let len_token = if let Lit::Int(int) = &len_expr.lit {
-        int.clone()
-    } else {
+    let Lit::Int(len_token) = &len_expr.lit else {
         let msg = "array length must be an integer literal";
         return Err(Error::new_spanned(len_expr, msg));
     };
@@ -1357,7 +1350,7 @@
         inner,
         semi_token,
         len,
-        len_token,
+        len_token: len_token.clone(),
     })))
 }
 
diff --git a/syntax/report.rs b/syntax/report.rs
index 1997182..4cdedd0 100644
--- a/syntax/report.rs
+++ b/syntax/report.rs
@@ -21,9 +21,8 @@
 
     pub(crate) fn propagate(&mut self) -> Result<()> {
         let mut iter = self.errors.drain(..);
-        let mut all_errors = match iter.next() {
-            Some(err) => err,
-            None => return Ok(()),
+        let Some(mut all_errors) = iter.next() else {
+            return Ok(());
         };
         for err in iter {
             all_errors.combine(err);
diff --git a/syntax/types.rs b/syntax/types.rs
index 623a8b8..bc11eb0 100644
--- a/syntax/types.rs
+++ b/syntax/types.rs
@@ -171,9 +171,8 @@
         }
 
         for ty in &all {
-            let impl_key = match ty.impl_key() {
-                Some(impl_key) => impl_key,
-                None => continue,
+            let Some(impl_key) = ty.impl_key() else {
+                continue;
             };
             let implicit_impl = match impl_key {
                 ImplKey::RustBox(ident)