#![allow(bad_style, missing_docs, unreachable_pub)] #![cfg_attr(rustfmt, rustfmt_skip)] use super::SyntaxInfo; /// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT_DEF`. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum SyntaxKind { // Technical SyntaxKinds: they appear temporally during parsing, // but never end up in the final tree #[doc(hidden)] TOMBSTONE, #[doc(hidden)] EOF, {%- for t in concat(a=single_byte_tokens, b=multi_byte_tokens) %} {{t.1}}, {%- endfor -%} {% for kw in concat(a=keywords, b=contextual_keywords) %} {{kw | upper}}_KW, {%- endfor -%} {% for t in concat(a=tokens, b=nodes) %} {{t}}, {%- endfor %} } use self::SyntaxKind::*; impl SyntaxKind { pub fn is_keyword(self) -> bool { match self { {%- for kw in concat(a=keywords, b=contextual_keywords) %} | {{kw | upper}}_KW {%- endfor %} => true, _ => false } } pub(crate) fn info(self) -> &'static SyntaxInfo { match self { {%- for t in concat(a=single_byte_tokens, b=multi_byte_tokens) %} {{t.1}} => &SyntaxInfo { name: "{{t.1}}" }, {%- endfor -%} {% for kw in concat(a=keywords, b=contextual_keywords) %} {{kw | upper}}_KW => &SyntaxInfo { name: "{{kw | upper}}_KW" }, {%- endfor -%} {% for t in concat(a=tokens, b=nodes) %} {{t}} => &SyntaxInfo { name: "{{t}}" }, {%- endfor %} TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" }, EOF => &SyntaxInfo { name: "EOF" }, } } pub(crate) fn from_keyword(ident: &str) -> Option { let kw = match ident { {%- for kw in keywords %} "{{kw}}" => {{kw | upper}}_KW, {%- endfor %} _ => return None, }; Some(kw) } pub(crate) fn from_char(c: char) -> Option { let tok = match c { {%- for t in single_byte_tokens %} '{{t.0}}' => {{t.1}}, {%- endfor %} _ => return None, }; Some(tok) } }