1use std::any;
2
3use proc_macro2::{Ident, TokenStream};
4use quote::{format_ident, quote};
5use regex_syntax::hir::{
6 Capture, Class, ClassBytesRange, ClassUnicodeRange, Hir, HirKind, Literal, Look, Repetition,
7};
8
9use crate::codegen::{CodegenItem, Group, Groups};
10use crate::matcher::{Always as A, Or, Then};
11
12pub fn type_name<T>() -> &'static str {
13 any::type_name::<T>()
14 .split('<').next().unwrap()
15 .rsplit("::").next().unwrap()
16}
17
18pub fn type_ident<T>() -> Ident {
19 match ::quote::__private::IdentFragmentAdapter(&type_name::<T>()) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("{}", type_name::<T>())
20}
21
22pub trait HirExtension {
23 fn into_matcher<I: CodegenItem>(self) -> (TokenStream, Vec<Group>);
24}
25
26impl HirExtension for Hir {
27 fn into_matcher<I: CodegenItem>(self) -> (TokenStream, Vec<Group>) {
28 let mut caps = Groups::new();
29 let tokens = self.into_matcher_expr::<I>(&mut caps);
30 (tokens, caps.into_vec())
31 }
32}
33
34pub trait IntoMatcherExpr {
35 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream;
36}
37
38impl IntoMatcherExpr for Hir {
39 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
40 match self.into_kind() {
41 HirKind::Empty => Empty.into_matcher_expr::<I>(caps),
42 HirKind::Literal(lit) => lit.into_matcher_expr::<I>(caps),
43 HirKind::Class(class) => class.into_matcher_expr::<I>(caps),
44 HirKind::Look(look) => look.into_matcher_expr::<I>(caps),
45 HirKind::Repetition(rep) => rep.into_matcher_expr::<I>(caps),
46 HirKind::Capture(cap) => cap.into_matcher_expr::<I>(caps),
47 HirKind::Concat(hirs) => Concat(hirs).into_matcher_expr::<I>(caps),
48 HirKind::Alternation(hirs) => Alternation(hirs).into_matcher_expr::<I>(caps),
49 }
50 }
51}
52
53#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Empty {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f, "Empty")
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for Empty {
#[inline]
fn clone(&self) -> Empty { Empty }
}Clone)]
54struct Empty;
55
56#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Concat {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Concat",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for Concat {
#[inline]
fn clone(&self) -> Concat { Concat(::core::clone::Clone::clone(&self.0)) }
}Clone)]
57struct Concat(pub Vec<Hir>);
58
59#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Alternation {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Alternation",
&&self.0)
}
}Debug, #[automatically_derived]
impl ::core::clone::Clone for Alternation {
#[inline]
fn clone(&self) -> Alternation {
Alternation(::core::clone::Clone::clone(&self.0))
}
}Clone)]
60struct Alternation(pub Vec<Hir>);
61
62impl IntoMatcherExpr for u8 {
63 fn into_matcher_expr<I: CodegenItem>(self, _caps: &mut Groups) -> TokenStream {
64 match (&type_name::<I>(), &type_name::<u8>()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(type_name::<I>(), type_name::<u8>());
65 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Byte");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&self, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::Byte<#self>)
66 }
67}
68
69impl IntoMatcherExpr for &ClassBytesRange {
70 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
71 match (&type_name::<I>(), &type_name::<u8>()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(type_name::<I>(), type_name::<u8>());
72 if self.start() == self.end() {
73 self.start().into_matcher_expr::<I>(caps)
74 } else {
75 let start = self.start();
76 let end = self.end();
77 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ByteRange");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&start, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&end, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::ByteRange<#start, #end>)
78 }
79 }
80}
81
82impl IntoMatcherExpr for char {
83 fn into_matcher_expr<I: CodegenItem>(self, _caps: &mut Groups) -> TokenStream {
84 match (&type_name::<I>(), &type_name::<char>()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::None);
}
}
};assert_eq!(type_name::<I>(), type_name::<char>());
85 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Scalar");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&self, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::Scalar<#self>)
86 }
87}
88
89impl IntoMatcherExpr for &ClassUnicodeRange {
90 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
91 match (&type_name::<I>(), &type_name::<char>()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val, &*right_val,
::core::option::Option::Some(format_args!("{0:?}", self)));
}
}
};assert_eq!(type_name::<I>(), type_name::<char>(), "{:?}", self);
92 if self.start() == self.end() {
93 self.start().into_matcher_expr::<I>(caps)
94 } else {
95 let start = self.start();
96 let end = self.end();
97 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ScalarRange");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&start, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&end, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::ScalarRange<#start, #end>)
98 }
99 }
100}
101
102impl IntoMatcherExpr for Empty {
103 fn into_matcher_expr<I: CodegenItem>(self, _caps: &mut Groups) -> TokenStream {
104 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Always");
_s
}quote!(::ct_regex::internal::matcher::Always)
105 }
106}
107
108impl IntoMatcherExpr for Literal {
109 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
110 write_chunked::<Then<u8, A, A>, I, _>(
111 caps,
112 I::vec_from_str(
113 str::from_utf8(&self.0)
114 .expect("failed to convert bytes to valid unicode")
115 )
116 )
117 }
118}
119
120impl IntoMatcherExpr for Class {
121 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
122 match I::normalize_class(self) {
123 Class::Unicode(unicode) => write_chunked::<Or<u8, A, A>, I, _>(
124 caps,
125 unicode.ranges().iter().collect()
126 ),
127 Class::Bytes(bytes) => write_chunked::<Or<u8, A, A>, I, _>(
128 caps,
129 bytes.ranges().iter().collect()
130 ),
131 }
132 }
133}
134
135impl IntoMatcherExpr for Look {
136 fn into_matcher_expr<I: CodegenItem>(self, _caps: &mut Groups) -> TokenStream {
137 match self {
138 Look::Start => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Start");
_s
}quote!(::ct_regex::internal::matcher::Start),
139 Look::End => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "End");
_s
}quote!(::ct_regex::internal::matcher::End),
140 Look::StartLF => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "LineStart");
_s
}quote!(::ct_regex::internal::matcher::LineStart),
141 Look::EndLF => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "LineEnd");
_s
}quote!(::ct_regex::internal::matcher::LineEnd),
142 Look::StartCRLF => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "CRLFStart");
_s
}quote!(::ct_regex::internal::matcher::CRLFStart),
143 Look::EndCRLF => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "CRLFEnd");
_s
}quote!(::ct_regex::internal::matcher::CRLFEnd),
144 _ => {
::core::panicking::panic_fmt(format_args!("not implemented: {0}",
format_args!("complex look arounds")));
}unimplemented!("complex look arounds"),
145 }
146 }
147}
148
149impl IntoMatcherExpr for Repetition {
150 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
151 let Repetition { min, max, greedy, sub } = self;
152
153 let required = caps.required;
154 if min == 0 {
155 caps.required = false;
156 }
157
158 let item_type = type_ident::<I>();
159 let sub_matcher = sub.into_matcher_expr::<I>(caps);
160 let (min, max) = (min as usize, max.map(|m| m as usize));
164
165 if min == 0 {
166 caps.required = required;
167 }
168
169 let tokens = match max {
170 None => {
171 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QuantifierNOrMore");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&sub_matcher, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&min, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::QuantifierNOrMore<#item_type, #sub_matcher, #min>)
172 },
173 Some(max) if min == max => {
174 return {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QuantifierN");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&sub_matcher, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&min, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::QuantifierN<#item_type, #sub_matcher, #min>);
175 },
176 Some(max) => {
177 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "QuantifierNToM");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&sub_matcher, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&min, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&max, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::QuantifierNToM<#item_type, #sub_matcher, #min, #max>)
178 },
179 };
180
181 if greedy {
182 tokens
183 } else {
184 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Lazy");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&tokens, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::Lazy<#item_type, #tokens>)
185 }
186 }
187}
188
189impl IntoMatcherExpr for Capture {
190 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
191 caps.insert(self.index, self.name);
192 let item_type = type_ident::<I>();
193 let sub_matcher = self.sub.into_matcher_expr::<I>(caps);
194 let index = self.index as usize;
195
196 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "CaptureGroup");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&sub_matcher, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&index, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::CaptureGroup<#item_type, #sub_matcher, #index>)
197 }
198}
199
200impl IntoMatcherExpr for Alternation {
201 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
202 let required = caps.required;
203 caps.required = false;
204 let tokens = write_chunked::<Or<u8, A, A>, I, _>(caps, self.0);
205 caps.required = required;
206 tokens
207 }
208}
209
210impl IntoMatcherExpr for Concat {
211 fn into_matcher_expr<I: CodegenItem>(self, caps: &mut Groups) -> TokenStream {
212 write_chunked::<Then<u8, A, A>, I, _>(caps, self.0)
213 }
214}
215
216fn write_chunked<T, I: CodegenItem, W: IntoMatcherExpr>(
217 caps: &mut Groups,
218 mut items: Vec<W>,
219) -> TokenStream {
220 let n = items.len();
221 let base = match ::quote::__private::IdentFragmentAdapter(&type_name::<T>()) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", arg))
}), ::quote::__private::Option::None.or(arg.span())),
}format_ident!("{}", type_name::<T>());
222 let item_type = type_ident::<I>();
223
224 match n {
225 0 => { ::core::panicking::panic_fmt(format_args!("literal contains no items")); }panic!("literal contains no items"),
226 1 => items.pop().unwrap().into_matcher_expr::<I>(caps),
227 2 => {
228 let mut iter = items.into_iter();
229 let first = iter.next().unwrap().into_matcher_expr::<I>(caps);
230 let second = iter.next().unwrap().into_matcher_expr::<I>(caps);
231
232 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&base, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&first, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&second, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::#base<#item_type, #first, #second>)
233 },
234 3 => {
235 let mut iter = items.into_iter();
236 let first = iter.next().unwrap().into_matcher_expr::<I>(caps);
237 let chunked = write_chunked::<T, I, W>(caps, iter.collect());
238
239 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&base, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&first, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&chunked, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::#base<#item_type, #first, #chunked>)
240 },
241 4 | 8 | 16 => write_n_items::<T, I, W>(caps, items, n),
242 _ => {
243 let chunk_size = if n > 16 {
245 16
246 } else if n > 8 {
247 8
248 } else {
249 4
250 };
251 let remainder = items.split_off(chunk_size);
252 let n_matcher = write_n_items::<T, I, W>(caps, items, chunk_size);
253 let chunked = write_chunked::<T, I, W>(caps, remainder);
254
255 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&base, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&n_matcher, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&chunked, &mut _s);
::quote::__private::push_gt(&mut _s);
_s
}quote!(::ct_regex::internal::matcher::#base<#item_type, #n_matcher, #chunked>)
256 },
257 }
258}
259
260fn write_n_items<T, I: CodegenItem, W: IntoMatcherExpr>(
261 caps: &mut Groups,
262 items: Vec<W>,
263 n: usize,
264) -> TokenStream {
265 let name = match ::quote::__private::IdentFragmentAdapter(&type_name::<T>()) {
arg =>
match ::quote::__private::IdentFragmentAdapter(&n) {
arg =>
::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}{1}", arg, arg))
}),
::quote::__private::Option::None.or(arg.span()).or(arg.span())),
},
}format_ident!("{}{}", type_name::<T>(), n);
266 let item_type = type_ident::<I>();
267
268 let mut tokens = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ct_regex");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "matcher");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&name, &mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&item_type, &mut _s);
_s
}quote!(::ct_regex::internal::matcher::#name<#item_type);
269
270 for item in items {
271 tokens.extend({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_comma(&mut _s);
_s
}quote!(,));
272 tokens.extend(item.into_matcher_expr::<I>(caps));
273 }
274
275 tokens.extend({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_gt(&mut _s);
_s
}quote!(>));
276 tokens
277}