1 //! Defines input for code generation process. 2 3 pub(crate) struct KindsSrc<'a> { 4 pub(crate) punct: &'a [(&'a str, &'a str)], 5 pub(crate) keywords: &'a [&'a str], 6 pub(crate) contextual_keywords: &'a [&'a str], 7 pub(crate) literals: &'a [&'a str], 8 pub(crate) tokens: &'a [&'a str], 9 pub(crate) nodes: &'a [&'a str], 10 } 11 12 pub(crate) const KINDS_SRC: KindsSrc = KindsSrc { 13 punct: &[ 14 (";", "SEMICOLON"), 15 (",", "COMMA"), 16 ("(", "L_PAREN"), 17 (")", "R_PAREN"), 18 ("{", "L_CURLY"), 19 ("}", "R_CURLY"), 20 ("[", "L_BRACK"), 21 ("]", "R_BRACK"), 22 ("<", "L_ANGLE"), 23 (">", "R_ANGLE"), 24 ("@", "AT"), 25 ("#", "POUND"), 26 ("~", "TILDE"), 27 ("?", "QUESTION"), 28 ("$", "DOLLAR"), 29 ("&", "AMP"), 30 ("|", "PIPE"), 31 ("+", "PLUS"), 32 ("*", "STAR"), 33 ("/", "SLASH"), 34 ("^", "CARET"), 35 ("%", "PERCENT"), 36 ("_", "UNDERSCORE"), 37 (".", "DOT"), 38 ("..", "DOT2"), 39 ("...", "DOT3"), 40 ("..=", "DOT2EQ"), 41 (":", "COLON"), 42 ("::", "COLON2"), 43 ("=", "EQ"), 44 ("==", "EQ2"), 45 ("=>", "FAT_ARROW"), 46 ("!", "BANG"), 47 ("!=", "NEQ"), 48 ("-", "MINUS"), 49 ("->", "THIN_ARROW"), 50 ("<=", "LTEQ"), 51 (">=", "GTEQ"), 52 ("+=", "PLUSEQ"), 53 ("-=", "MINUSEQ"), 54 ("|=", "PIPEEQ"), 55 ("&=", "AMPEQ"), 56 ("^=", "CARETEQ"), 57 ("/=", "SLASHEQ"), 58 ("*=", "STAREQ"), 59 ("%=", "PERCENTEQ"), 60 ("&&", "AMP2"), 61 ("||", "PIPE2"), 62 ("<<", "SHL"), 63 (">>", "SHR"), 64 ("<<=", "SHLEQ"), 65 (">>=", "SHREQ"), 66 ], 67 keywords: &[ 68 "as", "async", "await", "box", "break", "const", "continue", "crate", "dyn", "else", 69 "enum", "extern", "false", "fn", "for", "if", "impl", "in", "let", "loop", "macro", 70 "match", "mod", "move", "mut", "pub", "ref", "return", "self", "static", "struct", "super", 71 "trait", "true", "try", "type", "unsafe", "use", "where", "while", "yield", 72 ], 73 contextual_keywords: &["auto", "default", "existential", "union", "raw", "macro_rules"], 74 literals: &["INT_NUMBER", "FLOAT_NUMBER", "CHAR", "BYTE", "STRING", "BYTE_STRING"], 75 tokens: &["ERROR", "IDENT", "WHITESPACE", "LIFETIME_IDENT", "COMMENT", "SHEBANG"], 76 nodes: &[ 77 "SOURCE_FILE", 78 "STRUCT", 79 "UNION", 80 "ENUM", 81 "FN", 82 "RET_TYPE", 83 "EXTERN_CRATE", 84 "MODULE", 85 "USE", 86 "STATIC", 87 "CONST", 88 "TRAIT", 89 "IMPL", 90 "TYPE_ALIAS", 91 "MACRO_CALL", 92 "MACRO_RULES", 93 "MACRO_ARM", 94 "TOKEN_TREE", 95 "MACRO_DEF", 96 "PAREN_TYPE", 97 "TUPLE_TYPE", 98 "MACRO_TYPE", 99 "NEVER_TYPE", 100 "PATH_TYPE", 101 "PTR_TYPE", 102 "ARRAY_TYPE", 103 "SLICE_TYPE", 104 "REF_TYPE", 105 "INFER_TYPE", 106 "FN_PTR_TYPE", 107 "FOR_TYPE", 108 "IMPL_TRAIT_TYPE", 109 "DYN_TRAIT_TYPE", 110 "OR_PAT", 111 "PAREN_PAT", 112 "REF_PAT", 113 "BOX_PAT", 114 "IDENT_PAT", 115 "WILDCARD_PAT", 116 "REST_PAT", 117 "PATH_PAT", 118 "RECORD_PAT", 119 "RECORD_PAT_FIELD_LIST", 120 "RECORD_PAT_FIELD", 121 "TUPLE_STRUCT_PAT", 122 "TUPLE_PAT", 123 "SLICE_PAT", 124 "RANGE_PAT", 125 "LITERAL_PAT", 126 "MACRO_PAT", 127 "CONST_BLOCK_PAT", 128 // atoms 129 "TUPLE_EXPR", 130 "ARRAY_EXPR", 131 "PAREN_EXPR", 132 "PATH_EXPR", 133 "CLOSURE_EXPR", 134 "IF_EXPR", 135 "WHILE_EXPR", 136 "CONDITION", 137 "LOOP_EXPR", 138 "FOR_EXPR", 139 "CONTINUE_EXPR", 140 "BREAK_EXPR", 141 "LABEL", 142 "BLOCK_EXPR", 143 "STMT_LIST", 144 "RETURN_EXPR", 145 "YIELD_EXPR", 146 "MATCH_EXPR", 147 "MATCH_ARM_LIST", 148 "MATCH_ARM", 149 "MATCH_GUARD", 150 "RECORD_EXPR", 151 "RECORD_EXPR_FIELD_LIST", 152 "RECORD_EXPR_FIELD", 153 "BOX_EXPR", 154 // postfix 155 "CALL_EXPR", 156 "INDEX_EXPR", 157 "METHOD_CALL_EXPR", 158 "FIELD_EXPR", 159 "AWAIT_EXPR", 160 "TRY_EXPR", 161 "CAST_EXPR", 162 // unary 163 "REF_EXPR", 164 "PREFIX_EXPR", 165 "RANGE_EXPR", // just weird 166 "BIN_EXPR", 167 "EXTERN_BLOCK", 168 "EXTERN_ITEM_LIST", 169 "VARIANT", 170 "RECORD_FIELD_LIST", 171 "RECORD_FIELD", 172 "TUPLE_FIELD_LIST", 173 "TUPLE_FIELD", 174 "VARIANT_LIST", 175 "ITEM_LIST", 176 "ASSOC_ITEM_LIST", 177 "ATTR", 178 "META", 179 "USE_TREE", 180 "USE_TREE_LIST", 181 "PATH", 182 "PATH_SEGMENT", 183 "LITERAL", 184 "RENAME", 185 "VISIBILITY", 186 "WHERE_CLAUSE", 187 "WHERE_PRED", 188 "ABI", 189 "NAME", 190 "NAME_REF", 191 "LET_STMT", 192 "LET_ELSE", 193 "EXPR_STMT", 194 "GENERIC_PARAM_LIST", 195 "GENERIC_PARAM", 196 "LIFETIME_PARAM", 197 "TYPE_PARAM", 198 "CONST_PARAM", 199 "GENERIC_ARG_LIST", 200 "LIFETIME", 201 "LIFETIME_ARG", 202 "TYPE_ARG", 203 "ASSOC_TYPE_ARG", 204 "CONST_ARG", 205 "PARAM_LIST", 206 "PARAM", 207 "SELF_PARAM", 208 "ARG_LIST", 209 "TYPE_BOUND", 210 "TYPE_BOUND_LIST", 211 // macro related 212 "MACRO_ITEMS", 213 "MACRO_STMTS", 214 ], 215 }; 216 217 #[derive(Default, Debug)] 218 pub(crate) struct AstSrc { 219 pub(crate) tokens: Vec<String>, 220 pub(crate) nodes: Vec<AstNodeSrc>, 221 pub(crate) enums: Vec<AstEnumSrc>, 222 } 223 224 #[derive(Debug)] 225 pub(crate) struct AstNodeSrc { 226 pub(crate) doc: Vec<String>, 227 pub(crate) name: String, 228 pub(crate) traits: Vec<String>, 229 pub(crate) fields: Vec<Field>, 230 } 231 232 #[derive(Debug, Eq, PartialEq)] 233 pub(crate) enum Field { 234 Token(String), 235 Node { name: String, ty: String, cardinality: Cardinality }, 236 } 237 238 #[derive(Debug, Eq, PartialEq)] 239 pub(crate) enum Cardinality { 240 Optional, 241 Many, 242 } 243 244 #[derive(Debug)] 245 pub(crate) struct AstEnumSrc { 246 pub(crate) doc: Vec<String>, 247 pub(crate) name: String, 248 pub(crate) traits: Vec<String>, 249 pub(crate) variants: Vec<String>, 250 } 251