@@ -29,8 +29,10 @@ impl Grammar {
29
29
30
30
fn to_syntax_kinds ( & self ) -> String {
31
31
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 " ) ;
34
36
acc. push_str ( "\n " ) ;
35
37
36
38
let syntax_kinds: Vec < String > = self . keywords
@@ -40,41 +42,49 @@ impl Grammar {
40
42
. chain ( self . nodes . iter ( ) . cloned ( ) )
41
43
. collect ( ) ;
42
44
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 ( ) ;
50
52
}
51
53
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 " ) ;
57
64
for kind in syntax_kinds. iter ( ) {
58
65
let sname = scream ( kind) ;
59
66
write ! (
60
67
acc,
61
- " SyntaxInfo {{ name: \" {sname}\" }},\n " ,
68
+ " {sname} => & SyntaxInfo {{ name: \" {sname}\" }},\n " ,
62
69
sname = sname
63
70
) . unwrap ( ) ;
64
71
}
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 " ) ;
66
78
acc. push_str ( "\n " ) ;
67
79
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
71
81
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 " ) ;
73
83
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 ( ) ;
75
85
}
76
- acc. push_str ( " _ => None,\n " ) ;
77
- acc. push_str ( " }\n " ) ;
86
+ acc. push_str ( " _ => None,\n " ) ;
87
+ acc. push_str ( " }\n " ) ;
78
88
acc. push_str ( "}\n " ) ;
79
89
acc
80
90
}
0 commit comments