about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOli Scherer <github333195615777966@oli-obk.de>2025-02-27 09:46:46 +0000
committerOli Scherer <github333195615777966@oli-obk.de>2025-04-28 07:36:59 +0000
commit6338e364f007a0fe4b0bf7dfb425000890336d8a (patch)
tree6f6d52df56ed667e2fda352d90c164e406ac64f2
parent96918a4bd574539974e05985c1c53cbcf0c69b50 (diff)
downloadrust-6338e364f007a0fe4b0bf7dfb425000890336d8a.tar.gz
rust-6338e364f007a0fe4b0bf7dfb425000890336d8a.zip
Pull ast pattern type parsing out into a separate function
-rw-r--r--compiler/rustc_builtin_macros/src/pattern_type.rs28
1 files changed, 19 insertions, 9 deletions
diff --git a/compiler/rustc_builtin_macros/src/pattern_type.rs b/compiler/rustc_builtin_macros/src/pattern_type.rs
index a0b84c4ccf5..e9d66693912 100644
--- a/compiler/rustc_builtin_macros/src/pattern_type.rs
+++ b/compiler/rustc_builtin_macros/src/pattern_type.rs
@@ -26,9 +26,27 @@ fn parse_pat_ty<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P
 
     let ty = parser.parse_ty()?;
     parser.expect_keyword(exp!(Is))?;
+
+    let start = parser.token.span;
     let pat = parser.parse_pat_no_top_alt(None, None)?.into_inner();
+    let kind = pat_to_ty_pat(cx, pat);
+
+    let span = start.to(parser.token.span);
+    let pat = ty_pat(kind, span);
+
+    if parser.token != token::Eof {
+        parser.unexpected()?;
+    }
+
+    Ok((ty, pat))
+}
 
-    let kind = match pat.kind {
+fn ty_pat(kind: TyPatKind, span: Span) -> P<TyPat> {
+    P(TyPat { id: DUMMY_NODE_ID, kind, span, tokens: None })
+}
+
+fn pat_to_ty_pat(cx: &mut ExtCtxt<'_>, pat: ast::Pat) -> TyPatKind {
+    match pat.kind {
         ast::PatKind::Range(start, end, include_end) => TyPatKind::Range(
             start.map(|value| P(AnonConst { id: DUMMY_NODE_ID, value })),
             end.map(|value| P(AnonConst { id: DUMMY_NODE_ID, value })),
@@ -36,13 +54,5 @@ fn parse_pat_ty<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P
         ),
         ast::PatKind::Err(guar) => TyPatKind::Err(guar),
         _ => TyPatKind::Err(cx.dcx().span_err(pat.span, "pattern not supported in pattern types")),
-    };
-
-    let pat = P(TyPat { id: pat.id, kind, span: pat.span, tokens: pat.tokens });
-
-    if parser.token != token::Eof {
-        parser.unexpected()?;
     }
-
-    Ok((ty, pat))
 }