1use proc_macro::TokenTree;
2
3use crate::TokenTreeExt as _;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
16pub enum TokenKind {
17 Group,
19 Ident,
21 Punct,
23 Literal,
25}
26
27impl TokenKind {
28 #[must_use]
32 pub fn is_group(&self) -> bool {
33 matches!(self, Self::Group)
34 }
35
36 #[must_use]
40 pub fn is_ident(&self) -> bool {
41 matches!(self, Self::Ident)
42 }
43
44 #[must_use]
48 pub fn is_punct(&self) -> bool {
49 matches!(self, Self::Punct)
50 }
51
52 #[must_use]
56 pub fn is_literal(&self) -> bool {
57 matches!(self, Self::Literal)
58 }
59}
60
61impl PartialEq<TokenTree> for TokenKind {
62 fn eq(&self, other: &TokenTree) -> bool {
63 *self == other.kind()
64 }
65}
66impl PartialEq<TokenKind> for TokenTree {
67 fn eq(&self, other: &TokenKind) -> bool {
68 self.kind() == *other
69 }
70}
71
72impl From<&TokenTree> for TokenKind {
73 fn from(tt: &TokenTree) -> Self {
74 match tt {
75 TokenTree::Group(_) => Self::Group,
76 TokenTree::Ident(_) => Self::Ident,
77 TokenTree::Punct(_) => Self::Punct,
78 TokenTree::Literal(_) => Self::Literal,
79 }
80 }
81}
82impl From<TokenTree> for TokenKind {
83 fn from(tt: TokenTree) -> Self {
84 Self::from(&tt)
85 }
86}