git.delta.rocks / jrsonnet / refs/commits / 5ad3c0601af8

difftreelog

refactor use grammar to classify tokens

Yaroslav Bolyukin2022-06-20parent: #dfc47a6.patch.diff
in: master

13 files changed

modifiedcmds/jrsonnet-fmt/src/main.rsdiffbeforeafterboth
--- a/cmds/jrsonnet-fmt/src/main.rs
+++ b/cmds/jrsonnet-fmt/src/main.rs
@@ -5,7 +5,7 @@
 	nodes::{
 		ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart,
 		DestructRest, Expr, Field, FieldName, ForSpec, IfSpec, ImportKind, LhsExpr, Literal,
-		Member, Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, String,
+		Member, Name, Number, ObjBody, ObjLocal, ParamsDesc, SliceDesc, SourceFile, Text,
 		UnaryOperator,
 	},
 	AstToken, SyntaxToken,
@@ -91,7 +91,7 @@
 	}
 }
 
-impl Printable for String {
+impl Printable for Text {
 	fn print(&self) -> PrintItems {
 		p!(new: str(&format!("{}", self)))
 	}
@@ -168,7 +168,7 @@
 			FieldName::FieldNameFixed(f) => {
 				if let Some(id) = f.id() {
 					p!(new: {id})
-				} else if let Some(str) = f.string() {
+				} else if let Some(str) = f.text() {
 					p!(new: {str})
 				} else {
 					p!(new: str("/*missing FieldName*/"))
@@ -371,7 +371,7 @@
 			Expr::ExprIntrinsicThisFile(_) => p!(new: str("$intrinsicThisFile")),
 			Expr::ExprIntrinsicId(_) => p!(new: str("$intrinsicId")),
 			Expr::ExprIntrinsic(i) => p!(new: str("$intrinsic(") {i.name()} str(")")),
-			Expr::ExprString(s) => p!(new: {s.string()}),
+			Expr::ExprString(s) => p!(new: {s.text()}),
 			Expr::ExprNumber(n) => p!(new: {n.number()}),
 			Expr::ExprArray(a) => {
 				let mut pi = p!(new: str("[") >i nl);
@@ -393,7 +393,7 @@
 				pi
 			}
 			Expr::ExprImport(v) => {
-				p!(new: {v.import_kind()} str(" ") {v.string()})
+				p!(new: {v.import_kind()} str(" ") {v.text()})
 			}
 			Expr::ExprVar(n) => p!(new: {n.name()}),
 			Expr::ExprLocal(l) => {
modifiedcrates/jrsonnet-rowan-parser/jsonnet.ungramdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/jsonnet.ungram
+++ b/crates/jrsonnet-rowan-parser/jsonnet.ungram
@@ -48,7 +48,7 @@
     name:Name
     ')'
 ExprString =
-    String
+    Text
 ExprNumber =
     Number
 ExprArray =
@@ -67,7 +67,7 @@
     ']'
 
 ExprImport =
-    ImportKind String
+    ImportKind Text
 
 ImportKind =
     'importstr'
@@ -217,7 +217,7 @@
 
 FieldNameFixed =
     id:Name
-|   String
+|   Text
 FieldNameDynamic =
     '['
     Expr
@@ -239,16 +239,27 @@
 |   '$'
 |   'super'
 
-String =
+Text =
     'LIT_STRING_DOUBLE!'
+|   'ERROR_STRING_DOUBLE_UNTERMINATED!'
 |   'LIT_STRING_SINGLE!'
+|   'ERROR_STRING_SINGLE_UNTERMINATED!'
 |   'LIT_STRING_DOUBLE_VERBATIM!'
+|   'ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED!'
 |   'LIT_STRING_SINGLE_VERBATIM!'
+|   'ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED!'
+|   'ERROR_STRING_VERBATIM_MISSING_QUOTES!'
 |   'LIT_STRING_BLOCK!'
+|   'ERROR_STRING_BLOCK_UNEXPECTED_END!'
+|   'ERROR_STRING_BLOCK_MISSING_NEW_LINE!'
+|   'ERROR_STRING_BLOCK_MISSING_TERMINATION!'
+|   'ERROR_STRING_BLOCK_MISSING_INDENT!'
 
 Number =
     'LIT_FLOAT!'
-|   'META_FORCE_ENUM!'
+|   'ERROR_FLOAT_JUNK_AFTER_POINT!'
+|   'ERROR_FLOAT_JUNK_AFTER_EXPONENT!'
+|   'ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN!'
 
 ForSpec =
     'for'
@@ -347,3 +358,12 @@
 TrueExpr=Expr
 FalseExpr=Expr
 LhsExpr=Expr
+
+// Trivia - tokens which will be implicitly skipped for parser
+Trivia =
+    'LIT_WHITESPACE!'
+|   'LIT_MULTI_LINE_COMMENT!'
+|   'ERROR_COMMENT_TOO_SHORT!'
+|   'ERROR_COMMENT_UNTERMINATED!'
+|   'LIT_SINGLE_LINE_HASH_COMMENT!'
+|   'LIT_SINGLE_LINE_SLASH_COMMENT!'
deletedcrates/jrsonnet-rowan-parser/src/classify.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/classify.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-use crate::SyntaxKind;
-
-impl SyntaxKind {
-	pub fn is_trivia(self) -> bool {
-		matches!(
-			self,
-			Self::WHITESPACE
-				| Self::MULTI_LINE_COMMENT
-				| Self::ERROR_COMMENT_TOO_SHORT
-				| Self::ERROR_COMMENT_UNTERMINATED
-				| Self::SINGLE_LINE_HASH_COMMENT
-				| Self::SINGLE_LINE_SLASH_COMMENT
-		)
-	}
-	pub fn is_string(self) -> bool {
-		matches!(
-			self,
-			Self::STRING_SINGLE
-				| Self::ERROR_STRING_SINGLE_UNTERMINATED
-				| Self::STRING_DOUBLE
-				| Self::ERROR_STRING_DOUBLE_UNTERMINATED
-				| Self::STRING_SINGLE_VERBATIM
-				| Self::ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED
-				| Self::STRING_DOUBLE_VERBATIM
-				| Self::ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED
-				| Self::STRING_BLOCK
-				| Self::ERROR_STRING_BLOCK_UNEXPECTED_END
-				| Self::ERROR_STRING_BLOCK_MISSING_NEW_LINE
-				| Self::ERROR_STRING_BLOCK_MISSING_TERMINATION
-				| Self::ERROR_STRING_BLOCK_MISSING_INDENT
-		)
-	}
-	pub fn is_number(self) -> bool {
-		matches!(
-			self,
-			Self::FLOAT
-				| Self::ERROR_FLOAT_JUNK_AFTER_POINT
-				| Self::ERROR_FLOAT_JUNK_AFTER_EXPONENT
-				| Self::ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN
-		)
-	}
-	pub fn is_literal(self) -> bool {
-		matches!(
-			self,
-			Self::NULL_KW
-				| Self::TRUE_KW | Self::FALSE_KW
-				| Self::SELF_KW | Self::DOLLAR
-				| Self::SUPER_KW
-		)
-	}
-}
modifiedcrates/jrsonnet-rowan-parser/src/event.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/event.rs
+++ b/crates/jrsonnet-rowan-parser/src/event.rs
@@ -4,8 +4,9 @@
 
 use crate::{
 	lex::Lexeme,
+	nodes::Trivia,
 	parser::{Parse, SyntaxError},
-	JsonnetLanguage, SyntaxKind,
+	AstToken, JsonnetLanguage, SyntaxKind,
 };
 
 #[derive(Clone, Debug, PartialEq, Eq)]
@@ -144,7 +145,7 @@
 	}
 	fn skip_whitespace(&mut self) {
 		while let Some(lexeme) = self.lexemes.get(self.offset) {
-			if !lexeme.kind.is_trivia() {
+			if !Trivia::can_cast(lexeme.kind) {
 				break;
 			}
 
modifiedcrates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth
before · crates/jrsonnet-rowan-parser/src/generated/nodes.rs
1//! This is a generated file, please do not edit manually. Changes can be2//! made in codegeneration that lives in `xtask` top-level dir.34#![allow(non_snake_case, clippy::match_like_matches_macro)]5use crate::{6	ast::{support, AstChildren, AstNode, AstToken},7	SyntaxKind::{self, *},8	SyntaxNode, SyntaxToken, T,9};1011#[derive(Debug, Clone, PartialEq, Eq, Hash)]12pub struct SourceFile {13	pub(crate) syntax: SyntaxNode,14}15impl SourceFile {16	pub fn expr(&self) -> Option<Expr> {17		support::child(&self.syntax)18	}19}2021#[derive(Debug, Clone, PartialEq, Eq, Hash)]22pub struct ExprBinary {23	pub(crate) syntax: SyntaxNode,24}25impl ExprBinary {26	pub fn lhs(&self) -> Option<LhsExpr> {27		support::child(&self.syntax)28	}29	pub fn binary_operator(&self) -> Option<BinaryOperator> {30		support::token_child(&self.syntax)31	}32	pub fn rhs(&self) -> Option<Expr> {33		support::child(&self.syntax)34	}35}3637#[derive(Debug, Clone, PartialEq, Eq, Hash)]38pub struct LhsExpr {39	pub(crate) syntax: SyntaxNode,40}41impl LhsExpr {42	pub fn expr(&self) -> Option<Expr> {43		support::child(&self.syntax)44	}45}4647#[derive(Debug, Clone, PartialEq, Eq, Hash)]48pub struct ExprUnary {49	pub(crate) syntax: SyntaxNode,50}51impl ExprUnary {52	pub fn unary_operator(&self) -> Option<UnaryOperator> {53		support::token_child(&self.syntax)54	}55	pub fn rhs(&self) -> Option<Expr> {56		support::child(&self.syntax)57	}58}5960#[derive(Debug, Clone, PartialEq, Eq, Hash)]61pub struct ExprSlice {62	pub(crate) syntax: SyntaxNode,63}64impl ExprSlice {65	pub fn expr(&self) -> Option<Expr> {66		support::child(&self.syntax)67	}68	pub fn slice_desc(&self) -> Option<SliceDesc> {69		support::child(&self.syntax)70	}71}7273#[derive(Debug, Clone, PartialEq, Eq, Hash)]74pub struct SliceDesc {75	pub(crate) syntax: SyntaxNode,76}77impl SliceDesc {78	pub fn l_brack_token(&self) -> Option<SyntaxToken> {79		support::token(&self.syntax, T!['['])80	}81	pub fn from(&self) -> Option<Expr> {82		support::child(&self.syntax)83	}84	pub fn colon_token(&self) -> Option<SyntaxToken> {85		support::token(&self.syntax, T![:])86	}87	pub fn end(&self) -> Option<SliceDescEnd> {88		support::child(&self.syntax)89	}90	pub fn step(&self) -> Option<SliceDescStep> {91		support::child(&self.syntax)92	}93	pub fn r_brack_token(&self) -> Option<SyntaxToken> {94		support::token(&self.syntax, T![']'])95	}96}9798#[derive(Debug, Clone, PartialEq, Eq, Hash)]99pub struct ExprIndex {100	pub(crate) syntax: SyntaxNode,101}102impl ExprIndex {103	pub fn expr(&self) -> Option<Expr> {104		support::child(&self.syntax)105	}106	pub fn dot_token(&self) -> Option<SyntaxToken> {107		support::token(&self.syntax, T![.])108	}109	pub fn index(&self) -> Option<Name> {110		support::child(&self.syntax)111	}112}113114#[derive(Debug, Clone, PartialEq, Eq, Hash)]115pub struct Name {116	pub(crate) syntax: SyntaxNode,117}118impl Name {119	pub fn ident_lit(&self) -> Option<SyntaxToken> {120		support::token(&self.syntax, IDENT)121	}122}123124#[derive(Debug, Clone, PartialEq, Eq, Hash)]125pub struct ExprIndexExpr {126	pub(crate) syntax: SyntaxNode,127}128impl ExprIndexExpr {129	pub fn base(&self) -> Option<LhsExpr> {130		support::child(&self.syntax)131	}132	pub fn l_brack_token(&self) -> Option<SyntaxToken> {133		support::token(&self.syntax, T!['['])134	}135	pub fn index(&self) -> Option<Expr> {136		support::child(&self.syntax)137	}138	pub fn r_brack_token(&self) -> Option<SyntaxToken> {139		support::token(&self.syntax, T![']'])140	}141}142143#[derive(Debug, Clone, PartialEq, Eq, Hash)]144pub struct ExprApply {145	pub(crate) syntax: SyntaxNode,146}147impl ExprApply {148	pub fn expr(&self) -> Option<Expr> {149		support::child(&self.syntax)150	}151	pub fn args_desc(&self) -> Option<ArgsDesc> {152		support::child(&self.syntax)153	}154	pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {155		support::token(&self.syntax, T![tailstrict])156	}157}158159#[derive(Debug, Clone, PartialEq, Eq, Hash)]160pub struct ArgsDesc {161	pub(crate) syntax: SyntaxNode,162}163impl ArgsDesc {164	pub fn l_paren_token(&self) -> Option<SyntaxToken> {165		support::token(&self.syntax, T!['('])166	}167	pub fn args(&self) -> AstChildren<Arg> {168		support::children(&self.syntax)169	}170	pub fn r_paren_token(&self) -> Option<SyntaxToken> {171		support::token(&self.syntax, T![')'])172	}173}174175#[derive(Debug, Clone, PartialEq, Eq, Hash)]176pub struct ExprObjExtend {177	pub(crate) syntax: SyntaxNode,178}179impl ExprObjExtend {180	pub fn lhs_expr(&self) -> Option<LhsExpr> {181		support::child(&self.syntax)182	}183	pub fn expr(&self) -> Option<Expr> {184		support::child(&self.syntax)185	}186}187188#[derive(Debug, Clone, PartialEq, Eq, Hash)]189pub struct ExprParened {190	pub(crate) syntax: SyntaxNode,191}192impl ExprParened {193	pub fn l_paren_token(&self) -> Option<SyntaxToken> {194		support::token(&self.syntax, T!['('])195	}196	pub fn expr(&self) -> Option<Expr> {197		support::child(&self.syntax)198	}199	pub fn r_paren_token(&self) -> Option<SyntaxToken> {200		support::token(&self.syntax, T![')'])201	}202}203204#[derive(Debug, Clone, PartialEq, Eq, Hash)]205pub struct ExprLiteral {206	pub(crate) syntax: SyntaxNode,207}208impl ExprLiteral {209	pub fn literal(&self) -> Option<Literal> {210		support::token_child(&self.syntax)211	}212}213214#[derive(Debug, Clone, PartialEq, Eq, Hash)]215pub struct ExprIntrinsicThisFile {216	pub(crate) syntax: SyntaxNode,217}218impl ExprIntrinsicThisFile {219	pub fn intrinsic_this_file_token(&self) -> Option<SyntaxToken> {220		support::token(&self.syntax, T!["$intrinsicThisFile"])221	}222}223224#[derive(Debug, Clone, PartialEq, Eq, Hash)]225pub struct ExprIntrinsicId {226	pub(crate) syntax: SyntaxNode,227}228impl ExprIntrinsicId {229	pub fn intrinsic_id_token(&self) -> Option<SyntaxToken> {230		support::token(&self.syntax, T!["$intrinsicId"])231	}232}233234#[derive(Debug, Clone, PartialEq, Eq, Hash)]235pub struct ExprIntrinsic {236	pub(crate) syntax: SyntaxNode,237}238impl ExprIntrinsic {239	pub fn intrinsic_token(&self) -> Option<SyntaxToken> {240		support::token(&self.syntax, T!["$intrinsic"])241	}242	pub fn l_paren_token(&self) -> Option<SyntaxToken> {243		support::token(&self.syntax, T!['('])244	}245	pub fn name(&self) -> Option<Name> {246		support::child(&self.syntax)247	}248	pub fn r_paren_token(&self) -> Option<SyntaxToken> {249		support::token(&self.syntax, T![')'])250	}251}252253#[derive(Debug, Clone, PartialEq, Eq, Hash)]254pub struct ExprString {255	pub(crate) syntax: SyntaxNode,256}257impl ExprString {258	pub fn string(&self) -> Option<String> {259		support::token_child(&self.syntax)260	}261}262263#[derive(Debug, Clone, PartialEq, Eq, Hash)]264pub struct ExprNumber {265	pub(crate) syntax: SyntaxNode,266}267impl ExprNumber {268	pub fn number(&self) -> Option<Number> {269		support::token_child(&self.syntax)270	}271}272273#[derive(Debug, Clone, PartialEq, Eq, Hash)]274pub struct ExprArray {275	pub(crate) syntax: SyntaxNode,276}277impl ExprArray {278	pub fn l_brack_token(&self) -> Option<SyntaxToken> {279		support::token(&self.syntax, T!['['])280	}281	pub fn exprs(&self) -> AstChildren<Expr> {282		support::children(&self.syntax)283	}284	pub fn r_brack_token(&self) -> Option<SyntaxToken> {285		support::token(&self.syntax, T![']'])286	}287}288289#[derive(Debug, Clone, PartialEq, Eq, Hash)]290pub struct ExprObject {291	pub(crate) syntax: SyntaxNode,292}293impl ExprObject {294	pub fn l_brace_token(&self) -> Option<SyntaxToken> {295		support::token(&self.syntax, T!['{'])296	}297	pub fn obj_body(&self) -> Option<ObjBody> {298		support::child(&self.syntax)299	}300	pub fn r_brace_token(&self) -> Option<SyntaxToken> {301		support::token(&self.syntax, T!['}'])302	}303}304305#[derive(Debug, Clone, PartialEq, Eq, Hash)]306pub struct ExprArrayComp {307	pub(crate) syntax: SyntaxNode,308}309impl ExprArrayComp {310	pub fn l_brack_token(&self) -> Option<SyntaxToken> {311		support::token(&self.syntax, T!['['])312	}313	pub fn expr(&self) -> Option<Expr> {314		support::child(&self.syntax)315	}316	pub fn comma_token(&self) -> Option<SyntaxToken> {317		support::token(&self.syntax, T![,])318	}319	pub fn comp_specs(&self) -> AstChildren<CompSpec> {320		support::children(&self.syntax)321	}322	pub fn r_brack_token(&self) -> Option<SyntaxToken> {323		support::token(&self.syntax, T![']'])324	}325}326327#[derive(Debug, Clone, PartialEq, Eq, Hash)]328pub struct ExprImport {329	pub(crate) syntax: SyntaxNode,330}331impl ExprImport {332	pub fn import_kind(&self) -> Option<ImportKind> {333		support::token_child(&self.syntax)334	}335	pub fn string(&self) -> Option<String> {336		support::token_child(&self.syntax)337	}338}339340#[derive(Debug, Clone, PartialEq, Eq, Hash)]341pub struct ExprVar {342	pub(crate) syntax: SyntaxNode,343}344impl ExprVar {345	pub fn name(&self) -> Option<Name> {346		support::child(&self.syntax)347	}348}349350#[derive(Debug, Clone, PartialEq, Eq, Hash)]351pub struct ExprLocal {352	pub(crate) syntax: SyntaxNode,353}354impl ExprLocal {355	pub fn local_kw_token(&self) -> Option<SyntaxToken> {356		support::token(&self.syntax, T![local])357	}358	pub fn binds(&self) -> AstChildren<Bind> {359		support::children(&self.syntax)360	}361	pub fn semi_token(&self) -> Option<SyntaxToken> {362		support::token(&self.syntax, T![;])363	}364	pub fn expr(&self) -> Option<Expr> {365		support::child(&self.syntax)366	}367}368369#[derive(Debug, Clone, PartialEq, Eq, Hash)]370pub struct ExprIfThenElse {371	pub(crate) syntax: SyntaxNode,372}373impl ExprIfThenElse {374	pub fn if_kw_token(&self) -> Option<SyntaxToken> {375		support::token(&self.syntax, T![if])376	}377	pub fn cond(&self) -> Option<Expr> {378		support::child(&self.syntax)379	}380	pub fn then_kw_token(&self) -> Option<SyntaxToken> {381		support::token(&self.syntax, T![then])382	}383	pub fn then(&self) -> Option<TrueExpr> {384		support::child(&self.syntax)385	}386	pub fn else_kw_token(&self) -> Option<SyntaxToken> {387		support::token(&self.syntax, T![else])388	}389	pub fn else_(&self) -> Option<FalseExpr> {390		support::child(&self.syntax)391	}392}393394#[derive(Debug, Clone, PartialEq, Eq, Hash)]395pub struct TrueExpr {396	pub(crate) syntax: SyntaxNode,397}398impl TrueExpr {399	pub fn expr(&self) -> Option<Expr> {400		support::child(&self.syntax)401	}402}403404#[derive(Debug, Clone, PartialEq, Eq, Hash)]405pub struct FalseExpr {406	pub(crate) syntax: SyntaxNode,407}408impl FalseExpr {409	pub fn expr(&self) -> Option<Expr> {410		support::child(&self.syntax)411	}412}413414#[derive(Debug, Clone, PartialEq, Eq, Hash)]415pub struct ExprFunction {416	pub(crate) syntax: SyntaxNode,417}418impl ExprFunction {419	pub fn function_kw_token(&self) -> Option<SyntaxToken> {420		support::token(&self.syntax, T![function])421	}422	pub fn l_paren_token(&self) -> Option<SyntaxToken> {423		support::token(&self.syntax, T!['('])424	}425	pub fn params_desc(&self) -> Option<ParamsDesc> {426		support::child(&self.syntax)427	}428	pub fn r_paren_token(&self) -> Option<SyntaxToken> {429		support::token(&self.syntax, T![')'])430	}431	pub fn expr(&self) -> Option<Expr> {432		support::child(&self.syntax)433	}434}435436#[derive(Debug, Clone, PartialEq, Eq, Hash)]437pub struct ParamsDesc {438	pub(crate) syntax: SyntaxNode,439}440impl ParamsDesc {441	pub fn l_paren_token(&self) -> Option<SyntaxToken> {442		support::token(&self.syntax, T!['('])443	}444	pub fn params(&self) -> AstChildren<Param> {445		support::children(&self.syntax)446	}447	pub fn r_paren_token(&self) -> Option<SyntaxToken> {448		support::token(&self.syntax, T![')'])449	}450}451452#[derive(Debug, Clone, PartialEq, Eq, Hash)]453pub struct ExprAssert {454	pub(crate) syntax: SyntaxNode,455}456impl ExprAssert {457	pub fn assertion(&self) -> Option<Assertion> {458		support::child(&self.syntax)459	}460	pub fn semi_token(&self) -> Option<SyntaxToken> {461		support::token(&self.syntax, T![;])462	}463	pub fn expr(&self) -> Option<Expr> {464		support::child(&self.syntax)465	}466}467468#[derive(Debug, Clone, PartialEq, Eq, Hash)]469pub struct Assertion {470	pub(crate) syntax: SyntaxNode,471}472impl Assertion {473	pub fn assert_kw_token(&self) -> Option<SyntaxToken> {474		support::token(&self.syntax, T![assert])475	}476	pub fn condition(&self) -> Option<LhsExpr> {477		support::child(&self.syntax)478	}479	pub fn colon_token(&self) -> Option<SyntaxToken> {480		support::token(&self.syntax, T![:])481	}482	pub fn message(&self) -> Option<Expr> {483		support::child(&self.syntax)484	}485}486487#[derive(Debug, Clone, PartialEq, Eq, Hash)]488pub struct ExprError {489	pub(crate) syntax: SyntaxNode,490}491impl ExprError {492	pub fn error_kw_token(&self) -> Option<SyntaxToken> {493		support::token(&self.syntax, T![error])494	}495	pub fn expr(&self) -> Option<Expr> {496		support::child(&self.syntax)497	}498}499500#[derive(Debug, Clone, PartialEq, Eq, Hash)]501pub struct SliceDescEnd {502	pub(crate) syntax: SyntaxNode,503}504impl SliceDescEnd {505	pub fn expr(&self) -> Option<Expr> {506		support::child(&self.syntax)507	}508}509510#[derive(Debug, Clone, PartialEq, Eq, Hash)]511pub struct SliceDescStep {512	pub(crate) syntax: SyntaxNode,513}514impl SliceDescStep {515	pub fn expr(&self) -> Option<Expr> {516		support::child(&self.syntax)517	}518}519520#[derive(Debug, Clone, PartialEq, Eq, Hash)]521pub struct Arg {522	pub(crate) syntax: SyntaxNode,523}524impl Arg {525	pub fn name(&self) -> Option<Name> {526		support::child(&self.syntax)527	}528	pub fn assign_token(&self) -> Option<SyntaxToken> {529		support::token(&self.syntax, T![=])530	}531	pub fn expr(&self) -> Option<Expr> {532		support::child(&self.syntax)533	}534}535536#[derive(Debug, Clone, PartialEq, Eq, Hash)]537pub struct ObjBodyComp {538	pub(crate) syntax: SyntaxNode,539}540impl ObjBodyComp {541	pub fn pre(&self) -> AstChildren<ObjLocalPostComma> {542		support::children(&self.syntax)543	}544	pub fn l_brack_token(&self) -> Option<SyntaxToken> {545		support::token(&self.syntax, T!['['])546	}547	pub fn key(&self) -> Option<LhsExpr> {548		support::child(&self.syntax)549	}550	pub fn r_brack_token(&self) -> Option<SyntaxToken> {551		support::token(&self.syntax, T![']'])552	}553	pub fn plus_token(&self) -> Option<SyntaxToken> {554		support::token(&self.syntax, T![+])555	}556	pub fn colon_token(&self) -> Option<SyntaxToken> {557		support::token(&self.syntax, T![:])558	}559	pub fn value(&self) -> Option<Expr> {560		support::child(&self.syntax)561	}562	pub fn post(&self) -> AstChildren<ObjLocalPreComma> {563		support::children(&self.syntax)564	}565	pub fn comp_specs(&self) -> AstChildren<CompSpec> {566		support::children(&self.syntax)567	}568}569570#[derive(Debug, Clone, PartialEq, Eq, Hash)]571pub struct ObjLocalPostComma {572	pub(crate) syntax: SyntaxNode,573}574impl ObjLocalPostComma {575	pub fn obj_local(&self) -> Option<ObjLocal> {576		support::child(&self.syntax)577	}578	pub fn comma_token(&self) -> Option<SyntaxToken> {579		support::token(&self.syntax, T![,])580	}581}582583#[derive(Debug, Clone, PartialEq, Eq, Hash)]584pub struct ObjLocalPreComma {585	pub(crate) syntax: SyntaxNode,586}587impl ObjLocalPreComma {588	pub fn comma_token(&self) -> Option<SyntaxToken> {589		support::token(&self.syntax, T![,])590	}591	pub fn obj_local(&self) -> Option<ObjLocal> {592		support::child(&self.syntax)593	}594}595596#[derive(Debug, Clone, PartialEq, Eq, Hash)]597pub struct ObjBodyMemberList {598	pub(crate) syntax: SyntaxNode,599}600impl ObjBodyMemberList {601	pub fn members(&self) -> AstChildren<Member> {602		support::children(&self.syntax)603	}604}605606#[derive(Debug, Clone, PartialEq, Eq, Hash)]607pub struct ObjLocal {608	pub(crate) syntax: SyntaxNode,609}610impl ObjLocal {611	pub fn local_kw_token(&self) -> Option<SyntaxToken> {612		support::token(&self.syntax, T![local])613	}614	pub fn bind(&self) -> Option<Bind> {615		support::child(&self.syntax)616	}617}618619#[derive(Debug, Clone, PartialEq, Eq, Hash)]620pub struct MemberBindStmt {621	pub(crate) syntax: SyntaxNode,622}623impl MemberBindStmt {624	pub fn obj_local(&self) -> Option<ObjLocal> {625		support::child(&self.syntax)626	}627}628629#[derive(Debug, Clone, PartialEq, Eq, Hash)]630pub struct MemberAssertStmt {631	pub(crate) syntax: SyntaxNode,632}633impl MemberAssertStmt {634	pub fn assertion(&self) -> Option<Assertion> {635		support::child(&self.syntax)636	}637}638639#[derive(Debug, Clone, PartialEq, Eq, Hash)]640pub struct MemberField {641	pub(crate) syntax: SyntaxNode,642}643impl MemberField {644	pub fn field(&self) -> Option<Field> {645		support::child(&self.syntax)646	}647}648649#[derive(Debug, Clone, PartialEq, Eq, Hash)]650pub struct FieldNormal {651	pub(crate) syntax: SyntaxNode,652}653impl FieldNormal {654	pub fn field_name(&self) -> Option<FieldName> {655		support::child(&self.syntax)656	}657	pub fn plus_token(&self) -> Option<SyntaxToken> {658		support::token(&self.syntax, T![+])659	}660	pub fn visibility(&self) -> Option<Visibility> {661		support::token_child(&self.syntax)662	}663	pub fn expr(&self) -> Option<Expr> {664		support::child(&self.syntax)665	}666}667668#[derive(Debug, Clone, PartialEq, Eq, Hash)]669pub struct FieldMethod {670	pub(crate) syntax: SyntaxNode,671}672impl FieldMethod {673	pub fn field_name(&self) -> Option<FieldName> {674		support::child(&self.syntax)675	}676	pub fn params_desc(&self) -> Option<ParamsDesc> {677		support::child(&self.syntax)678	}679	pub fn visibility(&self) -> Option<Visibility> {680		support::token_child(&self.syntax)681	}682	pub fn expr(&self) -> Option<Expr> {683		support::child(&self.syntax)684	}685}686687#[derive(Debug, Clone, PartialEq, Eq, Hash)]688pub struct FieldNameFixed {689	pub(crate) syntax: SyntaxNode,690}691impl FieldNameFixed {692	pub fn id(&self) -> Option<Name> {693		support::child(&self.syntax)694	}695	pub fn string(&self) -> Option<String> {696		support::token_child(&self.syntax)697	}698}699700#[derive(Debug, Clone, PartialEq, Eq, Hash)]701pub struct FieldNameDynamic {702	pub(crate) syntax: SyntaxNode,703}704impl FieldNameDynamic {705	pub fn l_brack_token(&self) -> Option<SyntaxToken> {706		support::token(&self.syntax, T!['['])707	}708	pub fn expr(&self) -> Option<Expr> {709		support::child(&self.syntax)710	}711	pub fn r_brack_token(&self) -> Option<SyntaxToken> {712		support::token(&self.syntax, T![']'])713	}714}715716#[derive(Debug, Clone, PartialEq, Eq, Hash)]717pub struct ForSpec {718	pub(crate) syntax: SyntaxNode,719}720impl ForSpec {721	pub fn for_kw_token(&self) -> Option<SyntaxToken> {722		support::token(&self.syntax, T![for])723	}724	pub fn bind(&self) -> Option<Name> {725		support::child(&self.syntax)726	}727	pub fn in_kw_token(&self) -> Option<SyntaxToken> {728		support::token(&self.syntax, T![in])729	}730	pub fn expr(&self) -> Option<Expr> {731		support::child(&self.syntax)732	}733}734735#[derive(Debug, Clone, PartialEq, Eq, Hash)]736pub struct IfSpec {737	pub(crate) syntax: SyntaxNode,738}739impl IfSpec {740	pub fn if_kw_token(&self) -> Option<SyntaxToken> {741		support::token(&self.syntax, T![if])742	}743	pub fn expr(&self) -> Option<Expr> {744		support::child(&self.syntax)745	}746}747748#[derive(Debug, Clone, PartialEq, Eq, Hash)]749pub struct BindDestruct {750	pub(crate) syntax: SyntaxNode,751}752impl BindDestruct {753	pub fn into(&self) -> Option<Destruct> {754		support::child(&self.syntax)755	}756	pub fn assign_token(&self) -> Option<SyntaxToken> {757		support::token(&self.syntax, T![=])758	}759	pub fn value(&self) -> Option<Expr> {760		support::child(&self.syntax)761	}762}763764#[derive(Debug, Clone, PartialEq, Eq, Hash)]765pub struct BindFunction {766	pub(crate) syntax: SyntaxNode,767}768impl BindFunction {769	pub fn name(&self) -> Option<Name> {770		support::child(&self.syntax)771	}772	pub fn params(&self) -> Option<ParamsDesc> {773		support::child(&self.syntax)774	}775	pub fn assign_token(&self) -> Option<SyntaxToken> {776		support::token(&self.syntax, T![=])777	}778	pub fn value(&self) -> Option<Expr> {779		support::child(&self.syntax)780	}781}782783#[derive(Debug, Clone, PartialEq, Eq, Hash)]784pub struct Param {785	pub(crate) syntax: SyntaxNode,786}787impl Param {788	pub fn destruct(&self) -> Option<Destruct> {789		support::child(&self.syntax)790	}791	pub fn assign_token(&self) -> Option<SyntaxToken> {792		support::token(&self.syntax, T![=])793	}794	pub fn expr(&self) -> Option<Expr> {795		support::child(&self.syntax)796	}797}798799#[derive(Debug, Clone, PartialEq, Eq, Hash)]800pub struct DestructFull {801	pub(crate) syntax: SyntaxNode,802}803impl DestructFull {804	pub fn name(&self) -> Option<Name> {805		support::child(&self.syntax)806	}807}808809#[derive(Debug, Clone, PartialEq, Eq, Hash)]810pub struct DestructSkip {811	pub(crate) syntax: SyntaxNode,812}813impl DestructSkip {814	pub fn question_mark_token(&self) -> Option<SyntaxToken> {815		support::token(&self.syntax, T![?])816	}817}818819#[derive(Debug, Clone, PartialEq, Eq, Hash)]820pub struct DestructArray {821	pub(crate) syntax: SyntaxNode,822}823impl DestructArray {824	pub fn l_brack_token(&self) -> Option<SyntaxToken> {825		support::token(&self.syntax, T!['['])826	}827	pub fn destruct_array_parts(&self) -> AstChildren<DestructArrayPart> {828		support::children(&self.syntax)829	}830	pub fn r_brack_token(&self) -> Option<SyntaxToken> {831		support::token(&self.syntax, T![']'])832	}833}834835#[derive(Debug, Clone, PartialEq, Eq, Hash)]836pub struct DestructObject {837	pub(crate) syntax: SyntaxNode,838}839impl DestructObject {840	pub fn l_brace_token(&self) -> Option<SyntaxToken> {841		support::token(&self.syntax, T!['{'])842	}843	pub fn destruct_object_fields(&self) -> AstChildren<DestructObjectField> {844		support::children(&self.syntax)845	}846	pub fn destruct_rest(&self) -> Option<DestructRest> {847		support::child(&self.syntax)848	}849	pub fn comma_token(&self) -> Option<SyntaxToken> {850		support::token(&self.syntax, T![,])851	}852	pub fn r_brace_token(&self) -> Option<SyntaxToken> {853		support::token(&self.syntax, T!['}'])854	}855}856857#[derive(Debug, Clone, PartialEq, Eq, Hash)]858pub struct DestructObjectField {859	pub(crate) syntax: SyntaxNode,860}861impl DestructObjectField {862	pub fn field(&self) -> Option<Name> {863		support::child(&self.syntax)864	}865	pub fn colon_token(&self) -> Option<SyntaxToken> {866		support::token(&self.syntax, T![:])867	}868	pub fn destruct(&self) -> Option<Destruct> {869		support::child(&self.syntax)870	}871	pub fn assign_token(&self) -> Option<SyntaxToken> {872		support::token(&self.syntax, T![=])873	}874	pub fn expr(&self) -> Option<Expr> {875		support::child(&self.syntax)876	}877}878879#[derive(Debug, Clone, PartialEq, Eq, Hash)]880pub struct DestructRest {881	pub(crate) syntax: SyntaxNode,882}883impl DestructRest {884	pub fn dotdotdot_token(&self) -> Option<SyntaxToken> {885		support::token(&self.syntax, T![...])886	}887	pub fn into(&self) -> Option<Name> {888		support::child(&self.syntax)889	}890}891892#[derive(Debug, Clone, PartialEq, Eq, Hash)]893pub struct DestructArrayElement {894	pub(crate) syntax: SyntaxNode,895}896impl DestructArrayElement {897	pub fn destruct(&self) -> Option<Destruct> {898		support::child(&self.syntax)899	}900}901902#[derive(Debug, Clone, PartialEq, Eq, Hash)]903pub enum Expr {904	ExprBinary(ExprBinary),905	ExprUnary(ExprUnary),906	ExprSlice(ExprSlice),907	ExprIndex(ExprIndex),908	ExprIndexExpr(ExprIndexExpr),909	ExprApply(ExprApply),910	ExprObjExtend(ExprObjExtend),911	ExprParened(ExprParened),912	ExprIntrinsicThisFile(ExprIntrinsicThisFile),913	ExprIntrinsicId(ExprIntrinsicId),914	ExprIntrinsic(ExprIntrinsic),915	ExprString(ExprString),916	ExprNumber(ExprNumber),917	ExprLiteral(ExprLiteral),918	ExprArray(ExprArray),919	ExprObject(ExprObject),920	ExprArrayComp(ExprArrayComp),921	ExprImport(ExprImport),922	ExprVar(ExprVar),923	ExprLocal(ExprLocal),924	ExprIfThenElse(ExprIfThenElse),925	ExprFunction(ExprFunction),926	ExprAssert(ExprAssert),927	ExprError(ExprError),928}929930#[derive(Debug, Clone, PartialEq, Eq, Hash)]931pub enum ObjBody {932	ObjBodyComp(ObjBodyComp),933	ObjBodyMemberList(ObjBodyMemberList),934}935936#[derive(Debug, Clone, PartialEq, Eq, Hash)]937pub enum CompSpec {938	ForSpec(ForSpec),939	IfSpec(IfSpec),940}941942#[derive(Debug, Clone, PartialEq, Eq, Hash)]943pub enum Bind {944	BindDestruct(BindDestruct),945	BindFunction(BindFunction),946}947948#[derive(Debug, Clone, PartialEq, Eq, Hash)]949pub enum Member {950	MemberBindStmt(MemberBindStmt),951	MemberAssertStmt(MemberAssertStmt),952	MemberField(MemberField),953}954955#[derive(Debug, Clone, PartialEq, Eq, Hash)]956pub enum Field {957	FieldNormal(FieldNormal),958	FieldMethod(FieldMethod),959}960961#[derive(Debug, Clone, PartialEq, Eq, Hash)]962pub enum FieldName {963	FieldNameFixed(FieldNameFixed),964	FieldNameDynamic(FieldNameDynamic),965}966967#[derive(Debug, Clone, PartialEq, Eq, Hash)]968pub enum Destruct {969	DestructFull(DestructFull),970	DestructSkip(DestructSkip),971	DestructArray(DestructArray),972	DestructObject(DestructObject),973}974975#[derive(Debug, Clone, PartialEq, Eq, Hash)]976pub enum DestructArrayPart {977	DestructArrayElement(DestructArrayElement),978	DestructRest(DestructRest),979}980981#[derive(Debug, Clone, PartialEq, Eq, Hash)]982pub struct BinaryOperator {983	syntax: SyntaxToken,984	kind: BinaryOperatorKind,985}986987#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]988pub enum BinaryOperatorKind {989	Or,990	And,991	BitOr,992	BitXor,993	BitAnd,994	Eq,995	Ne,996	Lt,997	Gt,998	Le,999	Ge,1000	InKw,1001	Lhs,1002	Rhs,1003	Plus,1004	Minus,1005	Mul,1006	Div,1007	Modulo,1008	ErrorNoOperator,1009}10101011#[derive(Debug, Clone, PartialEq, Eq, Hash)]1012pub struct UnaryOperator {1013	syntax: SyntaxToken,1014	kind: UnaryOperatorKind,1015}10161017#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1018pub enum UnaryOperatorKind {1019	Minus,1020	Not,1021	BitNot,1022}10231024#[derive(Debug, Clone, PartialEq, Eq, Hash)]1025pub struct Literal {1026	syntax: SyntaxToken,1027	kind: LiteralKind,1028}10291030#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1031pub enum LiteralKind {1032	NullKw,1033	TrueKw,1034	FalseKw,1035	SelfKw,1036	Dollar,1037	SuperKw,1038}10391040#[derive(Debug, Clone, PartialEq, Eq, Hash)]1041pub struct String {1042	syntax: SyntaxToken,1043	kind: StringKind,1044}10451046#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1047pub enum StringKind {1048	StringDouble,1049	StringSingle,1050	StringDoubleVerbatim,1051	StringSingleVerbatim,1052	StringBlock,1053}10541055#[derive(Debug, Clone, PartialEq, Eq, Hash)]1056pub struct Number {1057	syntax: SyntaxToken,1058	kind: NumberKind,1059}10601061#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1062pub enum NumberKind {1063	Float,1064	MetaForceEnum,1065}10661067#[derive(Debug, Clone, PartialEq, Eq, Hash)]1068pub struct ImportKind {1069	syntax: SyntaxToken,1070	kind: ImportKindKind,1071}10721073#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1074pub enum ImportKindKind {1075	ImportstrKw,1076	ImportbinKw,1077	ImportKw,1078}10791080#[derive(Debug, Clone, PartialEq, Eq, Hash)]1081pub struct Visibility {1082	syntax: SyntaxToken,1083	kind: VisibilityKind,1084}10851086#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]1087pub enum VisibilityKind {1088	Coloncoloncolon,1089	Coloncolon,1090	Colon,1091}1092impl AstNode for SourceFile {1093	fn can_cast(kind: SyntaxKind) -> bool {1094		kind == SOURCE_FILE1095	}1096	fn cast(syntax: SyntaxNode) -> Option<Self> {1097		if Self::can_cast(syntax.kind()) {1098			Some(Self { syntax })1099		} else {1100			None1101		}1102	}1103	fn syntax(&self) -> &SyntaxNode {1104		&self.syntax1105	}1106}1107impl AstNode for ExprBinary {1108	fn can_cast(kind: SyntaxKind) -> bool {1109		kind == EXPR_BINARY1110	}1111	fn cast(syntax: SyntaxNode) -> Option<Self> {1112		if Self::can_cast(syntax.kind()) {1113			Some(Self { syntax })1114		} else {1115			None1116		}1117	}1118	fn syntax(&self) -> &SyntaxNode {1119		&self.syntax1120	}1121}1122impl AstNode for LhsExpr {1123	fn can_cast(kind: SyntaxKind) -> bool {1124		kind == LHS_EXPR1125	}1126	fn cast(syntax: SyntaxNode) -> Option<Self> {1127		if Self::can_cast(syntax.kind()) {1128			Some(Self { syntax })1129		} else {1130			None1131		}1132	}1133	fn syntax(&self) -> &SyntaxNode {1134		&self.syntax1135	}1136}1137impl AstNode for ExprUnary {1138	fn can_cast(kind: SyntaxKind) -> bool {1139		kind == EXPR_UNARY1140	}1141	fn cast(syntax: SyntaxNode) -> Option<Self> {1142		if Self::can_cast(syntax.kind()) {1143			Some(Self { syntax })1144		} else {1145			None1146		}1147	}1148	fn syntax(&self) -> &SyntaxNode {1149		&self.syntax1150	}1151}1152impl AstNode for ExprSlice {1153	fn can_cast(kind: SyntaxKind) -> bool {1154		kind == EXPR_SLICE1155	}1156	fn cast(syntax: SyntaxNode) -> Option<Self> {1157		if Self::can_cast(syntax.kind()) {1158			Some(Self { syntax })1159		} else {1160			None1161		}1162	}1163	fn syntax(&self) -> &SyntaxNode {1164		&self.syntax1165	}1166}1167impl AstNode for SliceDesc {1168	fn can_cast(kind: SyntaxKind) -> bool {1169		kind == SLICE_DESC1170	}1171	fn cast(syntax: SyntaxNode) -> Option<Self> {1172		if Self::can_cast(syntax.kind()) {1173			Some(Self { syntax })1174		} else {1175			None1176		}1177	}1178	fn syntax(&self) -> &SyntaxNode {1179		&self.syntax1180	}1181}1182impl AstNode for ExprIndex {1183	fn can_cast(kind: SyntaxKind) -> bool {1184		kind == EXPR_INDEX1185	}1186	fn cast(syntax: SyntaxNode) -> Option<Self> {1187		if Self::can_cast(syntax.kind()) {1188			Some(Self { syntax })1189		} else {1190			None1191		}1192	}1193	fn syntax(&self) -> &SyntaxNode {1194		&self.syntax1195	}1196}1197impl AstNode for Name {1198	fn can_cast(kind: SyntaxKind) -> bool {1199		kind == NAME1200	}1201	fn cast(syntax: SyntaxNode) -> Option<Self> {1202		if Self::can_cast(syntax.kind()) {1203			Some(Self { syntax })1204		} else {1205			None1206		}1207	}1208	fn syntax(&self) -> &SyntaxNode {1209		&self.syntax1210	}1211}1212impl AstNode for ExprIndexExpr {1213	fn can_cast(kind: SyntaxKind) -> bool {1214		kind == EXPR_INDEX_EXPR1215	}1216	fn cast(syntax: SyntaxNode) -> Option<Self> {1217		if Self::can_cast(syntax.kind()) {1218			Some(Self { syntax })1219		} else {1220			None1221		}1222	}1223	fn syntax(&self) -> &SyntaxNode {1224		&self.syntax1225	}1226}1227impl AstNode for ExprApply {1228	fn can_cast(kind: SyntaxKind) -> bool {1229		kind == EXPR_APPLY1230	}1231	fn cast(syntax: SyntaxNode) -> Option<Self> {1232		if Self::can_cast(syntax.kind()) {1233			Some(Self { syntax })1234		} else {1235			None1236		}1237	}1238	fn syntax(&self) -> &SyntaxNode {1239		&self.syntax1240	}1241}1242impl AstNode for ArgsDesc {1243	fn can_cast(kind: SyntaxKind) -> bool {1244		kind == ARGS_DESC1245	}1246	fn cast(syntax: SyntaxNode) -> Option<Self> {1247		if Self::can_cast(syntax.kind()) {1248			Some(Self { syntax })1249		} else {1250			None1251		}1252	}1253	fn syntax(&self) -> &SyntaxNode {1254		&self.syntax1255	}1256}1257impl AstNode for ExprObjExtend {1258	fn can_cast(kind: SyntaxKind) -> bool {1259		kind == EXPR_OBJ_EXTEND1260	}1261	fn cast(syntax: SyntaxNode) -> Option<Self> {1262		if Self::can_cast(syntax.kind()) {1263			Some(Self { syntax })1264		} else {1265			None1266		}1267	}1268	fn syntax(&self) -> &SyntaxNode {1269		&self.syntax1270	}1271}1272impl AstNode for ExprParened {1273	fn can_cast(kind: SyntaxKind) -> bool {1274		kind == EXPR_PARENED1275	}1276	fn cast(syntax: SyntaxNode) -> Option<Self> {1277		if Self::can_cast(syntax.kind()) {1278			Some(Self { syntax })1279		} else {1280			None1281		}1282	}1283	fn syntax(&self) -> &SyntaxNode {1284		&self.syntax1285	}1286}1287impl AstNode for ExprLiteral {1288	fn can_cast(kind: SyntaxKind) -> bool {1289		kind == EXPR_LITERAL1290	}1291	fn cast(syntax: SyntaxNode) -> Option<Self> {1292		if Self::can_cast(syntax.kind()) {1293			Some(Self { syntax })1294		} else {1295			None1296		}1297	}1298	fn syntax(&self) -> &SyntaxNode {1299		&self.syntax1300	}1301}1302impl AstNode for ExprIntrinsicThisFile {1303	fn can_cast(kind: SyntaxKind) -> bool {1304		kind == EXPR_INTRINSIC_THIS_FILE1305	}1306	fn cast(syntax: SyntaxNode) -> Option<Self> {1307		if Self::can_cast(syntax.kind()) {1308			Some(Self { syntax })1309		} else {1310			None1311		}1312	}1313	fn syntax(&self) -> &SyntaxNode {1314		&self.syntax1315	}1316}1317impl AstNode for ExprIntrinsicId {1318	fn can_cast(kind: SyntaxKind) -> bool {1319		kind == EXPR_INTRINSIC_ID1320	}1321	fn cast(syntax: SyntaxNode) -> Option<Self> {1322		if Self::can_cast(syntax.kind()) {1323			Some(Self { syntax })1324		} else {1325			None1326		}1327	}1328	fn syntax(&self) -> &SyntaxNode {1329		&self.syntax1330	}1331}1332impl AstNode for ExprIntrinsic {1333	fn can_cast(kind: SyntaxKind) -> bool {1334		kind == EXPR_INTRINSIC1335	}1336	fn cast(syntax: SyntaxNode) -> Option<Self> {1337		if Self::can_cast(syntax.kind()) {1338			Some(Self { syntax })1339		} else {1340			None1341		}1342	}1343	fn syntax(&self) -> &SyntaxNode {1344		&self.syntax1345	}1346}1347impl AstNode for ExprString {1348	fn can_cast(kind: SyntaxKind) -> bool {1349		kind == EXPR_STRING1350	}1351	fn cast(syntax: SyntaxNode) -> Option<Self> {1352		if Self::can_cast(syntax.kind()) {1353			Some(Self { syntax })1354		} else {1355			None1356		}1357	}1358	fn syntax(&self) -> &SyntaxNode {1359		&self.syntax1360	}1361}1362impl AstNode for ExprNumber {1363	fn can_cast(kind: SyntaxKind) -> bool {1364		kind == EXPR_NUMBER1365	}1366	fn cast(syntax: SyntaxNode) -> Option<Self> {1367		if Self::can_cast(syntax.kind()) {1368			Some(Self { syntax })1369		} else {1370			None1371		}1372	}1373	fn syntax(&self) -> &SyntaxNode {1374		&self.syntax1375	}1376}1377impl AstNode for ExprArray {1378	fn can_cast(kind: SyntaxKind) -> bool {1379		kind == EXPR_ARRAY1380	}1381	fn cast(syntax: SyntaxNode) -> Option<Self> {1382		if Self::can_cast(syntax.kind()) {1383			Some(Self { syntax })1384		} else {1385			None1386		}1387	}1388	fn syntax(&self) -> &SyntaxNode {1389		&self.syntax1390	}1391}1392impl AstNode for ExprObject {1393	fn can_cast(kind: SyntaxKind) -> bool {1394		kind == EXPR_OBJECT1395	}1396	fn cast(syntax: SyntaxNode) -> Option<Self> {1397		if Self::can_cast(syntax.kind()) {1398			Some(Self { syntax })1399		} else {1400			None1401		}1402	}1403	fn syntax(&self) -> &SyntaxNode {1404		&self.syntax1405	}1406}1407impl AstNode for ExprArrayComp {1408	fn can_cast(kind: SyntaxKind) -> bool {1409		kind == EXPR_ARRAY_COMP1410	}1411	fn cast(syntax: SyntaxNode) -> Option<Self> {1412		if Self::can_cast(syntax.kind()) {1413			Some(Self { syntax })1414		} else {1415			None1416		}1417	}1418	fn syntax(&self) -> &SyntaxNode {1419		&self.syntax1420	}1421}1422impl AstNode for ExprImport {1423	fn can_cast(kind: SyntaxKind) -> bool {1424		kind == EXPR_IMPORT1425	}1426	fn cast(syntax: SyntaxNode) -> Option<Self> {1427		if Self::can_cast(syntax.kind()) {1428			Some(Self { syntax })1429		} else {1430			None1431		}1432	}1433	fn syntax(&self) -> &SyntaxNode {1434		&self.syntax1435	}1436}1437impl AstNode for ExprVar {1438	fn can_cast(kind: SyntaxKind) -> bool {1439		kind == EXPR_VAR1440	}1441	fn cast(syntax: SyntaxNode) -> Option<Self> {1442		if Self::can_cast(syntax.kind()) {1443			Some(Self { syntax })1444		} else {1445			None1446		}1447	}1448	fn syntax(&self) -> &SyntaxNode {1449		&self.syntax1450	}1451}1452impl AstNode for ExprLocal {1453	fn can_cast(kind: SyntaxKind) -> bool {1454		kind == EXPR_LOCAL1455	}1456	fn cast(syntax: SyntaxNode) -> Option<Self> {1457		if Self::can_cast(syntax.kind()) {1458			Some(Self { syntax })1459		} else {1460			None1461		}1462	}1463	fn syntax(&self) -> &SyntaxNode {1464		&self.syntax1465	}1466}1467impl AstNode for ExprIfThenElse {1468	fn can_cast(kind: SyntaxKind) -> bool {1469		kind == EXPR_IF_THEN_ELSE1470	}1471	fn cast(syntax: SyntaxNode) -> Option<Self> {1472		if Self::can_cast(syntax.kind()) {1473			Some(Self { syntax })1474		} else {1475			None1476		}1477	}1478	fn syntax(&self) -> &SyntaxNode {1479		&self.syntax1480	}1481}1482impl AstNode for TrueExpr {1483	fn can_cast(kind: SyntaxKind) -> bool {1484		kind == TRUE_EXPR1485	}1486	fn cast(syntax: SyntaxNode) -> Option<Self> {1487		if Self::can_cast(syntax.kind()) {1488			Some(Self { syntax })1489		} else {1490			None1491		}1492	}1493	fn syntax(&self) -> &SyntaxNode {1494		&self.syntax1495	}1496}1497impl AstNode for FalseExpr {1498	fn can_cast(kind: SyntaxKind) -> bool {1499		kind == FALSE_EXPR1500	}1501	fn cast(syntax: SyntaxNode) -> Option<Self> {1502		if Self::can_cast(syntax.kind()) {1503			Some(Self { syntax })1504		} else {1505			None1506		}1507	}1508	fn syntax(&self) -> &SyntaxNode {1509		&self.syntax1510	}1511}1512impl AstNode for ExprFunction {1513	fn can_cast(kind: SyntaxKind) -> bool {1514		kind == EXPR_FUNCTION1515	}1516	fn cast(syntax: SyntaxNode) -> Option<Self> {1517		if Self::can_cast(syntax.kind()) {1518			Some(Self { syntax })1519		} else {1520			None1521		}1522	}1523	fn syntax(&self) -> &SyntaxNode {1524		&self.syntax1525	}1526}1527impl AstNode for ParamsDesc {1528	fn can_cast(kind: SyntaxKind) -> bool {1529		kind == PARAMS_DESC1530	}1531	fn cast(syntax: SyntaxNode) -> Option<Self> {1532		if Self::can_cast(syntax.kind()) {1533			Some(Self { syntax })1534		} else {1535			None1536		}1537	}1538	fn syntax(&self) -> &SyntaxNode {1539		&self.syntax1540	}1541}1542impl AstNode for ExprAssert {1543	fn can_cast(kind: SyntaxKind) -> bool {1544		kind == EXPR_ASSERT1545	}1546	fn cast(syntax: SyntaxNode) -> Option<Self> {1547		if Self::can_cast(syntax.kind()) {1548			Some(Self { syntax })1549		} else {1550			None1551		}1552	}1553	fn syntax(&self) -> &SyntaxNode {1554		&self.syntax1555	}1556}1557impl AstNode for Assertion {1558	fn can_cast(kind: SyntaxKind) -> bool {1559		kind == ASSERTION1560	}1561	fn cast(syntax: SyntaxNode) -> Option<Self> {1562		if Self::can_cast(syntax.kind()) {1563			Some(Self { syntax })1564		} else {1565			None1566		}1567	}1568	fn syntax(&self) -> &SyntaxNode {1569		&self.syntax1570	}1571}1572impl AstNode for ExprError {1573	fn can_cast(kind: SyntaxKind) -> bool {1574		kind == EXPR_ERROR1575	}1576	fn cast(syntax: SyntaxNode) -> Option<Self> {1577		if Self::can_cast(syntax.kind()) {1578			Some(Self { syntax })1579		} else {1580			None1581		}1582	}1583	fn syntax(&self) -> &SyntaxNode {1584		&self.syntax1585	}1586}1587impl AstNode for SliceDescEnd {1588	fn can_cast(kind: SyntaxKind) -> bool {1589		kind == SLICE_DESC_END1590	}1591	fn cast(syntax: SyntaxNode) -> Option<Self> {1592		if Self::can_cast(syntax.kind()) {1593			Some(Self { syntax })1594		} else {1595			None1596		}1597	}1598	fn syntax(&self) -> &SyntaxNode {1599		&self.syntax1600	}1601}1602impl AstNode for SliceDescStep {1603	fn can_cast(kind: SyntaxKind) -> bool {1604		kind == SLICE_DESC_STEP1605	}1606	fn cast(syntax: SyntaxNode) -> Option<Self> {1607		if Self::can_cast(syntax.kind()) {1608			Some(Self { syntax })1609		} else {1610			None1611		}1612	}1613	fn syntax(&self) -> &SyntaxNode {1614		&self.syntax1615	}1616}1617impl AstNode for Arg {1618	fn can_cast(kind: SyntaxKind) -> bool {1619		kind == ARG1620	}1621	fn cast(syntax: SyntaxNode) -> Option<Self> {1622		if Self::can_cast(syntax.kind()) {1623			Some(Self { syntax })1624		} else {1625			None1626		}1627	}1628	fn syntax(&self) -> &SyntaxNode {1629		&self.syntax1630	}1631}1632impl AstNode for ObjBodyComp {1633	fn can_cast(kind: SyntaxKind) -> bool {1634		kind == OBJ_BODY_COMP1635	}1636	fn cast(syntax: SyntaxNode) -> Option<Self> {1637		if Self::can_cast(syntax.kind()) {1638			Some(Self { syntax })1639		} else {1640			None1641		}1642	}1643	fn syntax(&self) -> &SyntaxNode {1644		&self.syntax1645	}1646}1647impl AstNode for ObjLocalPostComma {1648	fn can_cast(kind: SyntaxKind) -> bool {1649		kind == OBJ_LOCAL_POST_COMMA1650	}1651	fn cast(syntax: SyntaxNode) -> Option<Self> {1652		if Self::can_cast(syntax.kind()) {1653			Some(Self { syntax })1654		} else {1655			None1656		}1657	}1658	fn syntax(&self) -> &SyntaxNode {1659		&self.syntax1660	}1661}1662impl AstNode for ObjLocalPreComma {1663	fn can_cast(kind: SyntaxKind) -> bool {1664		kind == OBJ_LOCAL_PRE_COMMA1665	}1666	fn cast(syntax: SyntaxNode) -> Option<Self> {1667		if Self::can_cast(syntax.kind()) {1668			Some(Self { syntax })1669		} else {1670			None1671		}1672	}1673	fn syntax(&self) -> &SyntaxNode {1674		&self.syntax1675	}1676}1677impl AstNode for ObjBodyMemberList {1678	fn can_cast(kind: SyntaxKind) -> bool {1679		kind == OBJ_BODY_MEMBER_LIST1680	}1681	fn cast(syntax: SyntaxNode) -> Option<Self> {1682		if Self::can_cast(syntax.kind()) {1683			Some(Self { syntax })1684		} else {1685			None1686		}1687	}1688	fn syntax(&self) -> &SyntaxNode {1689		&self.syntax1690	}1691}1692impl AstNode for ObjLocal {1693	fn can_cast(kind: SyntaxKind) -> bool {1694		kind == OBJ_LOCAL1695	}1696	fn cast(syntax: SyntaxNode) -> Option<Self> {1697		if Self::can_cast(syntax.kind()) {1698			Some(Self { syntax })1699		} else {1700			None1701		}1702	}1703	fn syntax(&self) -> &SyntaxNode {1704		&self.syntax1705	}1706}1707impl AstNode for MemberBindStmt {1708	fn can_cast(kind: SyntaxKind) -> bool {1709		kind == MEMBER_BIND_STMT1710	}1711	fn cast(syntax: SyntaxNode) -> Option<Self> {1712		if Self::can_cast(syntax.kind()) {1713			Some(Self { syntax })1714		} else {1715			None1716		}1717	}1718	fn syntax(&self) -> &SyntaxNode {1719		&self.syntax1720	}1721}1722impl AstNode for MemberAssertStmt {1723	fn can_cast(kind: SyntaxKind) -> bool {1724		kind == MEMBER_ASSERT_STMT1725	}1726	fn cast(syntax: SyntaxNode) -> Option<Self> {1727		if Self::can_cast(syntax.kind()) {1728			Some(Self { syntax })1729		} else {1730			None1731		}1732	}1733	fn syntax(&self) -> &SyntaxNode {1734		&self.syntax1735	}1736}1737impl AstNode for MemberField {1738	fn can_cast(kind: SyntaxKind) -> bool {1739		kind == MEMBER_FIELD1740	}1741	fn cast(syntax: SyntaxNode) -> Option<Self> {1742		if Self::can_cast(syntax.kind()) {1743			Some(Self { syntax })1744		} else {1745			None1746		}1747	}1748	fn syntax(&self) -> &SyntaxNode {1749		&self.syntax1750	}1751}1752impl AstNode for FieldNormal {1753	fn can_cast(kind: SyntaxKind) -> bool {1754		kind == FIELD_NORMAL1755	}1756	fn cast(syntax: SyntaxNode) -> Option<Self> {1757		if Self::can_cast(syntax.kind()) {1758			Some(Self { syntax })1759		} else {1760			None1761		}1762	}1763	fn syntax(&self) -> &SyntaxNode {1764		&self.syntax1765	}1766}1767impl AstNode for FieldMethod {1768	fn can_cast(kind: SyntaxKind) -> bool {1769		kind == FIELD_METHOD1770	}1771	fn cast(syntax: SyntaxNode) -> Option<Self> {1772		if Self::can_cast(syntax.kind()) {1773			Some(Self { syntax })1774		} else {1775			None1776		}1777	}1778	fn syntax(&self) -> &SyntaxNode {1779		&self.syntax1780	}1781}1782impl AstNode for FieldNameFixed {1783	fn can_cast(kind: SyntaxKind) -> bool {1784		kind == FIELD_NAME_FIXED1785	}1786	fn cast(syntax: SyntaxNode) -> Option<Self> {1787		if Self::can_cast(syntax.kind()) {1788			Some(Self { syntax })1789		} else {1790			None1791		}1792	}1793	fn syntax(&self) -> &SyntaxNode {1794		&self.syntax1795	}1796}1797impl AstNode for FieldNameDynamic {1798	fn can_cast(kind: SyntaxKind) -> bool {1799		kind == FIELD_NAME_DYNAMIC1800	}1801	fn cast(syntax: SyntaxNode) -> Option<Self> {1802		if Self::can_cast(syntax.kind()) {1803			Some(Self { syntax })1804		} else {1805			None1806		}1807	}1808	fn syntax(&self) -> &SyntaxNode {1809		&self.syntax1810	}1811}1812impl AstNode for ForSpec {1813	fn can_cast(kind: SyntaxKind) -> bool {1814		kind == FOR_SPEC1815	}1816	fn cast(syntax: SyntaxNode) -> Option<Self> {1817		if Self::can_cast(syntax.kind()) {1818			Some(Self { syntax })1819		} else {1820			None1821		}1822	}1823	fn syntax(&self) -> &SyntaxNode {1824		&self.syntax1825	}1826}1827impl AstNode for IfSpec {1828	fn can_cast(kind: SyntaxKind) -> bool {1829		kind == IF_SPEC1830	}1831	fn cast(syntax: SyntaxNode) -> Option<Self> {1832		if Self::can_cast(syntax.kind()) {1833			Some(Self { syntax })1834		} else {1835			None1836		}1837	}1838	fn syntax(&self) -> &SyntaxNode {1839		&self.syntax1840	}1841}1842impl AstNode for BindDestruct {1843	fn can_cast(kind: SyntaxKind) -> bool {1844		kind == BIND_DESTRUCT1845	}1846	fn cast(syntax: SyntaxNode) -> Option<Self> {1847		if Self::can_cast(syntax.kind()) {1848			Some(Self { syntax })1849		} else {1850			None1851		}1852	}1853	fn syntax(&self) -> &SyntaxNode {1854		&self.syntax1855	}1856}1857impl AstNode for BindFunction {1858	fn can_cast(kind: SyntaxKind) -> bool {1859		kind == BIND_FUNCTION1860	}1861	fn cast(syntax: SyntaxNode) -> Option<Self> {1862		if Self::can_cast(syntax.kind()) {1863			Some(Self { syntax })1864		} else {1865			None1866		}1867	}1868	fn syntax(&self) -> &SyntaxNode {1869		&self.syntax1870	}1871}1872impl AstNode for Param {1873	fn can_cast(kind: SyntaxKind) -> bool {1874		kind == PARAM1875	}1876	fn cast(syntax: SyntaxNode) -> Option<Self> {1877		if Self::can_cast(syntax.kind()) {1878			Some(Self { syntax })1879		} else {1880			None1881		}1882	}1883	fn syntax(&self) -> &SyntaxNode {1884		&self.syntax1885	}1886}1887impl AstNode for DestructFull {1888	fn can_cast(kind: SyntaxKind) -> bool {1889		kind == DESTRUCT_FULL1890	}1891	fn cast(syntax: SyntaxNode) -> Option<Self> {1892		if Self::can_cast(syntax.kind()) {1893			Some(Self { syntax })1894		} else {1895			None1896		}1897	}1898	fn syntax(&self) -> &SyntaxNode {1899		&self.syntax1900	}1901}1902impl AstNode for DestructSkip {1903	fn can_cast(kind: SyntaxKind) -> bool {1904		kind == DESTRUCT_SKIP1905	}1906	fn cast(syntax: SyntaxNode) -> Option<Self> {1907		if Self::can_cast(syntax.kind()) {1908			Some(Self { syntax })1909		} else {1910			None1911		}1912	}1913	fn syntax(&self) -> &SyntaxNode {1914		&self.syntax1915	}1916}1917impl AstNode for DestructArray {1918	fn can_cast(kind: SyntaxKind) -> bool {1919		kind == DESTRUCT_ARRAY1920	}1921	fn cast(syntax: SyntaxNode) -> Option<Self> {1922		if Self::can_cast(syntax.kind()) {1923			Some(Self { syntax })1924		} else {1925			None1926		}1927	}1928	fn syntax(&self) -> &SyntaxNode {1929		&self.syntax1930	}1931}1932impl AstNode for DestructObject {1933	fn can_cast(kind: SyntaxKind) -> bool {1934		kind == DESTRUCT_OBJECT1935	}1936	fn cast(syntax: SyntaxNode) -> Option<Self> {1937		if Self::can_cast(syntax.kind()) {1938			Some(Self { syntax })1939		} else {1940			None1941		}1942	}1943	fn syntax(&self) -> &SyntaxNode {1944		&self.syntax1945	}1946}1947impl AstNode for DestructObjectField {1948	fn can_cast(kind: SyntaxKind) -> bool {1949		kind == DESTRUCT_OBJECT_FIELD1950	}1951	fn cast(syntax: SyntaxNode) -> Option<Self> {1952		if Self::can_cast(syntax.kind()) {1953			Some(Self { syntax })1954		} else {1955			None1956		}1957	}1958	fn syntax(&self) -> &SyntaxNode {1959		&self.syntax1960	}1961}1962impl AstNode for DestructRest {1963	fn can_cast(kind: SyntaxKind) -> bool {1964		kind == DESTRUCT_REST1965	}1966	fn cast(syntax: SyntaxNode) -> Option<Self> {1967		if Self::can_cast(syntax.kind()) {1968			Some(Self { syntax })1969		} else {1970			None1971		}1972	}1973	fn syntax(&self) -> &SyntaxNode {1974		&self.syntax1975	}1976}1977impl AstNode for DestructArrayElement {1978	fn can_cast(kind: SyntaxKind) -> bool {1979		kind == DESTRUCT_ARRAY_ELEMENT1980	}1981	fn cast(syntax: SyntaxNode) -> Option<Self> {1982		if Self::can_cast(syntax.kind()) {1983			Some(Self { syntax })1984		} else {1985			None1986		}1987	}1988	fn syntax(&self) -> &SyntaxNode {1989		&self.syntax1990	}1991}1992impl From<ExprBinary> for Expr {1993	fn from(node: ExprBinary) -> Expr {1994		Expr::ExprBinary(node)1995	}1996}1997impl From<ExprUnary> for Expr {1998	fn from(node: ExprUnary) -> Expr {1999		Expr::ExprUnary(node)2000	}2001}2002impl From<ExprSlice> for Expr {2003	fn from(node: ExprSlice) -> Expr {2004		Expr::ExprSlice(node)2005	}2006}2007impl From<ExprIndex> for Expr {2008	fn from(node: ExprIndex) -> Expr {2009		Expr::ExprIndex(node)2010	}2011}2012impl From<ExprIndexExpr> for Expr {2013	fn from(node: ExprIndexExpr) -> Expr {2014		Expr::ExprIndexExpr(node)2015	}2016}2017impl From<ExprApply> for Expr {2018	fn from(node: ExprApply) -> Expr {2019		Expr::ExprApply(node)2020	}2021}2022impl From<ExprObjExtend> for Expr {2023	fn from(node: ExprObjExtend) -> Expr {2024		Expr::ExprObjExtend(node)2025	}2026}2027impl From<ExprParened> for Expr {2028	fn from(node: ExprParened) -> Expr {2029		Expr::ExprParened(node)2030	}2031}2032impl From<ExprIntrinsicThisFile> for Expr {2033	fn from(node: ExprIntrinsicThisFile) -> Expr {2034		Expr::ExprIntrinsicThisFile(node)2035	}2036}2037impl From<ExprIntrinsicId> for Expr {2038	fn from(node: ExprIntrinsicId) -> Expr {2039		Expr::ExprIntrinsicId(node)2040	}2041}2042impl From<ExprIntrinsic> for Expr {2043	fn from(node: ExprIntrinsic) -> Expr {2044		Expr::ExprIntrinsic(node)2045	}2046}2047impl From<ExprString> for Expr {2048	fn from(node: ExprString) -> Expr {2049		Expr::ExprString(node)2050	}2051}2052impl From<ExprNumber> for Expr {2053	fn from(node: ExprNumber) -> Expr {2054		Expr::ExprNumber(node)2055	}2056}2057impl From<ExprLiteral> for Expr {2058	fn from(node: ExprLiteral) -> Expr {2059		Expr::ExprLiteral(node)2060	}2061}2062impl From<ExprArray> for Expr {2063	fn from(node: ExprArray) -> Expr {2064		Expr::ExprArray(node)2065	}2066}2067impl From<ExprObject> for Expr {2068	fn from(node: ExprObject) -> Expr {2069		Expr::ExprObject(node)2070	}2071}2072impl From<ExprArrayComp> for Expr {2073	fn from(node: ExprArrayComp) -> Expr {2074		Expr::ExprArrayComp(node)2075	}2076}2077impl From<ExprImport> for Expr {2078	fn from(node: ExprImport) -> Expr {2079		Expr::ExprImport(node)2080	}2081}2082impl From<ExprVar> for Expr {2083	fn from(node: ExprVar) -> Expr {2084		Expr::ExprVar(node)2085	}2086}2087impl From<ExprLocal> for Expr {2088	fn from(node: ExprLocal) -> Expr {2089		Expr::ExprLocal(node)2090	}2091}2092impl From<ExprIfThenElse> for Expr {2093	fn from(node: ExprIfThenElse) -> Expr {2094		Expr::ExprIfThenElse(node)2095	}2096}2097impl From<ExprFunction> for Expr {2098	fn from(node: ExprFunction) -> Expr {2099		Expr::ExprFunction(node)2100	}2101}2102impl From<ExprAssert> for Expr {2103	fn from(node: ExprAssert) -> Expr {2104		Expr::ExprAssert(node)2105	}2106}2107impl From<ExprError> for Expr {2108	fn from(node: ExprError) -> Expr {2109		Expr::ExprError(node)2110	}2111}2112impl AstNode for Expr {2113	fn can_cast(kind: SyntaxKind) -> bool {2114		match kind {2115			EXPR_BINARY2116			| EXPR_UNARY2117			| EXPR_SLICE2118			| EXPR_INDEX2119			| EXPR_INDEX_EXPR2120			| EXPR_APPLY2121			| EXPR_OBJ_EXTEND2122			| EXPR_PARENED2123			| EXPR_INTRINSIC_THIS_FILE2124			| EXPR_INTRINSIC_ID2125			| EXPR_INTRINSIC2126			| EXPR_STRING2127			| EXPR_NUMBER2128			| EXPR_LITERAL2129			| EXPR_ARRAY2130			| EXPR_OBJECT2131			| EXPR_ARRAY_COMP2132			| EXPR_IMPORT2133			| EXPR_VAR2134			| EXPR_LOCAL2135			| EXPR_IF_THEN_ELSE2136			| EXPR_FUNCTION2137			| EXPR_ASSERT2138			| EXPR_ERROR => true,2139			_ => false,2140		}2141	}2142	fn cast(syntax: SyntaxNode) -> Option<Self> {2143		let res = match syntax.kind() {2144			EXPR_BINARY => Expr::ExprBinary(ExprBinary { syntax }),2145			EXPR_UNARY => Expr::ExprUnary(ExprUnary { syntax }),2146			EXPR_SLICE => Expr::ExprSlice(ExprSlice { syntax }),2147			EXPR_INDEX => Expr::ExprIndex(ExprIndex { syntax }),2148			EXPR_INDEX_EXPR => Expr::ExprIndexExpr(ExprIndexExpr { syntax }),2149			EXPR_APPLY => Expr::ExprApply(ExprApply { syntax }),2150			EXPR_OBJ_EXTEND => Expr::ExprObjExtend(ExprObjExtend { syntax }),2151			EXPR_PARENED => Expr::ExprParened(ExprParened { syntax }),2152			EXPR_INTRINSIC_THIS_FILE => {2153				Expr::ExprIntrinsicThisFile(ExprIntrinsicThisFile { syntax })2154			}2155			EXPR_INTRINSIC_ID => Expr::ExprIntrinsicId(ExprIntrinsicId { syntax }),2156			EXPR_INTRINSIC => Expr::ExprIntrinsic(ExprIntrinsic { syntax }),2157			EXPR_STRING => Expr::ExprString(ExprString { syntax }),2158			EXPR_NUMBER => Expr::ExprNumber(ExprNumber { syntax }),2159			EXPR_LITERAL => Expr::ExprLiteral(ExprLiteral { syntax }),2160			EXPR_ARRAY => Expr::ExprArray(ExprArray { syntax }),2161			EXPR_OBJECT => Expr::ExprObject(ExprObject { syntax }),2162			EXPR_ARRAY_COMP => Expr::ExprArrayComp(ExprArrayComp { syntax }),2163			EXPR_IMPORT => Expr::ExprImport(ExprImport { syntax }),2164			EXPR_VAR => Expr::ExprVar(ExprVar { syntax }),2165			EXPR_LOCAL => Expr::ExprLocal(ExprLocal { syntax }),2166			EXPR_IF_THEN_ELSE => Expr::ExprIfThenElse(ExprIfThenElse { syntax }),2167			EXPR_FUNCTION => Expr::ExprFunction(ExprFunction { syntax }),2168			EXPR_ASSERT => Expr::ExprAssert(ExprAssert { syntax }),2169			EXPR_ERROR => Expr::ExprError(ExprError { syntax }),2170			_ => return None,2171		};2172		Some(res)2173	}2174	fn syntax(&self) -> &SyntaxNode {2175		match self {2176			Expr::ExprBinary(it) => &it.syntax,2177			Expr::ExprUnary(it) => &it.syntax,2178			Expr::ExprSlice(it) => &it.syntax,2179			Expr::ExprIndex(it) => &it.syntax,2180			Expr::ExprIndexExpr(it) => &it.syntax,2181			Expr::ExprApply(it) => &it.syntax,2182			Expr::ExprObjExtend(it) => &it.syntax,2183			Expr::ExprParened(it) => &it.syntax,2184			Expr::ExprIntrinsicThisFile(it) => &it.syntax,2185			Expr::ExprIntrinsicId(it) => &it.syntax,2186			Expr::ExprIntrinsic(it) => &it.syntax,2187			Expr::ExprString(it) => &it.syntax,2188			Expr::ExprNumber(it) => &it.syntax,2189			Expr::ExprLiteral(it) => &it.syntax,2190			Expr::ExprArray(it) => &it.syntax,2191			Expr::ExprObject(it) => &it.syntax,2192			Expr::ExprArrayComp(it) => &it.syntax,2193			Expr::ExprImport(it) => &it.syntax,2194			Expr::ExprVar(it) => &it.syntax,2195			Expr::ExprLocal(it) => &it.syntax,2196			Expr::ExprIfThenElse(it) => &it.syntax,2197			Expr::ExprFunction(it) => &it.syntax,2198			Expr::ExprAssert(it) => &it.syntax,2199			Expr::ExprError(it) => &it.syntax,2200		}2201	}2202}2203impl From<ObjBodyComp> for ObjBody {2204	fn from(node: ObjBodyComp) -> ObjBody {2205		ObjBody::ObjBodyComp(node)2206	}2207}2208impl From<ObjBodyMemberList> for ObjBody {2209	fn from(node: ObjBodyMemberList) -> ObjBody {2210		ObjBody::ObjBodyMemberList(node)2211	}2212}2213impl AstNode for ObjBody {2214	fn can_cast(kind: SyntaxKind) -> bool {2215		match kind {2216			OBJ_BODY_COMP | OBJ_BODY_MEMBER_LIST => true,2217			_ => false,2218		}2219	}2220	fn cast(syntax: SyntaxNode) -> Option<Self> {2221		let res = match syntax.kind() {2222			OBJ_BODY_COMP => ObjBody::ObjBodyComp(ObjBodyComp { syntax }),2223			OBJ_BODY_MEMBER_LIST => ObjBody::ObjBodyMemberList(ObjBodyMemberList { syntax }),2224			_ => return None,2225		};2226		Some(res)2227	}2228	fn syntax(&self) -> &SyntaxNode {2229		match self {2230			ObjBody::ObjBodyComp(it) => &it.syntax,2231			ObjBody::ObjBodyMemberList(it) => &it.syntax,2232		}2233	}2234}2235impl From<ForSpec> for CompSpec {2236	fn from(node: ForSpec) -> CompSpec {2237		CompSpec::ForSpec(node)2238	}2239}2240impl From<IfSpec> for CompSpec {2241	fn from(node: IfSpec) -> CompSpec {2242		CompSpec::IfSpec(node)2243	}2244}2245impl AstNode for CompSpec {2246	fn can_cast(kind: SyntaxKind) -> bool {2247		match kind {2248			FOR_SPEC | IF_SPEC => true,2249			_ => false,2250		}2251	}2252	fn cast(syntax: SyntaxNode) -> Option<Self> {2253		let res = match syntax.kind() {2254			FOR_SPEC => CompSpec::ForSpec(ForSpec { syntax }),2255			IF_SPEC => CompSpec::IfSpec(IfSpec { syntax }),2256			_ => return None,2257		};2258		Some(res)2259	}2260	fn syntax(&self) -> &SyntaxNode {2261		match self {2262			CompSpec::ForSpec(it) => &it.syntax,2263			CompSpec::IfSpec(it) => &it.syntax,2264		}2265	}2266}2267impl From<BindDestruct> for Bind {2268	fn from(node: BindDestruct) -> Bind {2269		Bind::BindDestruct(node)2270	}2271}2272impl From<BindFunction> for Bind {2273	fn from(node: BindFunction) -> Bind {2274		Bind::BindFunction(node)2275	}2276}2277impl AstNode for Bind {2278	fn can_cast(kind: SyntaxKind) -> bool {2279		match kind {2280			BIND_DESTRUCT | BIND_FUNCTION => true,2281			_ => false,2282		}2283	}2284	fn cast(syntax: SyntaxNode) -> Option<Self> {2285		let res = match syntax.kind() {2286			BIND_DESTRUCT => Bind::BindDestruct(BindDestruct { syntax }),2287			BIND_FUNCTION => Bind::BindFunction(BindFunction { syntax }),2288			_ => return None,2289		};2290		Some(res)2291	}2292	fn syntax(&self) -> &SyntaxNode {2293		match self {2294			Bind::BindDestruct(it) => &it.syntax,2295			Bind::BindFunction(it) => &it.syntax,2296		}2297	}2298}2299impl From<MemberBindStmt> for Member {2300	fn from(node: MemberBindStmt) -> Member {2301		Member::MemberBindStmt(node)2302	}2303}2304impl From<MemberAssertStmt> for Member {2305	fn from(node: MemberAssertStmt) -> Member {2306		Member::MemberAssertStmt(node)2307	}2308}2309impl From<MemberField> for Member {2310	fn from(node: MemberField) -> Member {2311		Member::MemberField(node)2312	}2313}2314impl AstNode for Member {2315	fn can_cast(kind: SyntaxKind) -> bool {2316		match kind {2317			MEMBER_BIND_STMT | MEMBER_ASSERT_STMT | MEMBER_FIELD => true,2318			_ => false,2319		}2320	}2321	fn cast(syntax: SyntaxNode) -> Option<Self> {2322		let res = match syntax.kind() {2323			MEMBER_BIND_STMT => Member::MemberBindStmt(MemberBindStmt { syntax }),2324			MEMBER_ASSERT_STMT => Member::MemberAssertStmt(MemberAssertStmt { syntax }),2325			MEMBER_FIELD => Member::MemberField(MemberField { syntax }),2326			_ => return None,2327		};2328		Some(res)2329	}2330	fn syntax(&self) -> &SyntaxNode {2331		match self {2332			Member::MemberBindStmt(it) => &it.syntax,2333			Member::MemberAssertStmt(it) => &it.syntax,2334			Member::MemberField(it) => &it.syntax,2335		}2336	}2337}2338impl From<FieldNormal> for Field {2339	fn from(node: FieldNormal) -> Field {2340		Field::FieldNormal(node)2341	}2342}2343impl From<FieldMethod> for Field {2344	fn from(node: FieldMethod) -> Field {2345		Field::FieldMethod(node)2346	}2347}2348impl AstNode for Field {2349	fn can_cast(kind: SyntaxKind) -> bool {2350		match kind {2351			FIELD_NORMAL | FIELD_METHOD => true,2352			_ => false,2353		}2354	}2355	fn cast(syntax: SyntaxNode) -> Option<Self> {2356		let res = match syntax.kind() {2357			FIELD_NORMAL => Field::FieldNormal(FieldNormal { syntax }),2358			FIELD_METHOD => Field::FieldMethod(FieldMethod { syntax }),2359			_ => return None,2360		};2361		Some(res)2362	}2363	fn syntax(&self) -> &SyntaxNode {2364		match self {2365			Field::FieldNormal(it) => &it.syntax,2366			Field::FieldMethod(it) => &it.syntax,2367		}2368	}2369}2370impl From<FieldNameFixed> for FieldName {2371	fn from(node: FieldNameFixed) -> FieldName {2372		FieldName::FieldNameFixed(node)2373	}2374}2375impl From<FieldNameDynamic> for FieldName {2376	fn from(node: FieldNameDynamic) -> FieldName {2377		FieldName::FieldNameDynamic(node)2378	}2379}2380impl AstNode for FieldName {2381	fn can_cast(kind: SyntaxKind) -> bool {2382		match kind {2383			FIELD_NAME_FIXED | FIELD_NAME_DYNAMIC => true,2384			_ => false,2385		}2386	}2387	fn cast(syntax: SyntaxNode) -> Option<Self> {2388		let res = match syntax.kind() {2389			FIELD_NAME_FIXED => FieldName::FieldNameFixed(FieldNameFixed { syntax }),2390			FIELD_NAME_DYNAMIC => FieldName::FieldNameDynamic(FieldNameDynamic { syntax }),2391			_ => return None,2392		};2393		Some(res)2394	}2395	fn syntax(&self) -> &SyntaxNode {2396		match self {2397			FieldName::FieldNameFixed(it) => &it.syntax,2398			FieldName::FieldNameDynamic(it) => &it.syntax,2399		}2400	}2401}2402impl From<DestructFull> for Destruct {2403	fn from(node: DestructFull) -> Destruct {2404		Destruct::DestructFull(node)2405	}2406}2407impl From<DestructSkip> for Destruct {2408	fn from(node: DestructSkip) -> Destruct {2409		Destruct::DestructSkip(node)2410	}2411}2412impl From<DestructArray> for Destruct {2413	fn from(node: DestructArray) -> Destruct {2414		Destruct::DestructArray(node)2415	}2416}2417impl From<DestructObject> for Destruct {2418	fn from(node: DestructObject) -> Destruct {2419		Destruct::DestructObject(node)2420	}2421}2422impl AstNode for Destruct {2423	fn can_cast(kind: SyntaxKind) -> bool {2424		match kind {2425			DESTRUCT_FULL | DESTRUCT_SKIP | DESTRUCT_ARRAY | DESTRUCT_OBJECT => true,2426			_ => false,2427		}2428	}2429	fn cast(syntax: SyntaxNode) -> Option<Self> {2430		let res = match syntax.kind() {2431			DESTRUCT_FULL => Destruct::DestructFull(DestructFull { syntax }),2432			DESTRUCT_SKIP => Destruct::DestructSkip(DestructSkip { syntax }),2433			DESTRUCT_ARRAY => Destruct::DestructArray(DestructArray { syntax }),2434			DESTRUCT_OBJECT => Destruct::DestructObject(DestructObject { syntax }),2435			_ => return None,2436		};2437		Some(res)2438	}2439	fn syntax(&self) -> &SyntaxNode {2440		match self {2441			Destruct::DestructFull(it) => &it.syntax,2442			Destruct::DestructSkip(it) => &it.syntax,2443			Destruct::DestructArray(it) => &it.syntax,2444			Destruct::DestructObject(it) => &it.syntax,2445		}2446	}2447}2448impl From<DestructArrayElement> for DestructArrayPart {2449	fn from(node: DestructArrayElement) -> DestructArrayPart {2450		DestructArrayPart::DestructArrayElement(node)2451	}2452}2453impl From<DestructRest> for DestructArrayPart {2454	fn from(node: DestructRest) -> DestructArrayPart {2455		DestructArrayPart::DestructRest(node)2456	}2457}2458impl AstNode for DestructArrayPart {2459	fn can_cast(kind: SyntaxKind) -> bool {2460		match kind {2461			DESTRUCT_ARRAY_ELEMENT | DESTRUCT_REST => true,2462			_ => false,2463		}2464	}2465	fn cast(syntax: SyntaxNode) -> Option<Self> {2466		let res = match syntax.kind() {2467			DESTRUCT_ARRAY_ELEMENT => {2468				DestructArrayPart::DestructArrayElement(DestructArrayElement { syntax })2469			}2470			DESTRUCT_REST => DestructArrayPart::DestructRest(DestructRest { syntax }),2471			_ => return None,2472		};2473		Some(res)2474	}2475	fn syntax(&self) -> &SyntaxNode {2476		match self {2477			DestructArrayPart::DestructArrayElement(it) => &it.syntax,2478			DestructArrayPart::DestructRest(it) => &it.syntax,2479		}2480	}2481}2482impl AstToken for BinaryOperator {2483	fn can_cast(kind: SyntaxKind) -> bool {2484		match kind {2485			OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | IN_KW | LHS2486			| RHS | PLUS | MINUS | MUL | DIV | MODULO | ERROR_NO_OPERATOR => true,2487			_ => false,2488		}2489	}2490	fn cast(syntax: SyntaxToken) -> Option<Self> {2491		let res = match syntax.kind() {2492			OR => BinaryOperator {2493				syntax,2494				kind: BinaryOperatorKind::Or,2495			},2496			AND => BinaryOperator {2497				syntax,2498				kind: BinaryOperatorKind::And,2499			},2500			BIT_OR => BinaryOperator {2501				syntax,2502				kind: BinaryOperatorKind::BitOr,2503			},2504			BIT_XOR => BinaryOperator {2505				syntax,2506				kind: BinaryOperatorKind::BitXor,2507			},2508			BIT_AND => BinaryOperator {2509				syntax,2510				kind: BinaryOperatorKind::BitAnd,2511			},2512			EQ => BinaryOperator {2513				syntax,2514				kind: BinaryOperatorKind::Eq,2515			},2516			NE => BinaryOperator {2517				syntax,2518				kind: BinaryOperatorKind::Ne,2519			},2520			LT => BinaryOperator {2521				syntax,2522				kind: BinaryOperatorKind::Lt,2523			},2524			GT => BinaryOperator {2525				syntax,2526				kind: BinaryOperatorKind::Gt,2527			},2528			LE => BinaryOperator {2529				syntax,2530				kind: BinaryOperatorKind::Le,2531			},2532			GE => BinaryOperator {2533				syntax,2534				kind: BinaryOperatorKind::Ge,2535			},2536			IN_KW => BinaryOperator {2537				syntax,2538				kind: BinaryOperatorKind::InKw,2539			},2540			LHS => BinaryOperator {2541				syntax,2542				kind: BinaryOperatorKind::Lhs,2543			},2544			RHS => BinaryOperator {2545				syntax,2546				kind: BinaryOperatorKind::Rhs,2547			},2548			PLUS => BinaryOperator {2549				syntax,2550				kind: BinaryOperatorKind::Plus,2551			},2552			MINUS => BinaryOperator {2553				syntax,2554				kind: BinaryOperatorKind::Minus,2555			},2556			MUL => BinaryOperator {2557				syntax,2558				kind: BinaryOperatorKind::Mul,2559			},2560			DIV => BinaryOperator {2561				syntax,2562				kind: BinaryOperatorKind::Div,2563			},2564			MODULO => BinaryOperator {2565				syntax,2566				kind: BinaryOperatorKind::Modulo,2567			},2568			ERROR_NO_OPERATOR => BinaryOperator {2569				syntax,2570				kind: BinaryOperatorKind::ErrorNoOperator,2571			},2572			_ => return None,2573		};2574		Some(res)2575	}2576	fn syntax(&self) -> &SyntaxToken {2577		&self.syntax2578	}2579}2580impl BinaryOperator {2581	pub fn kind(&self) -> BinaryOperatorKind {2582		self.kind2583	}2584}2585impl std::fmt::Display for BinaryOperator {2586	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2587		std::fmt::Display::fmt(self.syntax(), f)2588	}2589}2590impl AstToken for UnaryOperator {2591	fn can_cast(kind: SyntaxKind) -> bool {2592		match kind {2593			MINUS | NOT | BIT_NOT => true,2594			_ => false,2595		}2596	}2597	fn cast(syntax: SyntaxToken) -> Option<Self> {2598		let res = match syntax.kind() {2599			MINUS => UnaryOperator {2600				syntax,2601				kind: UnaryOperatorKind::Minus,2602			},2603			NOT => UnaryOperator {2604				syntax,2605				kind: UnaryOperatorKind::Not,2606			},2607			BIT_NOT => UnaryOperator {2608				syntax,2609				kind: UnaryOperatorKind::BitNot,2610			},2611			_ => return None,2612		};2613		Some(res)2614	}2615	fn syntax(&self) -> &SyntaxToken {2616		&self.syntax2617	}2618}2619impl UnaryOperator {2620	pub fn kind(&self) -> UnaryOperatorKind {2621		self.kind2622	}2623}2624impl std::fmt::Display for UnaryOperator {2625	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2626		std::fmt::Display::fmt(self.syntax(), f)2627	}2628}2629impl AstToken for Literal {2630	fn can_cast(kind: SyntaxKind) -> bool {2631		match kind {2632			NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | DOLLAR | SUPER_KW => true,2633			_ => false,2634		}2635	}2636	fn cast(syntax: SyntaxToken) -> Option<Self> {2637		let res = match syntax.kind() {2638			NULL_KW => Literal {2639				syntax,2640				kind: LiteralKind::NullKw,2641			},2642			TRUE_KW => Literal {2643				syntax,2644				kind: LiteralKind::TrueKw,2645			},2646			FALSE_KW => Literal {2647				syntax,2648				kind: LiteralKind::FalseKw,2649			},2650			SELF_KW => Literal {2651				syntax,2652				kind: LiteralKind::SelfKw,2653			},2654			DOLLAR => Literal {2655				syntax,2656				kind: LiteralKind::Dollar,2657			},2658			SUPER_KW => Literal {2659				syntax,2660				kind: LiteralKind::SuperKw,2661			},2662			_ => return None,2663		};2664		Some(res)2665	}2666	fn syntax(&self) -> &SyntaxToken {2667		&self.syntax2668	}2669}2670impl Literal {2671	pub fn kind(&self) -> LiteralKind {2672		self.kind2673	}2674}2675impl std::fmt::Display for Literal {2676	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2677		std::fmt::Display::fmt(self.syntax(), f)2678	}2679}2680impl AstToken for String {2681	fn can_cast(kind: SyntaxKind) -> bool {2682		match kind {2683			STRING_DOUBLE2684			| STRING_SINGLE2685			| STRING_DOUBLE_VERBATIM2686			| STRING_SINGLE_VERBATIM2687			| STRING_BLOCK => true,2688			_ => false,2689		}2690	}2691	fn cast(syntax: SyntaxToken) -> Option<Self> {2692		let res = match syntax.kind() {2693			STRING_DOUBLE => String {2694				syntax,2695				kind: StringKind::StringDouble,2696			},2697			STRING_SINGLE => String {2698				syntax,2699				kind: StringKind::StringSingle,2700			},2701			STRING_DOUBLE_VERBATIM => String {2702				syntax,2703				kind: StringKind::StringDoubleVerbatim,2704			},2705			STRING_SINGLE_VERBATIM => String {2706				syntax,2707				kind: StringKind::StringSingleVerbatim,2708			},2709			STRING_BLOCK => String {2710				syntax,2711				kind: StringKind::StringBlock,2712			},2713			_ => return None,2714		};2715		Some(res)2716	}2717	fn syntax(&self) -> &SyntaxToken {2718		&self.syntax2719	}2720}2721impl String {2722	pub fn kind(&self) -> StringKind {2723		self.kind2724	}2725}2726impl std::fmt::Display for String {2727	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2728		std::fmt::Display::fmt(self.syntax(), f)2729	}2730}2731impl AstToken for Number {2732	fn can_cast(kind: SyntaxKind) -> bool {2733		match kind {2734			FLOAT | META_FORCE_ENUM => true,2735			_ => false,2736		}2737	}2738	fn cast(syntax: SyntaxToken) -> Option<Self> {2739		let res = match syntax.kind() {2740			FLOAT => Number {2741				syntax,2742				kind: NumberKind::Float,2743			},2744			META_FORCE_ENUM => Number {2745				syntax,2746				kind: NumberKind::MetaForceEnum,2747			},2748			_ => return None,2749		};2750		Some(res)2751	}2752	fn syntax(&self) -> &SyntaxToken {2753		&self.syntax2754	}2755}2756impl Number {2757	pub fn kind(&self) -> NumberKind {2758		self.kind2759	}2760}2761impl std::fmt::Display for Number {2762	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2763		std::fmt::Display::fmt(self.syntax(), f)2764	}2765}2766impl AstToken for ImportKind {2767	fn can_cast(kind: SyntaxKind) -> bool {2768		match kind {2769			IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW => true,2770			_ => false,2771		}2772	}2773	fn cast(syntax: SyntaxToken) -> Option<Self> {2774		let res = match syntax.kind() {2775			IMPORTSTR_KW => ImportKind {2776				syntax,2777				kind: ImportKindKind::ImportstrKw,2778			},2779			IMPORTBIN_KW => ImportKind {2780				syntax,2781				kind: ImportKindKind::ImportbinKw,2782			},2783			IMPORT_KW => ImportKind {2784				syntax,2785				kind: ImportKindKind::ImportKw,2786			},2787			_ => return None,2788		};2789		Some(res)2790	}2791	fn syntax(&self) -> &SyntaxToken {2792		&self.syntax2793	}2794}2795impl ImportKind {2796	pub fn kind(&self) -> ImportKindKind {2797		self.kind2798	}2799}2800impl std::fmt::Display for ImportKind {2801	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2802		std::fmt::Display::fmt(self.syntax(), f)2803	}2804}2805impl AstToken for Visibility {2806	fn can_cast(kind: SyntaxKind) -> bool {2807		match kind {2808			COLONCOLONCOLON | COLONCOLON | COLON => true,2809			_ => false,2810		}2811	}2812	fn cast(syntax: SyntaxToken) -> Option<Self> {2813		let res = match syntax.kind() {2814			COLONCOLONCOLON => Visibility {2815				syntax,2816				kind: VisibilityKind::Coloncoloncolon,2817			},2818			COLONCOLON => Visibility {2819				syntax,2820				kind: VisibilityKind::Coloncolon,2821			},2822			COLON => Visibility {2823				syntax,2824				kind: VisibilityKind::Colon,2825			},2826			_ => return None,2827		};2828		Some(res)2829	}2830	fn syntax(&self) -> &SyntaxToken {2831		&self.syntax2832	}2833}2834impl Visibility {2835	pub fn kind(&self) -> VisibilityKind {2836		self.kind2837	}2838}2839impl std::fmt::Display for Visibility {2840	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2841		std::fmt::Display::fmt(self.syntax(), f)2842	}2843}2844impl std::fmt::Display for Expr {2845	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2846		std::fmt::Display::fmt(self.syntax(), f)2847	}2848}2849impl std::fmt::Display for ObjBody {2850	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2851		std::fmt::Display::fmt(self.syntax(), f)2852	}2853}2854impl std::fmt::Display for CompSpec {2855	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2856		std::fmt::Display::fmt(self.syntax(), f)2857	}2858}2859impl std::fmt::Display for Bind {2860	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2861		std::fmt::Display::fmt(self.syntax(), f)2862	}2863}2864impl std::fmt::Display for Member {2865	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2866		std::fmt::Display::fmt(self.syntax(), f)2867	}2868}2869impl std::fmt::Display for Field {2870	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2871		std::fmt::Display::fmt(self.syntax(), f)2872	}2873}2874impl std::fmt::Display for FieldName {2875	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2876		std::fmt::Display::fmt(self.syntax(), f)2877	}2878}2879impl std::fmt::Display for Destruct {2880	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2881		std::fmt::Display::fmt(self.syntax(), f)2882	}2883}2884impl std::fmt::Display for DestructArrayPart {2885	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2886		std::fmt::Display::fmt(self.syntax(), f)2887	}2888}2889impl std::fmt::Display for SourceFile {2890	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2891		std::fmt::Display::fmt(self.syntax(), f)2892	}2893}2894impl std::fmt::Display for ExprBinary {2895	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2896		std::fmt::Display::fmt(self.syntax(), f)2897	}2898}2899impl std::fmt::Display for LhsExpr {2900	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2901		std::fmt::Display::fmt(self.syntax(), f)2902	}2903}2904impl std::fmt::Display for ExprUnary {2905	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2906		std::fmt::Display::fmt(self.syntax(), f)2907	}2908}2909impl std::fmt::Display for ExprSlice {2910	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2911		std::fmt::Display::fmt(self.syntax(), f)2912	}2913}2914impl std::fmt::Display for SliceDesc {2915	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2916		std::fmt::Display::fmt(self.syntax(), f)2917	}2918}2919impl std::fmt::Display for ExprIndex {2920	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2921		std::fmt::Display::fmt(self.syntax(), f)2922	}2923}2924impl std::fmt::Display for Name {2925	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2926		std::fmt::Display::fmt(self.syntax(), f)2927	}2928}2929impl std::fmt::Display for ExprIndexExpr {2930	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2931		std::fmt::Display::fmt(self.syntax(), f)2932	}2933}2934impl std::fmt::Display for ExprApply {2935	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2936		std::fmt::Display::fmt(self.syntax(), f)2937	}2938}2939impl std::fmt::Display for ArgsDesc {2940	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2941		std::fmt::Display::fmt(self.syntax(), f)2942	}2943}2944impl std::fmt::Display for ExprObjExtend {2945	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2946		std::fmt::Display::fmt(self.syntax(), f)2947	}2948}2949impl std::fmt::Display for ExprParened {2950	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2951		std::fmt::Display::fmt(self.syntax(), f)2952	}2953}2954impl std::fmt::Display for ExprLiteral {2955	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2956		std::fmt::Display::fmt(self.syntax(), f)2957	}2958}2959impl std::fmt::Display for ExprIntrinsicThisFile {2960	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2961		std::fmt::Display::fmt(self.syntax(), f)2962	}2963}2964impl std::fmt::Display for ExprIntrinsicId {2965	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2966		std::fmt::Display::fmt(self.syntax(), f)2967	}2968}2969impl std::fmt::Display for ExprIntrinsic {2970	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2971		std::fmt::Display::fmt(self.syntax(), f)2972	}2973}2974impl std::fmt::Display for ExprString {2975	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2976		std::fmt::Display::fmt(self.syntax(), f)2977	}2978}2979impl std::fmt::Display for ExprNumber {2980	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2981		std::fmt::Display::fmt(self.syntax(), f)2982	}2983}2984impl std::fmt::Display for ExprArray {2985	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2986		std::fmt::Display::fmt(self.syntax(), f)2987	}2988}2989impl std::fmt::Display for ExprObject {2990	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2991		std::fmt::Display::fmt(self.syntax(), f)2992	}2993}2994impl std::fmt::Display for ExprArrayComp {2995	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2996		std::fmt::Display::fmt(self.syntax(), f)2997	}2998}2999impl std::fmt::Display for ExprImport {3000	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3001		std::fmt::Display::fmt(self.syntax(), f)3002	}3003}3004impl std::fmt::Display for ExprVar {3005	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3006		std::fmt::Display::fmt(self.syntax(), f)3007	}3008}3009impl std::fmt::Display for ExprLocal {3010	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3011		std::fmt::Display::fmt(self.syntax(), f)3012	}3013}3014impl std::fmt::Display for ExprIfThenElse {3015	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3016		std::fmt::Display::fmt(self.syntax(), f)3017	}3018}3019impl std::fmt::Display for TrueExpr {3020	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3021		std::fmt::Display::fmt(self.syntax(), f)3022	}3023}3024impl std::fmt::Display for FalseExpr {3025	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3026		std::fmt::Display::fmt(self.syntax(), f)3027	}3028}3029impl std::fmt::Display for ExprFunction {3030	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3031		std::fmt::Display::fmt(self.syntax(), f)3032	}3033}3034impl std::fmt::Display for ParamsDesc {3035	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3036		std::fmt::Display::fmt(self.syntax(), f)3037	}3038}3039impl std::fmt::Display for ExprAssert {3040	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3041		std::fmt::Display::fmt(self.syntax(), f)3042	}3043}3044impl std::fmt::Display for Assertion {3045	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3046		std::fmt::Display::fmt(self.syntax(), f)3047	}3048}3049impl std::fmt::Display for ExprError {3050	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3051		std::fmt::Display::fmt(self.syntax(), f)3052	}3053}3054impl std::fmt::Display for SliceDescEnd {3055	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3056		std::fmt::Display::fmt(self.syntax(), f)3057	}3058}3059impl std::fmt::Display for SliceDescStep {3060	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3061		std::fmt::Display::fmt(self.syntax(), f)3062	}3063}3064impl std::fmt::Display for Arg {3065	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3066		std::fmt::Display::fmt(self.syntax(), f)3067	}3068}3069impl std::fmt::Display for ObjBodyComp {3070	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3071		std::fmt::Display::fmt(self.syntax(), f)3072	}3073}3074impl std::fmt::Display for ObjLocalPostComma {3075	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3076		std::fmt::Display::fmt(self.syntax(), f)3077	}3078}3079impl std::fmt::Display for ObjLocalPreComma {3080	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3081		std::fmt::Display::fmt(self.syntax(), f)3082	}3083}3084impl std::fmt::Display for ObjBodyMemberList {3085	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3086		std::fmt::Display::fmt(self.syntax(), f)3087	}3088}3089impl std::fmt::Display for ObjLocal {3090	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3091		std::fmt::Display::fmt(self.syntax(), f)3092	}3093}3094impl std::fmt::Display for MemberBindStmt {3095	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3096		std::fmt::Display::fmt(self.syntax(), f)3097	}3098}3099impl std::fmt::Display for MemberAssertStmt {3100	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3101		std::fmt::Display::fmt(self.syntax(), f)3102	}3103}3104impl std::fmt::Display for MemberField {3105	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3106		std::fmt::Display::fmt(self.syntax(), f)3107	}3108}3109impl std::fmt::Display for FieldNormal {3110	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3111		std::fmt::Display::fmt(self.syntax(), f)3112	}3113}3114impl std::fmt::Display for FieldMethod {3115	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3116		std::fmt::Display::fmt(self.syntax(), f)3117	}3118}3119impl std::fmt::Display for FieldNameFixed {3120	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3121		std::fmt::Display::fmt(self.syntax(), f)3122	}3123}3124impl std::fmt::Display for FieldNameDynamic {3125	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3126		std::fmt::Display::fmt(self.syntax(), f)3127	}3128}3129impl std::fmt::Display for ForSpec {3130	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3131		std::fmt::Display::fmt(self.syntax(), f)3132	}3133}3134impl std::fmt::Display for IfSpec {3135	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3136		std::fmt::Display::fmt(self.syntax(), f)3137	}3138}3139impl std::fmt::Display for BindDestruct {3140	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3141		std::fmt::Display::fmt(self.syntax(), f)3142	}3143}3144impl std::fmt::Display for BindFunction {3145	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3146		std::fmt::Display::fmt(self.syntax(), f)3147	}3148}3149impl std::fmt::Display for Param {3150	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3151		std::fmt::Display::fmt(self.syntax(), f)3152	}3153}3154impl std::fmt::Display for DestructFull {3155	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3156		std::fmt::Display::fmt(self.syntax(), f)3157	}3158}3159impl std::fmt::Display for DestructSkip {3160	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3161		std::fmt::Display::fmt(self.syntax(), f)3162	}3163}3164impl std::fmt::Display for DestructArray {3165	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3166		std::fmt::Display::fmt(self.syntax(), f)3167	}3168}3169impl std::fmt::Display for DestructObject {3170	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3171		std::fmt::Display::fmt(self.syntax(), f)3172	}3173}3174impl std::fmt::Display for DestructObjectField {3175	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3176		std::fmt::Display::fmt(self.syntax(), f)3177	}3178}3179impl std::fmt::Display for DestructRest {3180	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3181		std::fmt::Display::fmt(self.syntax(), f)3182	}3183}3184impl std::fmt::Display for DestructArrayElement {3185	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3186		std::fmt::Display::fmt(self.syntax(), f)3187	}3188}
modifiedcrates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs
@@ -174,7 +174,6 @@
 	SELF_KW,
 	#[token("super")]
 	SUPER_KW,
-	META_FORCE_ENUM,
 	#[token("for")]
 	FOR_KW,
 	#[token("assert")]
@@ -253,10 +252,11 @@
 	BINARY_OPERATOR,
 	UNARY_OPERATOR,
 	LITERAL,
-	STRING,
+	TEXT,
 	NUMBER,
 	IMPORT_KIND,
 	VISIBILITY,
+	TRIVIA,
 	#[doc(hidden)]
 	__LAST,
 }
@@ -277,8 +277,8 @@
 	pub fn is_enum(self) -> bool {
 		match self {
 			EXPR | OBJ_BODY | COMP_SPEC | BIND | MEMBER | FIELD | FIELD_NAME | DESTRUCT
-			| DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR | LITERAL | STRING
-			| NUMBER | IMPORT_KIND | VISIBILITY => true,
+			| DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR | LITERAL | TEXT | NUMBER
+			| IMPORT_KIND | VISIBILITY | TRIVIA => true,
 			_ => false,
 		}
 	}
modifiedcrates/jrsonnet-rowan-parser/src/lex.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/lex.rs
+++ b/crates/jrsonnet-rowan-parser/src/lex.rs
@@ -4,7 +4,10 @@
 use logos::Logos;
 use rowan::{TextRange, TextSize};
 
-use crate::SyntaxKind;
+use crate::{
+	string_block::{lex_str_block, StringBlockError},
+	SyntaxKind,
+};
 
 pub struct Lexer<'a> {
 	inner: logos::Lexer<'a, SyntaxKind>,
@@ -22,9 +25,34 @@
 	type Item = Lexeme<'a>;
 
 	fn next(&mut self) -> Option<Self::Item> {
-		let kind = self.inner.next()?;
+		use SyntaxKind::*;
+
+		let mut kind = self.inner.next()?;
 		let text = self.inner.slice();
 
+		if kind == STRING_BLOCK {
+			// We use custom lexer, which skips enough bytes, but not returns error
+			// Instead we should call lexer again to verify if there is something wrong with string block
+			let mut lexer = logos::Lexer::<SyntaxKind>::new(text);
+			// In kinds, string blocks is parsed at least as `|||`
+			lexer.bump(3);
+			let res = lex_str_block(&mut lexer);
+			debug_assert!(lexer.next().is_none(), "str_block is lexed");
+			match res {
+				Ok(_) => {}
+				Err(e) => {
+					kind = match e {
+						StringBlockError::UnexpectedEnd => ERROR_STRING_BLOCK_UNEXPECTED_END,
+						StringBlockError::MissingNewLine => ERROR_STRING_BLOCK_MISSING_NEW_LINE,
+						StringBlockError::MissingTermination => {
+							ERROR_STRING_BLOCK_MISSING_TERMINATION
+						}
+						StringBlockError::MissingIndent => ERROR_STRING_BLOCK_MISSING_INDENT,
+					}
+				}
+			}
+		}
+
 		Some(Self::Item {
 			kind,
 			text,
modifiedcrates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/lib.rs
+++ b/crates/jrsonnet-rowan-parser/src/lib.rs
@@ -2,7 +2,6 @@
 
 mod ast;
 mod binary;
-mod classify;
 mod event;
 mod generated;
 mod language;
modifiedcrates/jrsonnet-rowan-parser/src/marker.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/marker.rs
+++ b/crates/jrsonnet-rowan-parser/src/marker.rs
@@ -44,10 +44,10 @@
 			!kind.is_enum(),
 			"{kind:?} is a enum kind, you should use variant kinds instead"
 		);
-		// TODO: is_parser should return true if enum variant has #[regex]/#[token] over it
+		// TODO: is_lexer should return true if enum variant has #[regex]/#[token] over it, or it is defined as lexer error explicitly
 		// debug_assert!(
-		// 	!kind.is_parser(),
-		// 	"{kind:?} should be only emitted by parser, not used directly"
+		// 	!kind.is_lexer(),
+		// 	"{kind:?} should be only emitted by lexer, not used directly"
 		// );
 		let event_at_pos = &mut p.events[self.start_event_idx];
 		assert_eq!(*event_at_pos, Event::Pending);
modifiedcrates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -8,10 +8,10 @@
 	event::Event,
 	lex::Lexeme,
 	marker::{AsRange, CompletedMarker, Marker, Ranger},
-	string_block::{lex_str_block, StringBlockError},
+	nodes::{Literal, Number, Text, Trivia},
 	token_set::SyntaxKindSet,
 	unary::UnaryOperator,
-	SyntaxKind,
+	AstToken, SyntaxKind,
 	SyntaxKind::*,
 	SyntaxNode, T, TS,
 };
@@ -36,6 +36,7 @@
 }
 
 pub struct Parser<'i> {
+	// TODO: remove all trivia before feeding to parser?
 	lexemes: &'i [Lexeme<'i>],
 	pub offset: usize,
 	pub events: Vec<Event>,
@@ -191,7 +192,7 @@
 		while self
 			.lexemes
 			.get(previous_token_idx)
-			.map_or(false, |l| l.kind.is_trivia())
+			.map_or(false, |l| Trivia::can_cast(l.kind))
 			&& previous_token_idx != 0
 		{
 			previous_token_idx -= 1;
@@ -200,13 +201,13 @@
 		Some(self.lexemes[previous_token_idx])
 	}
 	pub fn start_of_token(&self, mut idx: usize) -> TextSize {
-		while self.lexemes[idx].kind.is_trivia() {
+		while Trivia::can_cast(self.lexemes[idx].kind) {
 			idx += 1;
 		}
 		self.lexemes[idx].range.start()
 	}
 	pub fn end_of_token(&self, mut idx: usize) -> TextSize {
-		while self.lexemes[idx].kind.is_trivia() {
+		while Trivia::can_cast(self.lexemes[idx].kind) {
 			idx -= 1;
 		}
 		self.lexemes[idx].range.end()
@@ -267,7 +268,11 @@
 		self.bump();
 		Some(m.complete(self, SyntaxKind::ERROR))
 	}
-
+	fn bump_assert(&mut self, kind: SyntaxKind) {
+		self.skip_trivia();
+		assert!(self.at(kind), "expected {:?}", kind);
+		self.bump_remap(self.current());
+	}
 	fn bump(&mut self) {
 		self.skip_trivia();
 		self.bump_remap(self.current());
@@ -314,7 +319,7 @@
 			while self
 				.lexemes
 				.get(offset)
-				.map(|l| l.kind.is_trivia())
+				.map(|l| Trivia::can_cast(l.kind))
 				.unwrap_or(false)
 			{
 				offset += 1;
@@ -324,7 +329,7 @@
 		while self
 			.lexemes
 			.get(offset)
-			.map(|l| l.kind.is_trivia())
+			.map(|l| Trivia::can_cast(l.kind))
 			.unwrap_or(false)
 		{
 			offset += 1;
@@ -335,14 +340,10 @@
 		self.nth(0)
 	}
 	fn skip_trivia(&mut self) {
-		while self.peek_raw().is_trivia() {
+		while Trivia::can_cast(self.peek_raw()) {
 			self.offset += 1;
 		}
 	}
-	fn current_lexeme(&mut self) -> Option<&Lexeme> {
-		self.skip_trivia();
-		self.lexemes.get(self.offset)
-	}
 	fn peek_raw(&mut self) -> SyntaxKind {
 		self.lexemes
 			.get(self.offset)
@@ -516,8 +517,8 @@
 	} else if p.at(IDENT) {
 		name(p);
 		m.complete(p, FIELD_NAME_FIXED);
-	} else if p.current().is_string() {
-		string(p);
+	} else if Text::can_cast(p.current()) {
+		text(p);
 		m.complete(p, FIELD_NAME_FIXED);
 	} else {
 		p.error_with_recovery_set(TS![;]);
@@ -564,9 +565,8 @@
 	};
 }
 fn assertion(p: &mut Parser) {
-	assert!(p.at(T![assert]));
 	let m = p.start();
-	p.bump();
+	p.bump_assert(T![assert]);
 	expr(p).map(|c| c.wrap(p, LHS_EXPR));
 	if p.at(T![:]) {
 		p.bump();
@@ -575,10 +575,9 @@
 	m.complete(p, ASSERTION);
 }
 fn object(p: &mut Parser) -> CompletedMarker {
-	assert!(p.at(T!['{']));
 	let m_t = p.start();
 	let m = p.start();
-	p.bump();
+	p.bump_assert(T!['{']);
 
 	loop {
 		if p.at(T!['}']) {
@@ -619,9 +618,8 @@
 	m.complete(p, PARAM);
 }
 fn params_desc(p: &mut Parser) -> CompletedMarker {
-	assert!(p.at(T!['(']));
 	let m = p.start();
-	p.bump();
+	p.bump_assert(T!['(']);
 
 	loop {
 		if p.at(T![')']) {
@@ -640,8 +638,7 @@
 }
 fn args_desc(p: &mut Parser) {
 	let m = p.start();
-	assert!(p.at(T!['(']));
-	p.bump();
+	p.bump_assert(T!['(']);
 
 	let started_named = Cell::new(false);
 
@@ -674,10 +671,9 @@
 }
 
 fn array(p: &mut Parser) -> CompletedMarker {
-	assert!(p.at(T!['[']));
 	// Start the list node
 	let m = p.start();
-	p.bump(); // '['
+	p.bump_assert(T!['[']);
 
 	// This vec will have at most one element in case of correct input
 	let mut compspecs = Vec::with_capacity(1);
@@ -795,9 +791,8 @@
 	m.complete(p, NAME);
 }
 fn destruct_rest(p: &mut Parser) {
-	assert!(p.at(T![...]));
-	p.bump();
 	let m = p.start();
+	p.bump_assert(T![...]);
 	if p.at(IDENT) {
 		p.bump()
 	}
@@ -817,9 +812,8 @@
 	m.complete(p, DESTRUCT_OBJECT_FIELD);
 }
 fn obj_local(p: &mut Parser) {
-	assert!(p.at(T![local]));
 	let m = p.start();
-	p.bump();
+	p.bump_assert(T![local]);
 	bind(p);
 	m.complete(p, OBJ_LOCAL);
 }
@@ -903,52 +897,29 @@
 		m.complete(p, BIND_DESTRUCT)
 	};
 }
-fn string(p: &mut Parser) {
-	assert!(p.current().is_string());
-	if p.at(STRING_BLOCK) {
-		// We use custom lexer, which skips enough bytes, but not returns error
-		// Instead we should call lexer again to verify if there is something wrong with string block
-		let mut lexer = logos::Lexer::<SyntaxKind>::new(dbg!(
-			&p.current_lexeme().expect("parser is at string block").text
-		));
-		// In kinds, string blocks is parsed at least as `|||`
-		lexer.bump(3);
-		let res = lex_str_block(&mut lexer);
-		debug_assert!(lexer.next().is_none(), "str_block is lexed");
-		match res {
-			Ok(_) => {
-				p.bump();
-			}
-			Err(e) => p.bump_remap(match e {
-				StringBlockError::UnexpectedEnd => ERROR_STRING_BLOCK_UNEXPECTED_END,
-				StringBlockError::MissingNewLine => ERROR_STRING_BLOCK_MISSING_NEW_LINE,
-				StringBlockError::MissingTermination => ERROR_STRING_BLOCK_MISSING_TERMINATION,
-				StringBlockError::MissingIndent => ERROR_STRING_BLOCK_MISSING_INDENT,
-			}),
-		}
-	} else {
-		p.bump();
-	}
+fn text(p: &mut Parser) {
+	assert!(Text::can_cast(p.current()));
+	p.bump();
 }
 fn number(p: &mut Parser) {
-	assert!(p.current().is_number());
+	assert!(Number::can_cast(p.current()));
 	p.bump();
 }
 fn literal(p: &mut Parser) {
-	assert!(p.current().is_literal());
+	assert!(Literal::can_cast(p.current()));
 	p.bump();
 }
 fn lhs_basic(p: &mut Parser) -> Option<CompletedMarker> {
 	let _e = p.expected_syntax_name("value");
-	Some(if p.current().is_literal() {
+	Some(if Literal::can_cast(p.current()) {
 		let m = p.start();
 		literal(p);
 		m.complete(p, EXPR_LITERAL)
-	} else if p.current().is_string() {
+	} else if Text::can_cast(p.current()) {
 		let m = p.start();
-		string(p);
+		text(p);
 		m.complete(p, EXPR_STRING)
-	} else if p.current().is_number() {
+	} else if Number::can_cast(p.current()) {
 		let m = p.start();
 		number(p);
 		m.complete(p, EXPR_NUMBER)
@@ -1025,7 +996,7 @@
 	} else if p.at(T![import]) || p.at(T![importstr]) || p.at(T![importbin]) {
 		let m = p.start();
 		p.bump();
-		string(p);
+		text(p);
 		m.complete(p, EXPR_IMPORT)
 	} else if p.at(T![-]) || p.at(T![!]) || p.at(T![~]) {
 		let op = match p.current() {
@@ -1044,8 +1015,7 @@
 		let m = p.start();
 		p.bump();
 		expr(p);
-		assert!(p.at(T![')']));
-		p.bump();
+		p.expect(T![')']);
 		m.complete(p, EXPR_PARENED)
 	} else {
 		p.error_with_recovery_set(TS![]);
modifiedxtask/src/sourcegen/kinds.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/kinds.rs
+++ b/xtask/src/sourcegen/kinds.rs
@@ -10,10 +10,12 @@
 pub enum TokenKind {
 	/// May exist in token tree, but never in source code
 	Meta { grammar_name: String, name: String },
-	/// Specific parsing errors may be emitted as this type of kind
+	/// Specific parsing/lexing errors may be emitted as this type of kind
 	Error {
 		grammar_name: String,
 		name: String,
+		/// Is this error returned by lexer directly, or from lex.rs
+		is_lexer_error: bool,
 		regex: Option<String>,
 		priority: Option<u32>,
 	},
@@ -133,13 +135,18 @@
 		});
 		$(define_kinds!($into = $($rest)*))?
 	}};
-	($into:ident = error($name:literal$(, priority = $priority:literal)?) $(=> $regex:literal)? $(; $($rest:tt)*)?) => {{
-		$into.define_token(TokenKind::Error {
-			grammar_name: format!("ERROR_{}!", $name),
-			name: format!("ERROR_{}", $name),
-			regex: None$(.or(Some($regex.to_owned())))?,
-			priority: None$(.or(Some($priority)))?,
-		});
+	($into:ident = error($name:literal$(, priority = $priority:literal)? $(, lexer = $lexer:literal)?) $(=> $regex:literal)? $(; $($rest:tt)*)?) => {{
+		{
+			let regex = None$(.or(Some($regex.to_owned())))?;
+			let priority = None$(.or(Some($priority)))?;
+			$into.define_token(TokenKind::Error {
+				grammar_name: format!("ERROR_{}!", $name),
+				name: format!("ERROR_{}", $name),
+				is_lexer_error: false $(|| $lexer)? || regex.is_some() || priority.is_some(),
+				regex,
+				priority,
+			});
+		}
 		$(define_kinds!($into = $($rest)*))?
 	}};
 	($into:ident = $tok:literal => $name:literal $(; $($rest:tt)*)?) => {{
@@ -258,10 +265,10 @@
 		error("STRING_SINGLE_VERBATIM_UNTERMINATED") => "@'(?:[^']|'')*";
 		error("STRING_VERBATIM_MISSING_QUOTES") => "@[^\"'\\s]\\S+";
 		lit("STRING_BLOCK") => r"\|\|\|", "crate::string_block::lex_str_block_test";
-		error("STRING_BLOCK_UNEXPECTED_END");
-		error("STRING_BLOCK_MISSING_NEW_LINE");
-		error("STRING_BLOCK_MISSING_TERMINATION");
-		error("STRING_BLOCK_MISSING_INDENT");
+		error("STRING_BLOCK_UNEXPECTED_END", lexer = true);
+		error("STRING_BLOCK_MISSING_NEW_LINE", lexer = true);
+		error("STRING_BLOCK_MISSING_TERMINATION", lexer = true);
+		error("STRING_BLOCK_MISSING_INDENT", lexer = true);
 		lit("IDENT") => r"[_a-zA-Z][_a-zA-Z0-9]*";
 		lit("WHITESPACE") => r"[ \t\n\r]+";
 		lit("SINGLE_LINE_SLASH_COMMENT") => r"//[^\r\n]*(\r\n|\n)?";
modifiedxtask/src/sourcegen/mod.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/mod.rs
+++ b/xtask/src/sourcegen/mod.rs
@@ -48,20 +48,28 @@
 			if let Some((special, name)) = classify_special(token) {
 				match special {
 					SpecialName::Literal => panic!("literal is not defined: {name}"),
-					SpecialName::Meta => kinds.define_token(TokenKind::Meta {
-						grammar_name: token.to_owned(),
-						name: format!("META_{}", name),
-					}),
-					SpecialName::Error => kinds.define_token(TokenKind::Error {
-						grammar_name: token.to_owned(),
-						name: format!("ERROR_{}", name),
-						regex: None,
-						priority: None,
-					}),
+					SpecialName::Meta => {
+						eprintln!("implicit meta: {}", name);
+						kinds.define_token(TokenKind::Meta {
+							grammar_name: token.to_owned(),
+							name: format!("META_{}", name),
+						})
+					}
+					SpecialName::Error => {
+						eprintln!("implicit error: {}", name);
+						kinds.define_token(TokenKind::Error {
+							grammar_name: token.to_owned(),
+							name: format!("ERROR_{}", name),
+							regex: None,
+							priority: None,
+							is_lexer_error: true,
+						})
+					}
 				};
 				continue;
 			};
 			let name = to_upper_snake_case(token);
+			eprintln!("implicit kw: {}", token);
 			kinds.define_token(TokenKind::Keyword {
 				code: token.to_owned(),
 				name: format!("{name}_KW"),
modifiedxtask/src/sourcegen/util.rsdiffbeforeafterboth
--- a/xtask/src/sourcegen/util.rs
+++ b/xtask/src/sourcegen/util.rs
@@ -13,10 +13,7 @@
 		}
 	}
 
-	eprintln!(" {} was not up-to-date, updating\n", file.display());
-	if std::env::var("CI").is_ok() {
-		eprintln!("NOTE: run `cargo xtask` locally and commit the updated files\n");
-	}
+	eprintln!("{} was not up-to-date, updating", file.display());
 	if let Some(parent) = file.parent() {
 		let _ = fs::create_dir_all(parent);
 	}