1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//! Token derive support definitions

/// Information about a known token
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(rserde::Serialize))]
#[cfg_attr(feature = "serde", serde(crate = "rserde"))]
pub struct TokenDescriptor {
    /// Variant name
    pub variant_name: &'static str,

    /// Parser token name
    pub parser_token: &'static str,

    /// List of kinds this token belongs to
    pub kinds: &'static [&'static str],
}

impl TokenDescriptor {
    /// Create a new token descriptor
    pub const fn new(
        variant_name: &'static str,
        parser_token: &'static str,
        kinds: &'static [&'static str],
    ) -> Self {
        Self {
            variant_name,
            parser_token,
            kinds,
        }
    }
}

/// Trait to implement for a token to be used with `lang_util`'s infrastructure
pub trait Token: std::fmt::Display {
    /// Return the variant name of the current token
    fn variant_name(&self) -> &'static str;

    /// Return the name used by the lalrpop parser for this token
    fn parser_token(&self) -> &'static str;

    /// Return the token kinds this token belongs to
    fn kinds(&self) -> &'static [&'static str];

    /// Return the descriptions for all known tokens
    fn all_tokens() -> &'static [TokenDescriptor];
}