@@ -29,8 +29,10 @@ impl Grammar {
2929
3030 fn to_syntax_kinds ( & self ) -> String {
3131 let mut acc = String :: new ( ) ;
32- acc. push_str ( "// Generated from grammar.ron\n " ) ;
33- acc. push_str ( "use tree::{SyntaxKind, SyntaxInfo};\n " ) ;
32+ acc. push_str ( "#![allow(bad_style, missing_docs, unreachable_pub)]\n " ) ;
33+ acc. push_str ( "#![cfg_attr(rustfmt, rustfmt_skip)]\n " ) ;
34+ acc. push_str ( "//! Generated from grammar.ron\n " ) ;
35+ acc. push_str ( "use tree::SyntaxInfo;\n " ) ;
3436 acc. push_str ( "\n " ) ;
3537
3638 let syntax_kinds: Vec < String > = self . keywords
@@ -40,41 +42,49 @@ impl Grammar {
4042 . chain ( self . nodes . iter ( ) . cloned ( ) )
4143 . collect ( ) ;
4244
43- for ( idx , kind ) in syntax_kinds . iter ( ) . enumerate ( ) {
44- let sname = scream ( kind ) ;
45- write ! (
46- acc,
47- "pub const {}: SyntaxKind = SyntaxKind({}); \n " ,
48- sname , idx
49- ) . unwrap ( ) ;
45+ // enum SyntaxKind
46+ acc . push_str ( "/// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT_DEF`. \n " ) ;
47+ acc . push_str ( "#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] \n " ) ;
48+ acc. push_str ( "#[repr(u32)] \n " ) ;
49+ acc . push_str ( "pub enum SyntaxKind { \n " ) ;
50+ for kind in syntax_kinds . iter ( ) {
51+ write ! ( acc , " {}, \n " , scream ( kind ) ) . unwrap ( ) ;
5052 }
5153 acc. push_str ( "\n " ) ;
52- write ! (
53- acc,
54- "static INFOS: [SyntaxInfo; {}] = [\n " ,
55- syntax_kinds. len( )
56- ) . unwrap ( ) ;
54+ acc. push_str ( " TOMBSTONE = !0 - 1,\n " ) ;
55+ acc. push_str ( " EOF = !0,\n " ) ;
56+ acc. push_str ( "}\n " ) ;
57+ acc. push_str ( "pub(crate) use self::SyntaxKind::*;\n " ) ;
58+ acc. push_str ( "\n " ) ;
59+
60+ // fn info
61+ acc. push_str ( "impl SyntaxKind {\n " ) ;
62+ acc. push_str ( " pub(crate) fn info(self) -> &'static SyntaxInfo {\n " ) ;
63+ acc. push_str ( " match self {\n " ) ;
5764 for kind in syntax_kinds. iter ( ) {
5865 let sname = scream ( kind) ;
5966 write ! (
6067 acc,
61- " SyntaxInfo {{ name: \" {sname}\" }},\n " ,
68+ " {sname} => & SyntaxInfo {{ name: \" {sname}\" }},\n " ,
6269 sname = sname
6370 ) . unwrap ( ) ;
6471 }
65- acc. push_str ( "];\n " ) ;
72+ acc. push_str ( "\n " ) ;
73+ acc. push_str ( " TOMBSTONE => &SyntaxInfo { name: \" TOMBSTONE\" },\n " ) ;
74+ acc. push_str ( " EOF => &SyntaxInfo { name: \" EOF\" },\n " ) ;
75+ acc. push_str ( " }\n " ) ;
76+ acc. push_str ( " }\n " ) ;
77+ acc. push_str ( "}\n " ) ;
6678 acc. push_str ( "\n " ) ;
6779
68- acc. push_str ( "pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo {\n " ) ;
69- acc. push_str ( " &INFOS[kind.0 as usize]\n " ) ;
70- acc. push_str ( "}\n \n " ) ;
80+ // fn ident_to_keyword
7181 acc. push_str ( "pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {\n " ) ;
72- acc. push_str ( " match ident {\n " ) ;
82+ acc. push_str ( " match ident {\n " ) ;
7383 for kw in self . keywords . iter ( ) {
74- write ! ( acc, " {:?} => Some({}),\n " , kw, kw_token( kw) ) . unwrap ( ) ;
84+ write ! ( acc, " {:?} => Some({}),\n " , kw, kw_token( kw) ) . unwrap ( ) ;
7585 }
76- acc. push_str ( " _ => None,\n " ) ;
77- acc. push_str ( " }\n " ) ;
86+ acc. push_str ( " _ => None,\n " ) ;
87+ acc. push_str ( " }\n " ) ;
7888 acc. push_str ( "}\n " ) ;
7989 acc
8090 }
0 commit comments