difftreelog
refactor parser and grammar compatibility
in: master
46 files changed
cmds/jrsonnet-fmt/Cargo.tomldiffbeforeafterbothno changes
cmds/jrsonnet-fmt/src/main.rsdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/Cargo.tomldiffbeforeafterboth19indoc = "1.0.3"19indoc = "1.0.3"20insta = "1.10.0"20insta = "1.10.0"21anyhow = "1.0.57"21anyhow = "1.0.57"22jrsonnet-stdlib = { path = "../jrsonnet-stdlib" }2223crates/jrsonnet-rowan-parser/jsonnet.ungramdiffbeforeafterboth1// This file describes structure of jsonnet source code2// It is also used to generate files in src/generated34// Token names ending with `!` are considered meta, and handled specifically51SourceFile = Expr6SourceFile = Expr273ExprBinary =8ExprBinary =4 lhs:Expr9 lhs:LhsExpr5 BinaryOperator10 BinaryOperator6 rhs:Expr11 rhs:Expr7ExprUnary =12ExprUnary =8 UnaryOperator13 UnaryOperator9 rhs:Expr14 rhs:Expr10ExprSlice =15ExprSlice =11 Expr16 Expr12 '['13 SliceDesc17 SliceDesc14 ']'15ExprIndex =18ExprIndex =16 Expr19 Expr17 '.'20 '.'18 index:Name21 index:Name19ExprIndexExpr =22ExprIndexExpr =20 base:Expr23 base:LhsExpr21 '['24 '['22 index:Expr25 index:Expr23 ']'26 ']'24ExprApply =27ExprApply =25 Expr28 Expr26 '('27 ArgsDesc29 ArgsDesc28 ')'29 'tailstrict'?30 'tailstrict'?30ExprObjExtend =31ExprObjExtend =32 LhsExpr31 Expr33 Expr32 '{'33 ObjBody34 '}'35ExprParened =34ExprParened =36 '('35 '('37 Expr36 Expr64 '['63 '['65 Expr64 Expr66 ','?65 ','?67 ForSpec68 CompSpec*66 CompSpec*69 ']'67 ']'6870ExprImport =69ExprImport =71 'importstr' String70 ImportKind String72| 'importbin' String73| 'import' String747172ImportKind =73 'importstr'74| 'importbin'75| 'import'7675ExprVar =77ExprVar =76 name:Name78 name:Name77ExprLocal =79ExprLocal =78 'local'80 'local'79 (Bind (',' Bind)* ','?)81 (Bind (',' Bind)* ','?)80 ';'82 ';'83 Expr8481ExprIfThenElse =85ExprIfThenElse =82 'if'86 'if'83 cond:Expr87 cond:Expr84 'then'88 'then'85 then:Expr89 then:TrueExpr86 ('else' else_:Expr)?90 ('else' else_:FalseExpr)?9187ExprFunction =92ExprFunction =88 'function'93 'function'89 '('94 '('112| ExprIntrinsic117| ExprIntrinsic113| ExprString118| ExprString114| ExprNumber119| ExprNumber120| ExprLiteral115| ExprArray121| ExprArray116| ExprObject122| ExprObject117| ExprArrayComp123| ExprArrayComp130| '<<' | '>>'136| '<<' | '>>'131| '+' | '-'137| '+' | '-'132| '*' | '/' | '%'138| '*' | '/' | '%'139| 'ERROR_NO_OPERATOR!'133140134UnaryOperator =141UnaryOperator =135 '-' | '!' | '~'142 '-' | '!' | '~'136143144SliceDescEnd=Expr145SliceDescStep=Expr137SliceDesc =146SliceDesc =147 '['138 from:Expr?148 from:Expr?139 ':'149 ':'140 (150 (141 end:Expr?151 end:SliceDescEnd?142 (152 (143 ':'153 ':'144 step:Expr?154 step:SliceDescStep?145 )?155 )?146 )?156 )?157 ']'147158148Name =159Name =149 'ident'160 'LIT_IDENT!'150161151ArgsDesc =162ArgsDesc =163 '('152 (Arg (',' Arg)* ','?)?164 (Arg (',' Arg)* ','?)?165 ')'153Arg =166Arg =154 (name:Name '=')? Expr167 (name:Name '=')? Expr155168156ObjBodyComp =169ObjBodyComp =157 pre:ObjLocalPostComma*170 pre:ObjLocalPostComma*158 '['171 '['159 key:Expr172 key:LhsExpr160 ']'173 ']'161 '+'?174 '+'?162 ':'175 ':'163 value:Expr176 value:Expr164 post:ObjLocalPreComma*177 post:ObjLocalPreComma*165 ForSpec166 CompSpec*178 CompSpec*167ObjBodyMemberList =179ObjBodyMemberList =168 (Member (',' Member) ','?)?180 (Member (',' Member)* ','?)?169ObjBody =181ObjBody =170 ObjBodyComp182 ObjBodyComp171| ObjBodyMemberList183| ObjBodyMemberList196 Expr208 Expr197FieldMethod =209FieldMethod =198 FieldName210 FieldName199 '('200 ParamsDesc211 ParamsDesc201 ')'202 Visibility212 Visibility203 Expr213 Expr204Field =214Field =230| 'super'240| 'super'231241232String =242String =233 'string_double'243 'LIT_STRING_DOUBLE!'234| 'string_single'244| 'LIT_STRING_SINGLE!'235| 'string_double_verbatim'245| 'LIT_STRING_DOUBLE_VERBATIM!'236| 'string_single_verbatim'246| 'LIT_STRING_SINGLE_VERBATIM!'237| 'string_block'247| 'LIT_STRING_BLOCK!'238248239Number =249Number =240 'number'250 'LIT_FLOAT!'251| 'META_FORCE_ENUM!'241252242ForSpec =253ForSpec =243 'for'254 'for'257 value:Expr268 value:Expr258BindFunction =269BindFunction =259 name:Name270 name:Name260 '('261 params:ParamsDesc271 params:ParamsDesc262 ')'263 '='272 '='264 value:Expr273 value:Expr265Bind =274Bind =266 BindDestruct275 BindDestruct267| BindFunction276| BindFunction268277269ParamsDesc =278ParamsDesc =279 '('270 (Param (',' Param)* ','?)?280 (Param (',' Param)* ','?)?281 ')'271Param =282Param =272 Destruct283 Destruct273 (284 (277288278Assertion =289Assertion =279 'assert'290 'assert'280 condition:Expr291 condition:LhsExpr281 (292 (282 ':'293 ':'283 Expr294 message:Expr284 )?295 )?285296286DestructFull =297DestructFull =287 into:Name298 Name288DestructSkip =299DestructSkip =289 '?'300 '?'290DestructArray =301DestructArray =291 '['302 '['292 start:(303 (293 Destruct304 DestructArrayPart294 (',' Destruct)*305 (',' DestructArrayPart)*295 ','?306 ','?296 )?307 )?297 DestructRest?298 ','?299 end:(300 Destruct301 (',' Destruct)*302 ','?303 )304 ']'308 ']'305DestructObject =309DestructObject =306 '{'310 '{'314 '}'318 '}'315Destruct =319Destruct =316 DestructFull320 DestructFull317 DestructSkip321| DestructSkip318 DestructArray322| DestructArray319 DestructObject323| DestructObject320324325DestructArrayElement =326 Destruct327DestructArrayPart =328 DestructArrayElement329| DestructRest330321DestructRest =331DestructRest =322 '...'332 '...'323 into:Name?333 into:Name?332 '='342 '='333 Expr343 Expr334 )?344 )?345346// Aliases used to resolve node type conflicts347TrueExpr=Expr348FalseExpr=Expr349LhsExpr=Expr335350crates/jrsonnet-rowan-parser/src/ast.rsdiffbeforeafterboth1use std::marker::PhantomData;23use crate::{SyntaxKind, SyntaxNode, SyntaxNodeChildren, SyntaxToken};45/// The main trait to go from untyped `SyntaxNode` to a typed ast. The6/// conversion itself has zero runtime cost: ast and syntax nodes have exactly7/// the same representation: a pointer to the tree root and a pointer to the8/// node itself.9pub trait AstNode {10 fn can_cast(kind: SyntaxKind) -> bool11 where12 Self: Sized;1314 fn cast(syntax: SyntaxNode) -> Option<Self>15 where16 Self: Sized;1718 fn syntax(&self) -> &SyntaxNode;19 fn clone_for_update(&self) -> Self20 where21 Self: Sized,22 {23 Self::cast(self.syntax().clone_for_update()).unwrap()24 }25 fn clone_subtree(&self) -> Self26 where27 Self: Sized,28 {29 Self::cast(self.syntax().clone_subtree()).unwrap()30 }31}3233/// Like `AstNode`, but wraps tokens rather than interior nodes.1pub trait AstToken {}34pub trait AstToken {35 fn can_cast(token: SyntaxKind) -> bool36 where37 Self: Sized;3839 fn cast(syntax: SyntaxToken) -> Option<Self>40 where41 Self: Sized;4243 fn syntax(&self) -> &SyntaxToken;4445 fn text(&self) -> &str {46 self.syntax().text()47 }48}4950#[derive(Debug, Clone)]51pub struct AstChildren<N> {52 inner: SyntaxNodeChildren,53 ph: PhantomData<N>,54}5556impl<N> AstChildren<N> {57 fn new(parent: &SyntaxNode) -> Self {58 AstChildren {59 inner: parent.children(),60 ph: PhantomData,61 }62 }63}6465impl<N: AstNode> Iterator for AstChildren<N> {66 type Item = N;67 fn next(&mut self) -> Option<N> {68 self.inner.find_map(N::cast)69 }70}7172pub mod support {73 use super::{AstChildren, AstNode, AstToken, SyntaxKind, SyntaxNode, SyntaxToken};7475 pub fn child<N: AstNode>(parent: &SyntaxNode) -> Option<N> {76 parent.children().find_map(N::cast)77 }78 pub fn token_child<N: AstToken>(parent: &SyntaxNode) -> Option<N> {79 parent.children_with_tokens().find_map(|n| match n {80 rowan::NodeOrToken::Node(_) => None,81 rowan::NodeOrToken::Token(t) => N::cast(t),82 })83 }8485 pub fn children<N: AstNode>(parent: &SyntaxNode) -> AstChildren<N> {86 AstChildren::new(parent)87 }8889 pub fn token(parent: &SyntaxNode, kind: SyntaxKind) -> Option<SyntaxToken> {90 parent91 .children_with_tokens()92 .filter_map(|it| it.into_token())93 .find(|it| it.kind() == kind)94 }95}296crates/jrsonnet-rowan-parser/src/binary.rsdiffbeforeafterboth20 Or,20 Or,21 In,21 In,22 ObjectApply,22 ObjectApply,23 #[allow(dead_code)]23 Invalid,24 Invalid,24}25}2526crates/jrsonnet-rowan-parser/src/classify.rsdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/event.rsdiffbeforeafterboth1use std::mem;1use std::mem;223use rowan::{GreenNode, GreenNodeBuilder, Language};3use rowan::{GreenNodeBuilder, Language};445use crate::{5use crate::{6 lex::Lexeme,6 lex::Lexeme,101011#[derive(Clone, Debug, PartialEq, Eq)]11#[derive(Clone, Debug, PartialEq, Eq)]12pub enum Event {12pub enum Event {13 /// Used for unfinished markers14 Pending,15 /// After marker is completed, Pending event is replaced with Start13 Start {16 Start {14 kind: SyntaxKind,17 kind: SyntaxKind,18 /// If marker is preceded or wrapped - instead of reordering events, we19 /// insert start event in the end of events Vec instead, and store relative offset to this event here15 forward_parent: Option<usize>,20 forward_parent: Option<usize>,16 },21 },22 /// Eat token17 Token,23 Token {24 kind: SyntaxKind,25 },26 /// Position of finished node18 Finish,27 Finish {28 /// Same as forward_parent of Start, but for wrapping29 wrapper: Option<usize>,19 Placeholder,30 },20 Error(SyntaxError),31 Error(SyntaxError),32 /// Used for dropped markers and other things33 Noop,21}34}223523pub(super) struct Sink<'i> {36pub(super) struct Sink<'i> {40 }53 }415442 pub(super) fn finish(mut self) -> Parse {55 pub(super) fn finish(mut self) -> Parse {56 let mut eat_start_whitespace = false;57 let mut depth = 0;43 for idx in 0..self.events.len() {58 for idx in 0..self.events.len() {44 match mem::replace(&mut self.events[idx], Event::Placeholder) {59 match mem::replace(&mut self.events[idx], Event::Noop) {45 Event::Start {60 Event::Start {46 kind,61 kind,47 forward_parent,62 forward_parent,48 } => {63 } => {64 if depth != 0 {65 self.skip_whitespace();66 }49 let mut kinds = vec![kind];67 let mut kinds = vec![kind];506851 let mut idx = idx;69 let mut idx = idx;60 forward_parent = if let Event::Start {78 forward_parent = if let Event::Start {61 kind,79 kind,62 forward_parent,80 forward_parent,63 } = mem::replace(&mut self.events[idx], Event::Placeholder)81 } = mem::replace(&mut self.events[idx], Event::Noop)64 {82 {65 kinds.push(kind);83 kinds.push(kind);66 forward_parent84 forward_parent718972 for kind in kinds.into_iter().rev() {90 for kind in kinds.into_iter().rev() {73 self.builder.start_node(JsonnetLanguage::kind_to_raw(kind));91 self.builder.start_node(JsonnetLanguage::kind_to_raw(kind));92 depth += 1;93 if depth == 1 {94 self.skip_whitespace();95 }74 }96 }9798 eat_start_whitespace = false;75 }99 }76 Event::Token => self.token(),100 Event::Token { kind } => {101 if eat_start_whitespace {102 self.skip_whitespace();103 }104 self.token(kind);105 eat_start_whitespace = true;106 }77 Event::Finish => {107 Event::Finish { wrapper } => {78 self.builder.finish_node();108 self.builder.finish_node();109 depth -= 1;110 let mut idx = idx;111 let mut wrapper = wrapper;112 while let Some(w) = wrapper {113 idx += w;114 wrapper = if let Event::Finish { wrapper } =115 mem::replace(&mut self.events[idx], Event::Noop)116 {117 self.builder.finish_node();118 depth -= 1;119 wrapper120 } else {121 unreachable!()122 }123 }124 eat_start_whitespace = true;79 }125 }126 Event::Pending => panic!("placeholder should not end in events"),80 Event::Placeholder => {}127 Event::Noop => {}81 Event::Error(e) => {128 Event::Error(e) => {82 self.errors.push(e);129 self.errors.push(e);83 }130 }84 }131 }85 self.skip_whitespace();86 }132 }8713388 Parse {134 Parse {89 green_node: self.builder.finish(),135 green_node: self.builder.finish(),90 errors: self.errors,136 errors: self.errors,91 }137 }92 }138 }93 fn token(&mut self) {139 fn token(&mut self, kind: SyntaxKind) {94 let lexeme = self.lexemes[self.offset];140 let lexeme = self.lexemes[self.offset];95 self.builder141 self.builder96 .token(JsonnetLanguage::kind_to_raw(lexeme.kind), lexeme.text);142 .token(JsonnetLanguage::kind_to_raw(kind), lexeme.text);97 self.offset += 1;143 self.offset += 1;98 }144 }99 fn skip_whitespace(&mut self) {145 fn skip_whitespace(&mut self) {102 break;148 break;103 }149 }104150105 self.token();151 self.token(lexeme.kind);106 }152 }107 }153 }108}154}crates/jrsonnet-rowan-parser/src/generated/mod.rsdiffbeforeafterboth1// mod tokens;1pub mod nodes;2// mod nodes;3pub mod syntax_kinds;2pub mod syntax_kinds;43crates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth1//! This is a generated file, please do not edit manually. Changes can be1//! This is a generated file, please do not edit manually. Changes can be2//! made in codegeneration that lives in `xtask` top-level dir.2//! made in codegeneration that lives in `xtask` top-level dir.334#![allow(non_snake_case)]4#![allow(non_snake_case, clippy::match_like_matches_macro)]5use crate::{5use crate::{6 ast::{self, support, AstChildren, AstNode},6 ast::{support, AstChildren, AstNode, AstToken},7 SyntaxKind::{self, *},7 SyntaxKind::{self, *},8 SyntaxNode, SyntaxToken, T,8 SyntaxNode, SyntaxToken, T,9};9};13 pub(crate) syntax: SyntaxNode,13 pub(crate) syntax: SyntaxNode,14}14}15impl SourceFile {15impl SourceFile {16 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }16 pub fn expr(&self) -> Option<Expr> {17 support::child(&self.syntax)18 }17}19}182019#[derive(Debug, Clone, PartialEq, Eq, Hash)]21#[derive(Debug, Clone, PartialEq, Eq, Hash)]20pub struct ExprBinary {22pub struct ExprBinary {21 pub(crate) syntax: SyntaxNode,23 pub(crate) syntax: SyntaxNode,22}24}23impl ExprBinary {25impl ExprBinary {24 pub fn lhs(&self) -> Option<Expr> { support::child(&self.syntax) }26 pub fn lhs(&self) -> Option<LhsExpr> {27 support::child(&self.syntax)28 }25 pub fn binary_operator(&self) -> Option<BinaryOperator> { support::child(&self.syntax) }29 pub fn binary_operator(&self) -> Option<BinaryOperator> {30 support::token_child(&self.syntax)31 }26 pub fn rhs(&self) -> Option<Expr> { support::child(&self.syntax) }32 pub fn rhs(&self) -> Option<Expr> {33 support::child(&self.syntax)34 }27}35}283629#[derive(Debug, Clone, PartialEq, Eq, Hash)]37#[derive(Debug, Clone, PartialEq, Eq, Hash)]30pub struct BinaryOperator {38pub struct LhsExpr {31 pub(crate) syntax: SyntaxNode,39 pub(crate) syntax: SyntaxNode,32}40}33impl BinaryOperator {41impl LhsExpr {34 pub fn or_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![||]) }42 pub fn expr(&self) -> Option<Expr> {35 pub fn and_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&&]) }43 support::child(&self.syntax)36 pub fn bit_or_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![|]) }37 pub fn bit_xor_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![^]) }44 }38 pub fn bit_and_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![&]) }39 pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![==]) }40 pub fn ne_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!=]) }41 pub fn lt_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<]) }42 pub fn gt_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>]) }43 pub fn le_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<=]) }44 pub fn ge_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>=]) }45 pub fn in_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![in]) }46 pub fn lhs_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![<<]) }47 pub fn rhs_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![>>]) }48 pub fn plus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![+]) }49 pub fn minus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![-]) }50 pub fn mul_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![*]) }51 pub fn div_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![/]) }52 pub fn modulo_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![%]) }53}45}544655#[derive(Debug, Clone, PartialEq, Eq, Hash)]47#[derive(Debug, Clone, PartialEq, Eq, Hash)]56pub struct ExprUnary {48pub struct ExprUnary {57 pub(crate) syntax: SyntaxNode,49 pub(crate) syntax: SyntaxNode,58}50}59impl ExprUnary {51impl ExprUnary {60 pub fn unary_operator(&self) -> Option<UnaryOperator> { support::child(&self.syntax) }52 pub fn unary_operator(&self) -> Option<UnaryOperator> {53 support::token_child(&self.syntax)54 }61 pub fn rhs(&self) -> Option<Expr> { support::child(&self.syntax) }55 pub fn rhs(&self) -> Option<Expr> {56 support::child(&self.syntax)57 }62}58}635964#[derive(Debug, Clone, PartialEq, Eq, Hash)]60#[derive(Debug, Clone, PartialEq, Eq, Hash)]65pub struct UnaryOperator {66 pub(crate) syntax: SyntaxNode,67}68impl UnaryOperator {69 pub fn minus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![-]) }70 pub fn not_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![!]) }71 pub fn bit_not_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![~]) }72}7374#[derive(Debug, Clone, PartialEq, Eq, Hash)]75pub struct ExprSlice {61pub struct ExprSlice {76 pub(crate) syntax: SyntaxNode,62 pub(crate) syntax: SyntaxNode,77}63}78impl ExprSlice {64impl ExprSlice {79 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }65 pub fn expr(&self) -> Option<Expr> {66 support::child(&self.syntax)80 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }67 }81 pub fn slice_desc(&self) -> Option<SliceDesc> { support::child(&self.syntax) }68 pub fn slice_desc(&self) -> Option<SliceDesc> {69 support::child(&self.syntax)82 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }70 }83}71}847285#[derive(Debug, Clone, PartialEq, Eq, Hash)]73#[derive(Debug, Clone, PartialEq, Eq, Hash)]86pub struct SliceDesc {74pub struct SliceDesc {87 pub(crate) syntax: SyntaxNode,75 pub(crate) syntax: SyntaxNode,88}76}89impl SliceDesc {77impl SliceDesc {90 pub fn from(&self) -> Option<Expr> { support::child(&self.syntax) }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 }91 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }84 pub fn colon_token(&self) -> Option<SyntaxToken> {85 support::token(&self.syntax, T![:])86 }92 pub fn end(&self) -> Option<Expr> { support::child(&self.syntax) }87 pub fn end(&self) -> Option<SliceDescEnd> {88 support::child(&self.syntax)89 }93 pub fn step(&self) -> Option<Expr> { support::child(&self.syntax) }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 }94}96}959796#[derive(Debug, Clone, PartialEq, Eq, Hash)]98#[derive(Debug, Clone, PartialEq, Eq, Hash)]97pub struct ExprIndex {99pub struct ExprIndex {98 pub(crate) syntax: SyntaxNode,100 pub(crate) syntax: SyntaxNode,99}101}100impl ExprIndex {102impl ExprIndex {101 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }103 pub fn expr(&self) -> Option<Expr> {104 support::child(&self.syntax)105 }102 pub fn dot_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![.]) }106 pub fn dot_token(&self) -> Option<SyntaxToken> {107 support::token(&self.syntax, T![.])108 }103 pub fn index(&self) -> Option<Name> { support::child(&self.syntax) }109 pub fn index(&self) -> Option<Name> {110 support::child(&self.syntax)111 }104}112}105113106#[derive(Debug, Clone, PartialEq, Eq, Hash)]114#[derive(Debug, Clone, PartialEq, Eq, Hash)]107pub struct Name {115pub struct Name {108 pub(crate) syntax: SyntaxNode,116 pub(crate) syntax: SyntaxNode,109}117}110impl Name {118impl Name {111 pub fn ident_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![ident]) }119 pub fn ident_lit(&self) -> Option<SyntaxToken> {120 support::token(&self.syntax, IDENT)121 }112}122}113123114#[derive(Debug, Clone, PartialEq, Eq, Hash)]124#[derive(Debug, Clone, PartialEq, Eq, Hash)]115pub struct ExprIndexExpr {125pub struct ExprIndexExpr {116 pub(crate) syntax: SyntaxNode,126 pub(crate) syntax: SyntaxNode,117}127}118impl ExprIndexExpr {128impl ExprIndexExpr {119 pub fn base(&self) -> Option<Expr> { support::child(&self.syntax) }129 pub fn base(&self) -> Option<LhsExpr> {130 support::child(&self.syntax)131 }120 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }132 pub fn l_brack_token(&self) -> Option<SyntaxToken> {133 support::token(&self.syntax, T!['['])134 }121 pub fn index(&self) -> Option<Expr> { support::child(&self.syntax) }135 pub fn index(&self) -> Option<Expr> {136 support::child(&self.syntax)137 }122 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }138 pub fn r_brack_token(&self) -> Option<SyntaxToken> {139 support::token(&self.syntax, T![']'])140 }123}141}124142125#[derive(Debug, Clone, PartialEq, Eq, Hash)]143#[derive(Debug, Clone, PartialEq, Eq, Hash)]126pub struct ExprApply {144pub struct ExprApply {127 pub(crate) syntax: SyntaxNode,145 pub(crate) syntax: SyntaxNode,128}146}129impl ExprApply {147impl ExprApply {130 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }148 pub fn expr(&self) -> Option<Expr> {149 support::child(&self.syntax)131 pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }150 }132 pub fn args_desc(&self) -> Option<ArgsDesc> { support::child(&self.syntax) }151 pub fn args_desc(&self) -> Option<ArgsDesc> {152 support::child(&self.syntax)133 pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }153 }134 pub fn tailstrict_token(&self) -> Option<SyntaxToken> {154 pub fn tailstrict_kw_token(&self) -> Option<SyntaxToken> {135 support::token(&self.syntax, T![tailstrict])155 support::token(&self.syntax, T![tailstrict])136 }156 }137}157}141 pub(crate) syntax: SyntaxNode,161 pub(crate) syntax: SyntaxNode,142}162}143impl ArgsDesc {163impl ArgsDesc {144 pub fn args(&self) -> AstChildren<Arg> { support::children(&self.syntax) }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 }145}173}146174147#[derive(Debug, Clone, PartialEq, Eq, Hash)]175#[derive(Debug, Clone, PartialEq, Eq, Hash)]148pub struct ExprObjExtend {176pub struct ExprObjExtend {149 pub(crate) syntax: SyntaxNode,177 pub(crate) syntax: SyntaxNode,150}178}151impl ExprObjExtend {179impl ExprObjExtend {152 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }180 pub fn lhs_expr(&self) -> Option<LhsExpr> {181 support::child(&self.syntax)153 pub fn l_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }182 }154 pub fn obj_body(&self) -> Option<ObjBody> { support::child(&self.syntax) }183 pub fn expr(&self) -> Option<Expr> {184 support::child(&self.syntax)155 pub fn r_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }185 }156}186}157187158#[derive(Debug, Clone, PartialEq, Eq, Hash)]188#[derive(Debug, Clone, PartialEq, Eq, Hash)]159pub struct ExprParened {189pub struct ExprParened {160 pub(crate) syntax: SyntaxNode,190 pub(crate) syntax: SyntaxNode,161}191}162impl ExprParened {192impl ExprParened {163 pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }193 pub fn l_paren_token(&self) -> Option<SyntaxToken> {194 support::token(&self.syntax, T!['('])195 }164 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }196 pub fn expr(&self) -> Option<Expr> {197 support::child(&self.syntax)198 }165 pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }199 pub fn r_paren_token(&self) -> Option<SyntaxToken> {200 support::token(&self.syntax, T![')'])201 }166}202}167203168#[derive(Debug, Clone, PartialEq, Eq, Hash)]204#[derive(Debug, Clone, PartialEq, Eq, Hash)]169pub struct ExprLiteral {205pub struct ExprLiteral {170 pub(crate) syntax: SyntaxNode,206 pub(crate) syntax: SyntaxNode,171}207}172impl ExprLiteral {208impl ExprLiteral {173 pub fn literal(&self) -> Option<Literal> { support::child(&self.syntax) }209 pub fn literal(&self) -> Option<Literal> {210 support::token_child(&self.syntax)211 }174}212}175213176#[derive(Debug, Clone, PartialEq, Eq, Hash)]214#[derive(Debug, Clone, PartialEq, Eq, Hash)]177pub struct Literal {178 pub(crate) syntax: SyntaxNode,179}180impl Literal {181 pub fn null_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![null]) }182 pub fn true_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![true]) }183 pub fn false_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![false]) }184 pub fn self_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![self]) }185 pub fn dollar_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['$']) }186 pub fn super_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![super]) }187}188189#[derive(Debug, Clone, PartialEq, Eq, Hash)]190pub struct ExprIntrinsicThisFile {215pub struct ExprIntrinsicThisFile {191 pub(crate) syntax: SyntaxNode,216 pub(crate) syntax: SyntaxNode,192}217}214 pub fn intrinsic_token(&self) -> Option<SyntaxToken> {239 pub fn intrinsic_token(&self) -> Option<SyntaxToken> {215 support::token(&self.syntax, T!["$intrinsic"])240 support::token(&self.syntax, T!["$intrinsic"])216 }241 }217 pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }242 pub fn l_paren_token(&self) -> Option<SyntaxToken> {243 support::token(&self.syntax, T!['('])244 }218 pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }245 pub fn name(&self) -> Option<Name> {246 support::child(&self.syntax)247 }219 pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }248 pub fn r_paren_token(&self) -> Option<SyntaxToken> {249 support::token(&self.syntax, T![')'])250 }220}251}221252222#[derive(Debug, Clone, PartialEq, Eq, Hash)]253#[derive(Debug, Clone, PartialEq, Eq, Hash)]223pub struct ExprString {254pub struct ExprString {224 pub(crate) syntax: SyntaxNode,255 pub(crate) syntax: SyntaxNode,225}256}226impl ExprString {257impl ExprString {227 pub fn string(&self) -> Option<String> { support::child(&self.syntax) }258 pub fn string(&self) -> Option<String> {228}229230#[derive(Debug, Clone, PartialEq, Eq, Hash)]231pub struct String {232 pub(crate) syntax: SyntaxNode,259 support::token_child(&self.syntax)233}234impl String {235 pub fn string_double_token(&self) -> Option<SyntaxToken> {236 support::token(&self.syntax, T![string_double])237 }260 }238 pub fn string_single_token(&self) -> Option<SyntaxToken> {239 support::token(&self.syntax, T![string_single])240 }241 pub fn string_double_verbatim_token(&self) -> Option<SyntaxToken> {242 support::token(&self.syntax, T![string_double_verbatim])243 }244 pub fn string_single_verbatim_token(&self) -> Option<SyntaxToken> {245 support::token(&self.syntax, T![string_single_verbatim])246 }247 pub fn string_block_token(&self) -> Option<SyntaxToken> {248 support::token(&self.syntax, T![string_block])249 }250}261}251262252#[derive(Debug, Clone, PartialEq, Eq, Hash)]263#[derive(Debug, Clone, PartialEq, Eq, Hash)]253pub struct ExprNumber {264pub struct ExprNumber {254 pub(crate) syntax: SyntaxNode,265 pub(crate) syntax: SyntaxNode,255}266}256impl ExprNumber {267impl ExprNumber {257 pub fn number(&self) -> Option<Number> { support::child(&self.syntax) }268 pub fn number(&self) -> Option<Number> {269 support::token_child(&self.syntax)270 }258}271}259272260#[derive(Debug, Clone, PartialEq, Eq, Hash)]273#[derive(Debug, Clone, PartialEq, Eq, Hash)]261pub struct Number {262 pub(crate) syntax: SyntaxNode,263}264impl Number {265 pub fn number_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![number]) }266}267268#[derive(Debug, Clone, PartialEq, Eq, Hash)]269pub struct ExprArray {274pub struct ExprArray {270 pub(crate) syntax: SyntaxNode,275 pub(crate) syntax: SyntaxNode,271}276}272impl ExprArray {277impl ExprArray {273 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }278 pub fn l_brack_token(&self) -> Option<SyntaxToken> {279 support::token(&self.syntax, T!['['])280 }274 pub fn exprs(&self) -> AstChildren<Expr> { support::children(&self.syntax) }281 pub fn exprs(&self) -> AstChildren<Expr> {282 support::children(&self.syntax)283 }275 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }284 pub fn r_brack_token(&self) -> Option<SyntaxToken> {285 support::token(&self.syntax, T![']'])286 }276}287}277288278#[derive(Debug, Clone, PartialEq, Eq, Hash)]289#[derive(Debug, Clone, PartialEq, Eq, Hash)]279pub struct ExprObject {290pub struct ExprObject {280 pub(crate) syntax: SyntaxNode,291 pub(crate) syntax: SyntaxNode,281}292}282impl ExprObject {293impl ExprObject {283 pub fn l_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }294 pub fn l_brace_token(&self) -> Option<SyntaxToken> {295 support::token(&self.syntax, T!['{'])296 }284 pub fn obj_body(&self) -> Option<ObjBody> { support::child(&self.syntax) }297 pub fn obj_body(&self) -> Option<ObjBody> {298 support::child(&self.syntax)299 }285 pub fn r_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }300 pub fn r_brace_token(&self) -> Option<SyntaxToken> {301 support::token(&self.syntax, T!['}'])302 }286}303}287304288#[derive(Debug, Clone, PartialEq, Eq, Hash)]305#[derive(Debug, Clone, PartialEq, Eq, Hash)]289pub struct ExprArrayComp {306pub struct ExprArrayComp {290 pub(crate) syntax: SyntaxNode,307 pub(crate) syntax: SyntaxNode,291}308}292impl ExprArrayComp {309impl ExprArrayComp {293 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }310 pub fn l_brack_token(&self) -> Option<SyntaxToken> {311 support::token(&self.syntax, T!['['])312 }294 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }313 pub fn expr(&self) -> Option<Expr> {314 support::child(&self.syntax)315 }295 pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }316 pub fn comma_token(&self) -> Option<SyntaxToken> {317 support::token(&self.syntax, T![,])296 pub fn for_spec(&self) -> Option<ForSpec> { support::child(&self.syntax) }318 }297 pub fn comp_specs(&self) -> AstChildren<CompSpec> { support::children(&self.syntax) }319 pub fn comp_specs(&self) -> AstChildren<CompSpec> {320 support::children(&self.syntax)321 }298 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }322 pub fn r_brack_token(&self) -> Option<SyntaxToken> {323 support::token(&self.syntax, T![']'])324 }299}325}300326301#[derive(Debug, Clone, PartialEq, Eq, Hash)]327#[derive(Debug, Clone, PartialEq, Eq, Hash)]302pub struct ForSpec {303 pub(crate) syntax: SyntaxNode,304}305impl ForSpec {306 pub fn for_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![for]) }307 pub fn bind(&self) -> Option<Name> { support::child(&self.syntax) }308 pub fn in_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![in]) }309 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }310}311312#[derive(Debug, Clone, PartialEq, Eq, Hash)]313pub struct ExprImport {328pub struct ExprImport {314 pub(crate) syntax: SyntaxNode,329 pub(crate) syntax: SyntaxNode,315}330}316impl ExprImport {331impl ExprImport {317 pub fn importstr_token(&self) -> Option<SyntaxToken> {332 pub fn import_kind(&self) -> Option<ImportKind> {318 support::token(&self.syntax, T![importstr])333 support::token_child(&self.syntax)319 }334 }320 pub fn string(&self) -> Option<String> { support::child(&self.syntax) }335 pub fn string(&self) -> Option<String> {321 pub fn importbin_token(&self) -> Option<SyntaxToken> {336 support::token_child(&self.syntax)322 support::token(&self.syntax, T![importbin])323 }337 }324 pub fn import_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![import]) }325}338}326339327#[derive(Debug, Clone, PartialEq, Eq, Hash)]340#[derive(Debug, Clone, PartialEq, Eq, Hash)]328pub struct ExprVar {341pub struct ExprVar {329 pub(crate) syntax: SyntaxNode,342 pub(crate) syntax: SyntaxNode,330}343}331impl ExprVar {344impl ExprVar {332 pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }345 pub fn name(&self) -> Option<Name> {346 support::child(&self.syntax)347 }333}348}334349335#[derive(Debug, Clone, PartialEq, Eq, Hash)]350#[derive(Debug, Clone, PartialEq, Eq, Hash)]336pub struct ExprLocal {351pub struct ExprLocal {337 pub(crate) syntax: SyntaxNode,352 pub(crate) syntax: SyntaxNode,338}353}339impl ExprLocal {354impl ExprLocal {340 pub fn local_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![local]) }355 pub fn local_kw_token(&self) -> Option<SyntaxToken> {356 support::token(&self.syntax, T![local])357 }341 pub fn binds(&self) -> AstChildren<Bind> { support::children(&self.syntax) }358 pub fn binds(&self) -> AstChildren<Bind> {359 support::children(&self.syntax)360 }342 pub fn semi_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }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 }343}367}344368345#[derive(Debug, Clone, PartialEq, Eq, Hash)]369#[derive(Debug, Clone, PartialEq, Eq, Hash)]346pub struct ExprIfThenElse {370pub struct ExprIfThenElse {347 pub(crate) syntax: SyntaxNode,371 pub(crate) syntax: SyntaxNode,348}372}349impl ExprIfThenElse {373impl ExprIfThenElse {350 pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }374 pub fn if_kw_token(&self) -> Option<SyntaxToken> {375 support::token(&self.syntax, T![if])376 }351 pub fn cond(&self) -> Option<Expr> { support::child(&self.syntax) }377 pub fn cond(&self) -> Option<Expr> {378 support::child(&self.syntax)379 }352 pub fn then_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![then]) }380 pub fn then_kw_token(&self) -> Option<SyntaxToken> {381 support::token(&self.syntax, T![then])382 }353 pub fn then(&self) -> Option<Expr> { support::child(&self.syntax) }383 pub fn then(&self) -> Option<TrueExpr> {384 support::child(&self.syntax)385 }354 pub fn else_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![else]) }386 pub fn else_kw_token(&self) -> Option<SyntaxToken> {387 support::token(&self.syntax, T![else])388 }355 pub fn else_(&self) -> Option<Expr> { support::child(&self.syntax) }389 pub fn else_(&self) -> Option<FalseExpr> {390 support::child(&self.syntax)391 }356}392}357393358#[derive(Debug, Clone, PartialEq, Eq, Hash)]394#[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)]359pub struct ExprFunction {415pub struct ExprFunction {360 pub(crate) syntax: SyntaxNode,416 pub(crate) syntax: SyntaxNode,361}417}362impl ExprFunction {418impl ExprFunction {363 pub fn function_token(&self) -> Option<SyntaxToken> {419 pub fn function_kw_token(&self) -> Option<SyntaxToken> {364 support::token(&self.syntax, T![function])420 support::token(&self.syntax, T![function])365 }421 }366 pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }422 pub fn l_paren_token(&self) -> Option<SyntaxToken> {423 support::token(&self.syntax, T!['('])424 }367 pub fn params_desc(&self) -> Option<ParamsDesc> { support::child(&self.syntax) }425 pub fn params_desc(&self) -> Option<ParamsDesc> {426 support::child(&self.syntax)427 }368 pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }428 pub fn r_paren_token(&self) -> Option<SyntaxToken> {429 support::token(&self.syntax, T![')'])430 }369 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }431 pub fn expr(&self) -> Option<Expr> {432 support::child(&self.syntax)433 }370}434}371435372#[derive(Debug, Clone, PartialEq, Eq, Hash)]436#[derive(Debug, Clone, PartialEq, Eq, Hash)]373pub struct ParamsDesc {437pub struct ParamsDesc {374 pub(crate) syntax: SyntaxNode,438 pub(crate) syntax: SyntaxNode,375}439}376impl ParamsDesc {440impl ParamsDesc {377 pub fn params(&self) -> AstChildren<Param> { support::children(&self.syntax) }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 }378}450}379451380#[derive(Debug, Clone, PartialEq, Eq, Hash)]452#[derive(Debug, Clone, PartialEq, Eq, Hash)]381pub struct ExprAssert {453pub struct ExprAssert {382 pub(crate) syntax: SyntaxNode,454 pub(crate) syntax: SyntaxNode,383}455}384impl ExprAssert {456impl ExprAssert {385 pub fn assertion(&self) -> Option<Assertion> { support::child(&self.syntax) }457 pub fn assertion(&self) -> Option<Assertion> {458 support::child(&self.syntax)459 }386 pub fn semi_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }460 pub fn semi_token(&self) -> Option<SyntaxToken> {461 support::token(&self.syntax, T![;])462 }387 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }463 pub fn expr(&self) -> Option<Expr> {464 support::child(&self.syntax)465 }388}466}389467390#[derive(Debug, Clone, PartialEq, Eq, Hash)]468#[derive(Debug, Clone, PartialEq, Eq, Hash)]391pub struct Assertion {469pub struct Assertion {392 pub(crate) syntax: SyntaxNode,470 pub(crate) syntax: SyntaxNode,393}471}394impl Assertion {472impl Assertion {395 pub fn assert_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![assert]) }473 pub fn assert_kw_token(&self) -> Option<SyntaxToken> {474 support::token(&self.syntax, T![assert])475 }396 pub fn condition(&self) -> Option<Expr> { support::child(&self.syntax) }476 pub fn condition(&self) -> Option<LhsExpr> {477 support::child(&self.syntax)478 }397 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }479 pub fn colon_token(&self) -> Option<SyntaxToken> {480 support::token(&self.syntax, T![:])481 }398 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }482 pub fn message(&self) -> Option<Expr> {483 support::child(&self.syntax)484 }399}485}400486401#[derive(Debug, Clone, PartialEq, Eq, Hash)]487#[derive(Debug, Clone, PartialEq, Eq, Hash)]402pub struct ExprError {488pub struct ExprError {403 pub(crate) syntax: SyntaxNode,489 pub(crate) syntax: SyntaxNode,404}490}405impl ExprError {491impl ExprError {406 pub fn error_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![error]) }492 pub fn error_kw_token(&self) -> Option<SyntaxToken> {493 support::token(&self.syntax, T![error])494 }407 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }495 pub fn expr(&self) -> Option<Expr> {496 support::child(&self.syntax)497 }408}498}409499410#[derive(Debug, Clone, PartialEq, Eq, Hash)]500#[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)]411pub struct Arg {521pub struct Arg {412 pub(crate) syntax: SyntaxNode,522 pub(crate) syntax: SyntaxNode,413}523}414impl Arg {524impl Arg {415 pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }525 pub fn name(&self) -> Option<Name> {526 support::child(&self.syntax)527 }416 pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }528 pub fn assign_token(&self) -> Option<SyntaxToken> {529 support::token(&self.syntax, T![=])530 }417 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }531 pub fn expr(&self) -> Option<Expr> {532 support::child(&self.syntax)533 }418}534}419535420#[derive(Debug, Clone, PartialEq, Eq, Hash)]536#[derive(Debug, Clone, PartialEq, Eq, Hash)]421pub struct ObjBodyComp {537pub struct ObjBodyComp {422 pub(crate) syntax: SyntaxNode,538 pub(crate) syntax: SyntaxNode,423}539}424impl ObjBodyComp {540impl ObjBodyComp {425 pub fn pre(&self) -> AstChildren<ObjLocalPostComma> { support::children(&self.syntax) }541 pub fn pre(&self) -> AstChildren<ObjLocalPostComma> {542 support::children(&self.syntax)543 }426 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }544 pub fn l_brack_token(&self) -> Option<SyntaxToken> {545 support::token(&self.syntax, T!['['])546 }427 pub fn key(&self) -> Option<Expr> { support::child(&self.syntax) }547 pub fn key(&self) -> Option<LhsExpr> {548 support::child(&self.syntax)549 }428 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }550 pub fn r_brack_token(&self) -> Option<SyntaxToken> {551 support::token(&self.syntax, T![']'])552 }429 pub fn plus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![+]) }553 pub fn plus_token(&self) -> Option<SyntaxToken> {554 support::token(&self.syntax, T![+])555 }430 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }556 pub fn colon_token(&self) -> Option<SyntaxToken> {557 support::token(&self.syntax, T![:])558 }431 pub fn value(&self) -> Option<Expr> { support::child(&self.syntax) }559 pub fn value(&self) -> Option<Expr> {560 support::child(&self.syntax)561 }432 pub fn post(&self) -> AstChildren<ObjLocalPreComma> { support::children(&self.syntax) }562 pub fn post(&self) -> AstChildren<ObjLocalPreComma> {563 support::children(&self.syntax)433 pub fn for_spec(&self) -> Option<ForSpec> { support::child(&self.syntax) }564 }434 pub fn comp_specs(&self) -> AstChildren<CompSpec> { support::children(&self.syntax) }565 pub fn comp_specs(&self) -> AstChildren<CompSpec> {566 support::children(&self.syntax)567 }435}568}436569437#[derive(Debug, Clone, PartialEq, Eq, Hash)]570#[derive(Debug, Clone, PartialEq, Eq, Hash)]438pub struct ObjLocalPostComma {571pub struct ObjLocalPostComma {439 pub(crate) syntax: SyntaxNode,572 pub(crate) syntax: SyntaxNode,440}573}441impl ObjLocalPostComma {574impl ObjLocalPostComma {442 pub fn obj_local(&self) -> Option<ObjLocal> { support::child(&self.syntax) }575 pub fn obj_local(&self) -> Option<ObjLocal> {576 support::child(&self.syntax)577 }443 pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }578 pub fn comma_token(&self) -> Option<SyntaxToken> {579 support::token(&self.syntax, T![,])580 }444}581}445582446#[derive(Debug, Clone, PartialEq, Eq, Hash)]583#[derive(Debug, Clone, PartialEq, Eq, Hash)]447pub struct ObjLocalPreComma {584pub struct ObjLocalPreComma {448 pub(crate) syntax: SyntaxNode,585 pub(crate) syntax: SyntaxNode,449}586}450impl ObjLocalPreComma {587impl ObjLocalPreComma {451 pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }588 pub fn comma_token(&self) -> Option<SyntaxToken> {589 support::token(&self.syntax, T![,])590 }452 pub fn obj_local(&self) -> Option<ObjLocal> { support::child(&self.syntax) }591 pub fn obj_local(&self) -> Option<ObjLocal> {592 support::child(&self.syntax)593 }453}594}454595455#[derive(Debug, Clone, PartialEq, Eq, Hash)]596#[derive(Debug, Clone, PartialEq, Eq, Hash)]456pub struct ObjBodyMemberList {597pub struct ObjBodyMemberList {457 pub(crate) syntax: SyntaxNode,598 pub(crate) syntax: SyntaxNode,458}599}459impl ObjBodyMemberList {600impl ObjBodyMemberList {460 pub fn member(&self) -> Option<Member> { support::child(&self.syntax) }601 pub fn members(&self) -> AstChildren<Member> {461 pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }602 support::children(&self.syntax)603 }462}604}463605464#[derive(Debug, Clone, PartialEq, Eq, Hash)]606#[derive(Debug, Clone, PartialEq, Eq, Hash)]465pub struct ObjLocal {607pub struct ObjLocal {466 pub(crate) syntax: SyntaxNode,608 pub(crate) syntax: SyntaxNode,467}609}468impl ObjLocal {610impl ObjLocal {469 pub fn local_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![local]) }611 pub fn local_kw_token(&self) -> Option<SyntaxToken> {612 support::token(&self.syntax, T![local])613 }470 pub fn bind(&self) -> Option<Bind> { support::child(&self.syntax) }614 pub fn bind(&self) -> Option<Bind> {615 support::child(&self.syntax)616 }471}617}472618473#[derive(Debug, Clone, PartialEq, Eq, Hash)]619#[derive(Debug, Clone, PartialEq, Eq, Hash)]474pub struct MemberBindStmt {620pub struct MemberBindStmt {475 pub(crate) syntax: SyntaxNode,621 pub(crate) syntax: SyntaxNode,476}622}477impl MemberBindStmt {623impl MemberBindStmt {478 pub fn obj_local(&self) -> Option<ObjLocal> { support::child(&self.syntax) }624 pub fn obj_local(&self) -> Option<ObjLocal> {625 support::child(&self.syntax)626 }479}627}480628481#[derive(Debug, Clone, PartialEq, Eq, Hash)]629#[derive(Debug, Clone, PartialEq, Eq, Hash)]482pub struct MemberAssertStmt {630pub struct MemberAssertStmt {483 pub(crate) syntax: SyntaxNode,631 pub(crate) syntax: SyntaxNode,484}632}485impl MemberAssertStmt {633impl MemberAssertStmt {486 pub fn assertion(&self) -> Option<Assertion> { support::child(&self.syntax) }634 pub fn assertion(&self) -> Option<Assertion> {635 support::child(&self.syntax)636 }487}637}488638489#[derive(Debug, Clone, PartialEq, Eq, Hash)]639#[derive(Debug, Clone, PartialEq, Eq, Hash)]490pub struct MemberField {640pub struct MemberField {491 pub(crate) syntax: SyntaxNode,641 pub(crate) syntax: SyntaxNode,492}642}493impl MemberField {643impl MemberField {494 pub fn field(&self) -> Option<Field> { support::child(&self.syntax) }644 pub fn field(&self) -> Option<Field> {645 support::child(&self.syntax)646 }495}647}496648497#[derive(Debug, Clone, PartialEq, Eq, Hash)]649#[derive(Debug, Clone, PartialEq, Eq, Hash)]498pub struct FieldNormal {650pub struct FieldNormal {499 pub(crate) syntax: SyntaxNode,651 pub(crate) syntax: SyntaxNode,500}652}501impl FieldNormal {653impl FieldNormal {502 pub fn field_name(&self) -> Option<FieldName> { support::child(&self.syntax) }654 pub fn field_name(&self) -> Option<FieldName> {503 pub fn plus_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![+]) }655 support::child(&self.syntax)504 pub fn visibility(&self) -> Option<Visibility> { support::child(&self.syntax) }505 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }506}507508#[derive(Debug, Clone, PartialEq, Eq, Hash)]509pub struct Visibility {510 pub(crate) syntax: SyntaxNode,511}512impl Visibility {513 pub fn coloncoloncolon_token(&self) -> Option<SyntaxToken> {514 support::token(&self.syntax, T![:::])515 }656 }516 pub fn coloncolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![::]) }657 pub fn plus_token(&self) -> Option<SyntaxToken> {658 support::token(&self.syntax, T![+])659 }517 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }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 }518}666}519667520#[derive(Debug, Clone, PartialEq, Eq, Hash)]668#[derive(Debug, Clone, PartialEq, Eq, Hash)]521pub struct FieldMethod {669pub struct FieldMethod {522 pub(crate) syntax: SyntaxNode,670 pub(crate) syntax: SyntaxNode,523}671}524impl FieldMethod {672impl FieldMethod {525 pub fn field_name(&self) -> Option<FieldName> { support::child(&self.syntax) }673 pub fn field_name(&self) -> Option<FieldName> {674 support::child(&self.syntax)526 pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }675 }527 pub fn params_desc(&self) -> Option<ParamsDesc> { support::child(&self.syntax) }676 pub fn params_desc(&self) -> Option<ParamsDesc> {677 support::child(&self.syntax)528 pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }678 }529 pub fn visibility(&self) -> Option<Visibility> { support::child(&self.syntax) }679 pub fn visibility(&self) -> Option<Visibility> {680 support::token_child(&self.syntax)681 }530 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }682 pub fn expr(&self) -> Option<Expr> {683 support::child(&self.syntax)684 }531}685}532686533#[derive(Debug, Clone, PartialEq, Eq, Hash)]687#[derive(Debug, Clone, PartialEq, Eq, Hash)]534pub struct FieldNameFixed {688pub struct FieldNameFixed {535 pub(crate) syntax: SyntaxNode,689 pub(crate) syntax: SyntaxNode,536}690}537impl FieldNameFixed {691impl FieldNameFixed {538 pub fn id(&self) -> Option<Name> { support::child(&self.syntax) }692 pub fn id(&self) -> Option<Name> {693 support::child(&self.syntax)694 }539 pub fn string(&self) -> Option<String> { support::child(&self.syntax) }695 pub fn string(&self) -> Option<String> {696 support::token_child(&self.syntax)697 }540}698}541699542#[derive(Debug, Clone, PartialEq, Eq, Hash)]700#[derive(Debug, Clone, PartialEq, Eq, Hash)]543pub struct FieldNameDynamic {701pub struct FieldNameDynamic {544 pub(crate) syntax: SyntaxNode,702 pub(crate) syntax: SyntaxNode,545}703}546impl FieldNameDynamic {704impl FieldNameDynamic {547 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }705 pub fn l_brack_token(&self) -> Option<SyntaxToken> {706 support::token(&self.syntax, T!['['])707 }548 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }708 pub fn expr(&self) -> Option<Expr> {709 support::child(&self.syntax)710 }549 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }711 pub fn r_brack_token(&self) -> Option<SyntaxToken> {712 support::token(&self.syntax, T![']'])713 }550}714}551715552#[derive(Debug, Clone, PartialEq, Eq, Hash)]716#[derive(Debug, Clone, PartialEq, Eq, Hash)]553pub struct IfSpec {717pub struct ForSpec {554 pub(crate) syntax: SyntaxNode,718 pub(crate) syntax: SyntaxNode,555}719}556impl IfSpec {720impl ForSpec {557 pub fn if_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![if]) }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 }558 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }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 }559}733}560734561#[derive(Debug, Clone, PartialEq, Eq, Hash)]735#[derive(Debug, Clone, PartialEq, Eq, Hash)]562pub struct BindDestruct {736pub struct IfSpec {563 pub(crate) syntax: SyntaxNode,737 pub(crate) syntax: SyntaxNode,564}738}565impl BindDestruct {739impl IfSpec {566 pub fn into(&self) -> Option<Destruct> { support::child(&self.syntax) }740 pub fn if_kw_token(&self) -> Option<SyntaxToken> {567 pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }741 support::token(&self.syntax, T![if])742 }568 pub fn value(&self) -> Option<Expr> { support::child(&self.syntax) }743 pub fn expr(&self) -> Option<Expr> {744 support::child(&self.syntax)745 }569}746}570747571#[derive(Debug, Clone, PartialEq, Eq, Hash)]748#[derive(Debug, Clone, PartialEq, Eq, Hash)]572pub struct Destruct {749pub struct BindDestruct {573 pub(crate) syntax: SyntaxNode,750 pub(crate) syntax: SyntaxNode,574}751}575impl Destruct {752impl BindDestruct {576 pub fn destruct_full(&self) -> Option<DestructFull> { support::child(&self.syntax) }753 pub fn into(&self) -> Option<Destruct> {577 pub fn destruct_skip(&self) -> Option<DestructSkip> { support::child(&self.syntax) }754 support::child(&self.syntax)755 }578 pub fn destruct_array(&self) -> Option<DestructArray> { support::child(&self.syntax) }756 pub fn assign_token(&self) -> Option<SyntaxToken> {757 support::token(&self.syntax, T![=])758 }579 pub fn destruct_object(&self) -> Option<DestructObject> { support::child(&self.syntax) }759 pub fn value(&self) -> Option<Expr> {760 support::child(&self.syntax)761 }580}762}581763582#[derive(Debug, Clone, PartialEq, Eq, Hash)]764#[derive(Debug, Clone, PartialEq, Eq, Hash)]583pub struct BindFunction {765pub struct BindFunction {584 pub(crate) syntax: SyntaxNode,766 pub(crate) syntax: SyntaxNode,585}767}586impl BindFunction {768impl BindFunction {587 pub fn name(&self) -> Option<Name> { support::child(&self.syntax) }769 pub fn name(&self) -> Option<Name> {770 support::child(&self.syntax)588 pub fn l_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['(']) }771 }589 pub fn params(&self) -> Option<ParamsDesc> { support::child(&self.syntax) }772 pub fn params(&self) -> Option<ParamsDesc> {773 support::child(&self.syntax)590 pub fn r_paren_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![')']) }774 }591 pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }775 pub fn assign_token(&self) -> Option<SyntaxToken> {776 support::token(&self.syntax, T![=])777 }592 pub fn value(&self) -> Option<Expr> { support::child(&self.syntax) }778 pub fn value(&self) -> Option<Expr> {779 support::child(&self.syntax)780 }593}781}594782595#[derive(Debug, Clone, PartialEq, Eq, Hash)]783#[derive(Debug, Clone, PartialEq, Eq, Hash)]596pub struct Param {784pub struct Param {597 pub(crate) syntax: SyntaxNode,785 pub(crate) syntax: SyntaxNode,598}786}599impl Param {787impl Param {600 pub fn destruct(&self) -> Option<Destruct> { support::child(&self.syntax) }788 pub fn destruct(&self) -> Option<Destruct> {789 support::child(&self.syntax)790 }601 pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }791 pub fn assign_token(&self) -> Option<SyntaxToken> {792 support::token(&self.syntax, T![=])793 }602 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }794 pub fn expr(&self) -> Option<Expr> {795 support::child(&self.syntax)796 }603}797}604798605#[derive(Debug, Clone, PartialEq, Eq, Hash)]799#[derive(Debug, Clone, PartialEq, Eq, Hash)]606pub struct DestructFull {800pub struct DestructFull {607 pub(crate) syntax: SyntaxNode,801 pub(crate) syntax: SyntaxNode,608}802}609impl DestructFull {803impl DestructFull {610 pub fn into(&self) -> Option<Name> { support::child(&self.syntax) }804 pub fn name(&self) -> Option<Name> {805 support::child(&self.syntax)806 }611}807}612808613#[derive(Debug, Clone, PartialEq, Eq, Hash)]809#[derive(Debug, Clone, PartialEq, Eq, Hash)]614pub struct DestructSkip {810pub struct DestructSkip {615 pub(crate) syntax: SyntaxNode,811 pub(crate) syntax: SyntaxNode,616}812}617impl DestructSkip {813impl DestructSkip {618 pub fn question_mark_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![?]) }814 pub fn question_mark_token(&self) -> Option<SyntaxToken> {815 support::token(&self.syntax, T![?])816 }619}817}620818621#[derive(Debug, Clone, PartialEq, Eq, Hash)]819#[derive(Debug, Clone, PartialEq, Eq, Hash)]622pub struct DestructArray {820pub struct DestructArray {623 pub(crate) syntax: SyntaxNode,821 pub(crate) syntax: SyntaxNode,624}822}625impl DestructArray {823impl DestructArray {626 pub fn l_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['[']) }824 pub fn l_brack_token(&self) -> Option<SyntaxToken> {825 support::token(&self.syntax, T!['['])627 pub fn start(&self) -> AstChildren<Destruct> { support::children(&self.syntax) }826 }628 pub fn destruct_rest(&self) -> Option<DestructRest> { support::child(&self.syntax) }827 pub fn destruct_array_parts(&self) -> AstChildren<DestructArrayPart> {629 pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }828 support::children(&self.syntax)630 pub fn end(&self) -> AstChildren<Destruct> { support::children(&self.syntax) }829 }631 pub fn r_brack_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![']']) }830 pub fn r_brack_token(&self) -> Option<SyntaxToken> {831 support::token(&self.syntax, T![']'])832 }632}833}633834634#[derive(Debug, Clone, PartialEq, Eq, Hash)]835#[derive(Debug, Clone, PartialEq, Eq, Hash)]635pub struct DestructRest {636 pub(crate) syntax: SyntaxNode,637}638impl DestructRest {639 pub fn dotdotdot_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![...]) }640 pub fn into(&self) -> Option<Name> { support::child(&self.syntax) }641}642643#[derive(Debug, Clone, PartialEq, Eq, Hash)]644pub struct DestructObject {836pub struct DestructObject {645 pub(crate) syntax: SyntaxNode,837 pub(crate) syntax: SyntaxNode,646}838}647impl DestructObject {839impl DestructObject {648 pub fn l_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['{']) }840 pub fn l_brace_token(&self) -> Option<SyntaxToken> {841 support::token(&self.syntax, T!['{'])842 }649 pub fn destruct_object_fields(&self) -> AstChildren<DestructObjectField> {843 pub fn destruct_object_fields(&self) -> AstChildren<DestructObjectField> {650 support::children(&self.syntax)844 support::children(&self.syntax)651 }845 }652 pub fn destruct_rest(&self) -> Option<DestructRest> { support::child(&self.syntax) }846 pub fn destruct_rest(&self) -> Option<DestructRest> {847 support::child(&self.syntax)848 }653 pub fn comma_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![,]) }849 pub fn comma_token(&self) -> Option<SyntaxToken> {850 support::token(&self.syntax, T![,])851 }654 pub fn r_brace_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T!['}']) }852 pub fn r_brace_token(&self) -> Option<SyntaxToken> {853 support::token(&self.syntax, T!['}'])854 }655}855}656856657#[derive(Debug, Clone, PartialEq, Eq, Hash)]857#[derive(Debug, Clone, PartialEq, Eq, Hash)]658pub struct DestructObjectField {858pub struct DestructObjectField {659 pub(crate) syntax: SyntaxNode,859 pub(crate) syntax: SyntaxNode,660}860}661impl DestructObjectField {861impl DestructObjectField {662 pub fn field(&self) -> Option<Name> { support::child(&self.syntax) }862 pub fn field(&self) -> Option<Name> {863 support::child(&self.syntax)864 }663 pub fn colon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![:]) }865 pub fn colon_token(&self) -> Option<SyntaxToken> {866 support::token(&self.syntax, T![:])867 }664 pub fn destruct(&self) -> Option<Destruct> { support::child(&self.syntax) }868 pub fn destruct(&self) -> Option<Destruct> {869 support::child(&self.syntax)870 }665 pub fn assign_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }871 pub fn assign_token(&self) -> Option<SyntaxToken> {872 support::token(&self.syntax, T![=])873 }666 pub fn expr(&self) -> Option<Expr> { support::child(&self.syntax) }874 pub fn expr(&self) -> Option<Expr> {875 support::child(&self.syntax)876 }667}877}668878669#[derive(Debug, Clone, PartialEq, Eq, Hash)]879#[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)]670pub enum Expr {903pub enum Expr {671 ExprBinary(ExprBinary),904 ExprBinary(ExprBinary),672 ExprUnary(ExprUnary),905 ExprUnary(ExprUnary),681 ExprIntrinsic(ExprIntrinsic),914 ExprIntrinsic(ExprIntrinsic),682 ExprString(ExprString),915 ExprString(ExprString),683 ExprNumber(ExprNumber),916 ExprNumber(ExprNumber),917 ExprLiteral(ExprLiteral),684 ExprArray(ExprArray),918 ExprArray(ExprArray),685 ExprObject(ExprObject),919 ExprObject(ExprObject),686 ExprArrayComp(ExprArrayComp),920 ExprArrayComp(ExprArrayComp),729 FieldNameFixed(FieldNameFixed),963 FieldNameFixed(FieldNameFixed),730 FieldNameDynamic(FieldNameDynamic),964 FieldNameDynamic(FieldNameDynamic),731}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}732impl AstNode for SourceFile {1092impl AstNode for SourceFile {733 fn can_cast(kind: SyntaxKind) -> bool { kind == SOURCE_FILE }1093 fn can_cast(kind: SyntaxKind) -> bool {1094 kind == SOURCE_FILE1095 }734 fn cast(syntax: SyntaxNode) -> Option<Self> {1096 fn cast(syntax: SyntaxNode) -> Option<Self> {735 if Self::can_cast(syntax.kind()) {1097 if Self::can_cast(syntax.kind()) {736 Some(Self { syntax })1098 Some(Self { syntax })737 } else {1099 } else {738 None1100 None739 }1101 }740 }1102 }741 fn syntax(&self) -> &SyntaxNode { &self.syntax }1103 fn syntax(&self) -> &SyntaxNode {1104 &self.syntax1105 }742}1106}743impl AstNode for ExprBinary {1107impl AstNode for ExprBinary {744 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_BINARY }1108 fn can_cast(kind: SyntaxKind) -> bool {1109 kind == EXPR_BINARY1110 }745 fn cast(syntax: SyntaxNode) -> Option<Self> {1111 fn cast(syntax: SyntaxNode) -> Option<Self> {746 if Self::can_cast(syntax.kind()) {1112 if Self::can_cast(syntax.kind()) {747 Some(Self { syntax })1113 Some(Self { syntax })748 } else {1114 } else {749 None1115 None750 }1116 }751 }1117 }752 fn syntax(&self) -> &SyntaxNode { &self.syntax }1118 fn syntax(&self) -> &SyntaxNode {1119 &self.syntax1120 }753}1121}754impl AstNode for BinaryOperator {1122impl AstNode for LhsExpr {755 fn can_cast(kind: SyntaxKind) -> bool { kind == BINARY_OPERATOR }1123 fn can_cast(kind: SyntaxKind) -> bool {1124 kind == LHS_EXPR1125 }756 fn cast(syntax: SyntaxNode) -> Option<Self> {1126 fn cast(syntax: SyntaxNode) -> Option<Self> {757 if Self::can_cast(syntax.kind()) {1127 if Self::can_cast(syntax.kind()) {758 Some(Self { syntax })1128 Some(Self { syntax })759 } else {1129 } else {760 None1130 None761 }1131 }762 }1132 }763 fn syntax(&self) -> &SyntaxNode { &self.syntax }1133 fn syntax(&self) -> &SyntaxNode {1134 &self.syntax1135 }764}1136}765impl AstNode for ExprUnary {1137impl AstNode for ExprUnary {766 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_UNARY }1138 fn can_cast(kind: SyntaxKind) -> bool {767 fn cast(syntax: SyntaxNode) -> Option<Self> {1139 kind == EXPR_UNARY768 if Self::can_cast(syntax.kind()) {769 Some(Self { syntax })770 } else {771 None772 }773 }1140 }774 fn syntax(&self) -> &SyntaxNode { &self.syntax }775}776impl AstNode for UnaryOperator {777 fn can_cast(kind: SyntaxKind) -> bool { kind == UNARY_OPERATOR }778 fn cast(syntax: SyntaxNode) -> Option<Self> {1141 fn cast(syntax: SyntaxNode) -> Option<Self> {779 if Self::can_cast(syntax.kind()) {1142 if Self::can_cast(syntax.kind()) {780 Some(Self { syntax })1143 Some(Self { syntax })781 } else {1144 } else {782 None1145 None783 }1146 }784 }1147 }785 fn syntax(&self) -> &SyntaxNode { &self.syntax }1148 fn syntax(&self) -> &SyntaxNode {1149 &self.syntax1150 }786}1151}787impl AstNode for ExprSlice {1152impl AstNode for ExprSlice {788 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_SLICE }1153 fn can_cast(kind: SyntaxKind) -> bool {1154 kind == EXPR_SLICE1155 }789 fn cast(syntax: SyntaxNode) -> Option<Self> {1156 fn cast(syntax: SyntaxNode) -> Option<Self> {790 if Self::can_cast(syntax.kind()) {1157 if Self::can_cast(syntax.kind()) {791 Some(Self { syntax })1158 Some(Self { syntax })792 } else {1159 } else {793 None1160 None794 }1161 }795 }1162 }796 fn syntax(&self) -> &SyntaxNode { &self.syntax }1163 fn syntax(&self) -> &SyntaxNode {1164 &self.syntax1165 }797}1166}798impl AstNode for SliceDesc {1167impl AstNode for SliceDesc {799 fn can_cast(kind: SyntaxKind) -> bool { kind == SLICE_DESC }1168 fn can_cast(kind: SyntaxKind) -> bool {1169 kind == SLICE_DESC1170 }800 fn cast(syntax: SyntaxNode) -> Option<Self> {1171 fn cast(syntax: SyntaxNode) -> Option<Self> {801 if Self::can_cast(syntax.kind()) {1172 if Self::can_cast(syntax.kind()) {802 Some(Self { syntax })1173 Some(Self { syntax })803 } else {1174 } else {804 None1175 None805 }1176 }806 }1177 }807 fn syntax(&self) -> &SyntaxNode { &self.syntax }1178 fn syntax(&self) -> &SyntaxNode {1179 &self.syntax1180 }808}1181}809impl AstNode for ExprIndex {1182impl AstNode for ExprIndex {810 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INDEX }1183 fn can_cast(kind: SyntaxKind) -> bool {1184 kind == EXPR_INDEX1185 }811 fn cast(syntax: SyntaxNode) -> Option<Self> {1186 fn cast(syntax: SyntaxNode) -> Option<Self> {812 if Self::can_cast(syntax.kind()) {1187 if Self::can_cast(syntax.kind()) {813 Some(Self { syntax })1188 Some(Self { syntax })814 } else {1189 } else {815 None1190 None816 }1191 }817 }1192 }818 fn syntax(&self) -> &SyntaxNode { &self.syntax }1193 fn syntax(&self) -> &SyntaxNode {1194 &self.syntax1195 }819}1196}820impl AstNode for Name {1197impl AstNode for Name {821 fn can_cast(kind: SyntaxKind) -> bool { kind == NAME }1198 fn can_cast(kind: SyntaxKind) -> bool {1199 kind == NAME1200 }822 fn cast(syntax: SyntaxNode) -> Option<Self> {1201 fn cast(syntax: SyntaxNode) -> Option<Self> {823 if Self::can_cast(syntax.kind()) {1202 if Self::can_cast(syntax.kind()) {824 Some(Self { syntax })1203 Some(Self { syntax })825 } else {1204 } else {826 None1205 None827 }1206 }828 }1207 }829 fn syntax(&self) -> &SyntaxNode { &self.syntax }1208 fn syntax(&self) -> &SyntaxNode {1209 &self.syntax1210 }830}1211}831impl AstNode for ExprIndexExpr {1212impl AstNode for ExprIndexExpr {832 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INDEX_EXPR }1213 fn can_cast(kind: SyntaxKind) -> bool {1214 kind == EXPR_INDEX_EXPR1215 }833 fn cast(syntax: SyntaxNode) -> Option<Self> {1216 fn cast(syntax: SyntaxNode) -> Option<Self> {834 if Self::can_cast(syntax.kind()) {1217 if Self::can_cast(syntax.kind()) {835 Some(Self { syntax })1218 Some(Self { syntax })836 } else {1219 } else {837 None1220 None838 }1221 }839 }1222 }840 fn syntax(&self) -> &SyntaxNode { &self.syntax }1223 fn syntax(&self) -> &SyntaxNode {1224 &self.syntax1225 }841}1226}842impl AstNode for ExprApply {1227impl AstNode for ExprApply {843 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_APPLY }1228 fn can_cast(kind: SyntaxKind) -> bool {1229 kind == EXPR_APPLY1230 }844 fn cast(syntax: SyntaxNode) -> Option<Self> {1231 fn cast(syntax: SyntaxNode) -> Option<Self> {845 if Self::can_cast(syntax.kind()) {1232 if Self::can_cast(syntax.kind()) {846 Some(Self { syntax })1233 Some(Self { syntax })847 } else {1234 } else {848 None1235 None849 }1236 }850 }1237 }851 fn syntax(&self) -> &SyntaxNode { &self.syntax }1238 fn syntax(&self) -> &SyntaxNode {1239 &self.syntax1240 }852}1241}853impl AstNode for ArgsDesc {1242impl AstNode for ArgsDesc {854 fn can_cast(kind: SyntaxKind) -> bool { kind == ARGS_DESC }1243 fn can_cast(kind: SyntaxKind) -> bool {1244 kind == ARGS_DESC1245 }855 fn cast(syntax: SyntaxNode) -> Option<Self> {1246 fn cast(syntax: SyntaxNode) -> Option<Self> {856 if Self::can_cast(syntax.kind()) {1247 if Self::can_cast(syntax.kind()) {857 Some(Self { syntax })1248 Some(Self { syntax })858 } else {1249 } else {859 None1250 None860 }1251 }861 }1252 }862 fn syntax(&self) -> &SyntaxNode { &self.syntax }1253 fn syntax(&self) -> &SyntaxNode {1254 &self.syntax1255 }863}1256}864impl AstNode for ExprObjExtend {1257impl AstNode for ExprObjExtend {865 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_OBJ_EXTEND }1258 fn can_cast(kind: SyntaxKind) -> bool {1259 kind == EXPR_OBJ_EXTEND1260 }866 fn cast(syntax: SyntaxNode) -> Option<Self> {1261 fn cast(syntax: SyntaxNode) -> Option<Self> {867 if Self::can_cast(syntax.kind()) {1262 if Self::can_cast(syntax.kind()) {868 Some(Self { syntax })1263 Some(Self { syntax })869 } else {1264 } else {870 None1265 None871 }1266 }872 }1267 }873 fn syntax(&self) -> &SyntaxNode { &self.syntax }1268 fn syntax(&self) -> &SyntaxNode {1269 &self.syntax1270 }874}1271}875impl AstNode for ExprParened {1272impl AstNode for ExprParened {876 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_PARENED }1273 fn can_cast(kind: SyntaxKind) -> bool {1274 kind == EXPR_PARENED1275 }877 fn cast(syntax: SyntaxNode) -> Option<Self> {1276 fn cast(syntax: SyntaxNode) -> Option<Self> {878 if Self::can_cast(syntax.kind()) {1277 if Self::can_cast(syntax.kind()) {879 Some(Self { syntax })1278 Some(Self { syntax })880 } else {1279 } else {881 None1280 None882 }1281 }883 }1282 }884 fn syntax(&self) -> &SyntaxNode { &self.syntax }1283 fn syntax(&self) -> &SyntaxNode {1284 &self.syntax1285 }885}1286}886impl AstNode for ExprLiteral {1287impl AstNode for ExprLiteral {887 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_LITERAL }1288 fn can_cast(kind: SyntaxKind) -> bool {1289 kind == EXPR_LITERAL1290 }888 fn cast(syntax: SyntaxNode) -> Option<Self> {1291 fn cast(syntax: SyntaxNode) -> Option<Self> {889 if Self::can_cast(syntax.kind()) {1292 if Self::can_cast(syntax.kind()) {890 Some(Self { syntax })1293 Some(Self { syntax })891 } else {1294 } else {892 None1295 None893 }1296 }894 }1297 }895 fn syntax(&self) -> &SyntaxNode { &self.syntax }1298 fn syntax(&self) -> &SyntaxNode {1299 &self.syntax1300 }896}1301}897impl AstNode for Literal {1302impl AstNode for ExprIntrinsicThisFile {898 fn can_cast(kind: SyntaxKind) -> bool { kind == LITERAL }1303 fn can_cast(kind: SyntaxKind) -> bool {1304 kind == EXPR_INTRINSIC_THIS_FILE1305 }899 fn cast(syntax: SyntaxNode) -> Option<Self> {1306 fn cast(syntax: SyntaxNode) -> Option<Self> {900 if Self::can_cast(syntax.kind()) {1307 if Self::can_cast(syntax.kind()) {901 Some(Self { syntax })1308 Some(Self { syntax })902 } else {1309 } else {903 None1310 None904 }1311 }905 }1312 }906 fn syntax(&self) -> &SyntaxNode { &self.syntax }1313 fn syntax(&self) -> &SyntaxNode {1314 &self.syntax1315 }907}1316}908impl AstNode for ExprIntrinsicThisFile {1317impl AstNode for ExprIntrinsicId {909 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INTRINSIC_THIS_FILE }1318 fn can_cast(kind: SyntaxKind) -> bool {1319 kind == EXPR_INTRINSIC_ID1320 }910 fn cast(syntax: SyntaxNode) -> Option<Self> {1321 fn cast(syntax: SyntaxNode) -> Option<Self> {911 if Self::can_cast(syntax.kind()) {1322 if Self::can_cast(syntax.kind()) {912 Some(Self { syntax })1323 Some(Self { syntax })913 } else {1324 } else {914 None1325 None915 }1326 }916 }1327 }917 fn syntax(&self) -> &SyntaxNode { &self.syntax }1328 fn syntax(&self) -> &SyntaxNode {1329 &self.syntax1330 }918}1331}919impl AstNode for ExprIntrinsicId {1332impl AstNode for ExprIntrinsic {920 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INTRINSIC_ID }1333 fn can_cast(kind: SyntaxKind) -> bool {1334 kind == EXPR_INTRINSIC1335 }921 fn cast(syntax: SyntaxNode) -> Option<Self> {1336 fn cast(syntax: SyntaxNode) -> Option<Self> {922 if Self::can_cast(syntax.kind()) {1337 if Self::can_cast(syntax.kind()) {923 Some(Self { syntax })1338 Some(Self { syntax })924 } else {1339 } else {925 None1340 None926 }1341 }927 }1342 }928 fn syntax(&self) -> &SyntaxNode { &self.syntax }1343 fn syntax(&self) -> &SyntaxNode {1344 &self.syntax1345 }929}1346}930impl AstNode for ExprIntrinsic {1347impl AstNode for ExprString {931 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_INTRINSIC }1348 fn can_cast(kind: SyntaxKind) -> bool {1349 kind == EXPR_STRING1350 }932 fn cast(syntax: SyntaxNode) -> Option<Self> {1351 fn cast(syntax: SyntaxNode) -> Option<Self> {933 if Self::can_cast(syntax.kind()) {1352 if Self::can_cast(syntax.kind()) {934 Some(Self { syntax })1353 Some(Self { syntax })935 } else {1354 } else {936 None1355 None937 }1356 }938 }1357 }939 fn syntax(&self) -> &SyntaxNode { &self.syntax }1358 fn syntax(&self) -> &SyntaxNode {1359 &self.syntax1360 }940}1361}941impl AstNode for ExprString {1362impl AstNode for ExprNumber {942 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_STRING }1363 fn can_cast(kind: SyntaxKind) -> bool {1364 kind == EXPR_NUMBER1365 }943 fn cast(syntax: SyntaxNode) -> Option<Self> {1366 fn cast(syntax: SyntaxNode) -> Option<Self> {944 if Self::can_cast(syntax.kind()) {1367 if Self::can_cast(syntax.kind()) {945 Some(Self { syntax })1368 Some(Self { syntax })946 } else {1369 } else {947 None1370 None948 }1371 }949 }1372 }950 fn syntax(&self) -> &SyntaxNode { &self.syntax }1373 fn syntax(&self) -> &SyntaxNode {1374 &self.syntax1375 }951}1376}952impl AstNode for String {1377impl AstNode for ExprArray {953 fn can_cast(kind: SyntaxKind) -> bool { kind == STRING }1378 fn can_cast(kind: SyntaxKind) -> bool {1379 kind == EXPR_ARRAY1380 }954 fn cast(syntax: SyntaxNode) -> Option<Self> {1381 fn cast(syntax: SyntaxNode) -> Option<Self> {955 if Self::can_cast(syntax.kind()) {1382 if Self::can_cast(syntax.kind()) {956 Some(Self { syntax })1383 Some(Self { syntax })957 } else {1384 } else {958 None1385 None959 }1386 }960 }1387 }961 fn syntax(&self) -> &SyntaxNode { &self.syntax }1388 fn syntax(&self) -> &SyntaxNode {1389 &self.syntax1390 }962}1391}963impl AstNode for ExprNumber {1392impl AstNode for ExprObject {964 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_NUMBER }1393 fn can_cast(kind: SyntaxKind) -> bool {1394 kind == EXPR_OBJECT1395 }965 fn cast(syntax: SyntaxNode) -> Option<Self> {1396 fn cast(syntax: SyntaxNode) -> Option<Self> {966 if Self::can_cast(syntax.kind()) {1397 if Self::can_cast(syntax.kind()) {967 Some(Self { syntax })1398 Some(Self { syntax })968 } else {1399 } else {969 None1400 None970 }1401 }971 }1402 }972 fn syntax(&self) -> &SyntaxNode { &self.syntax }1403 fn syntax(&self) -> &SyntaxNode {1404 &self.syntax1405 }973}1406}974impl AstNode for Number {1407impl AstNode for ExprArrayComp {975 fn can_cast(kind: SyntaxKind) -> bool { kind == NUMBER }1408 fn can_cast(kind: SyntaxKind) -> bool {1409 kind == EXPR_ARRAY_COMP1410 }976 fn cast(syntax: SyntaxNode) -> Option<Self> {1411 fn cast(syntax: SyntaxNode) -> Option<Self> {977 if Self::can_cast(syntax.kind()) {1412 if Self::can_cast(syntax.kind()) {978 Some(Self { syntax })1413 Some(Self { syntax })979 } else {1414 } else {980 None1415 None981 }1416 }982 }1417 }983 fn syntax(&self) -> &SyntaxNode { &self.syntax }1418 fn syntax(&self) -> &SyntaxNode {1419 &self.syntax1420 }984}1421}985impl AstNode for ExprArray {1422impl AstNode for ExprImport {986 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ARRAY }1423 fn can_cast(kind: SyntaxKind) -> bool {1424 kind == EXPR_IMPORT1425 }987 fn cast(syntax: SyntaxNode) -> Option<Self> {1426 fn cast(syntax: SyntaxNode) -> Option<Self> {988 if Self::can_cast(syntax.kind()) {1427 if Self::can_cast(syntax.kind()) {989 Some(Self { syntax })1428 Some(Self { syntax })990 } else {1429 } else {991 None1430 None992 }1431 }993 }1432 }994 fn syntax(&self) -> &SyntaxNode { &self.syntax }1433 fn syntax(&self) -> &SyntaxNode {1434 &self.syntax1435 }995}1436}996impl AstNode for ExprObject {1437impl AstNode for ExprVar {997 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_OBJECT }1438 fn can_cast(kind: SyntaxKind) -> bool {1439 kind == EXPR_VAR1440 }998 fn cast(syntax: SyntaxNode) -> Option<Self> {1441 fn cast(syntax: SyntaxNode) -> Option<Self> {999 if Self::can_cast(syntax.kind()) {1442 if Self::can_cast(syntax.kind()) {1000 Some(Self { syntax })1443 Some(Self { syntax })1001 } else {1444 } else {1002 None1445 None1003 }1446 }1004 }1447 }1005 fn syntax(&self) -> &SyntaxNode { &self.syntax }1448 fn syntax(&self) -> &SyntaxNode {1449 &self.syntax1450 }1006}1451}1007impl AstNode for ExprArrayComp {1452impl AstNode for ExprLocal {1008 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ARRAY_COMP }1453 fn can_cast(kind: SyntaxKind) -> bool {1454 kind == EXPR_LOCAL1455 }1009 fn cast(syntax: SyntaxNode) -> Option<Self> {1456 fn cast(syntax: SyntaxNode) -> Option<Self> {1010 if Self::can_cast(syntax.kind()) {1457 if Self::can_cast(syntax.kind()) {1011 Some(Self { syntax })1458 Some(Self { syntax })1012 } else {1459 } else {1013 None1460 None1014 }1461 }1015 }1462 }1016 fn syntax(&self) -> &SyntaxNode { &self.syntax }1463 fn syntax(&self) -> &SyntaxNode {1464 &self.syntax1465 }1017}1466}1018impl AstNode for ForSpec {1467impl AstNode for ExprIfThenElse {1019 fn can_cast(kind: SyntaxKind) -> bool { kind == FOR_SPEC }1468 fn can_cast(kind: SyntaxKind) -> bool {1469 kind == EXPR_IF_THEN_ELSE1470 }1020 fn cast(syntax: SyntaxNode) -> Option<Self> {1471 fn cast(syntax: SyntaxNode) -> Option<Self> {1021 if Self::can_cast(syntax.kind()) {1472 if Self::can_cast(syntax.kind()) {1022 Some(Self { syntax })1473 Some(Self { syntax })1023 } else {1474 } else {1024 None1475 None1025 }1476 }1026 }1477 }1027 fn syntax(&self) -> &SyntaxNode { &self.syntax }1478 fn syntax(&self) -> &SyntaxNode {1479 &self.syntax1480 }1028}1481}1029impl AstNode for ExprImport {1482impl AstNode for TrueExpr {1030 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_IMPORT }1483 fn can_cast(kind: SyntaxKind) -> bool {1484 kind == TRUE_EXPR1485 }1031 fn cast(syntax: SyntaxNode) -> Option<Self> {1486 fn cast(syntax: SyntaxNode) -> Option<Self> {1032 if Self::can_cast(syntax.kind()) {1487 if Self::can_cast(syntax.kind()) {1033 Some(Self { syntax })1488 Some(Self { syntax })1034 } else {1489 } else {1035 None1490 None1036 }1491 }1037 }1492 }1038 fn syntax(&self) -> &SyntaxNode { &self.syntax }1493 fn syntax(&self) -> &SyntaxNode {1494 &self.syntax1495 }1039}1496}1040impl AstNode for ExprVar {1497impl AstNode for FalseExpr {1041 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_VAR }1498 fn can_cast(kind: SyntaxKind) -> bool {1499 kind == FALSE_EXPR1500 }1042 fn cast(syntax: SyntaxNode) -> Option<Self> {1501 fn cast(syntax: SyntaxNode) -> Option<Self> {1043 if Self::can_cast(syntax.kind()) {1502 if Self::can_cast(syntax.kind()) {1044 Some(Self { syntax })1503 Some(Self { syntax })1045 } else {1504 } else {1046 None1505 None1047 }1506 }1048 }1507 }1049 fn syntax(&self) -> &SyntaxNode { &self.syntax }1508 fn syntax(&self) -> &SyntaxNode {1509 &self.syntax1510 }1050}1511}1051impl AstNode for ExprLocal {1512impl AstNode for ExprFunction {1052 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_LOCAL }1513 fn can_cast(kind: SyntaxKind) -> bool {1514 kind == EXPR_FUNCTION1515 }1053 fn cast(syntax: SyntaxNode) -> Option<Self> {1516 fn cast(syntax: SyntaxNode) -> Option<Self> {1054 if Self::can_cast(syntax.kind()) {1517 if Self::can_cast(syntax.kind()) {1055 Some(Self { syntax })1518 Some(Self { syntax })1056 } else {1519 } else {1057 None1520 None1058 }1521 }1059 }1522 }1060 fn syntax(&self) -> &SyntaxNode { &self.syntax }1523 fn syntax(&self) -> &SyntaxNode {1524 &self.syntax1525 }1061}1526}1062impl AstNode for ExprIfThenElse {1527impl AstNode for ParamsDesc {1063 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_IF_THEN_ELSE }1528 fn can_cast(kind: SyntaxKind) -> bool {1529 kind == PARAMS_DESC1530 }1064 fn cast(syntax: SyntaxNode) -> Option<Self> {1531 fn cast(syntax: SyntaxNode) -> Option<Self> {1065 if Self::can_cast(syntax.kind()) {1532 if Self::can_cast(syntax.kind()) {1066 Some(Self { syntax })1533 Some(Self { syntax })1067 } else {1534 } else {1068 None1535 None1069 }1536 }1070 }1537 }1071 fn syntax(&self) -> &SyntaxNode { &self.syntax }1538 fn syntax(&self) -> &SyntaxNode {1539 &self.syntax1540 }1072}1541}1073impl AstNode for ExprFunction {1542impl AstNode for ExprAssert {1074 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_FUNCTION }1543 fn can_cast(kind: SyntaxKind) -> bool {1544 kind == EXPR_ASSERT1545 }1075 fn cast(syntax: SyntaxNode) -> Option<Self> {1546 fn cast(syntax: SyntaxNode) -> Option<Self> {1076 if Self::can_cast(syntax.kind()) {1547 if Self::can_cast(syntax.kind()) {1077 Some(Self { syntax })1548 Some(Self { syntax })1078 } else {1549 } else {1079 None1550 None1080 }1551 }1081 }1552 }1082 fn syntax(&self) -> &SyntaxNode { &self.syntax }1553 fn syntax(&self) -> &SyntaxNode {1554 &self.syntax1555 }1083}1556}1084impl AstNode for ParamsDesc {1557impl AstNode for Assertion {1085 fn can_cast(kind: SyntaxKind) -> bool { kind == PARAMS_DESC }1558 fn can_cast(kind: SyntaxKind) -> bool {1559 kind == ASSERTION1560 }1086 fn cast(syntax: SyntaxNode) -> Option<Self> {1561 fn cast(syntax: SyntaxNode) -> Option<Self> {1087 if Self::can_cast(syntax.kind()) {1562 if Self::can_cast(syntax.kind()) {1088 Some(Self { syntax })1563 Some(Self { syntax })1089 } else {1564 } else {1090 None1565 None1091 }1566 }1092 }1567 }1093 fn syntax(&self) -> &SyntaxNode { &self.syntax }1568 fn syntax(&self) -> &SyntaxNode {1569 &self.syntax1570 }1094}1571}1095impl AstNode for ExprAssert {1572impl AstNode for ExprError {1096 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ASSERT }1573 fn can_cast(kind: SyntaxKind) -> bool {1574 kind == EXPR_ERROR1575 }1097 fn cast(syntax: SyntaxNode) -> Option<Self> {1576 fn cast(syntax: SyntaxNode) -> Option<Self> {1098 if Self::can_cast(syntax.kind()) {1577 if Self::can_cast(syntax.kind()) {1099 Some(Self { syntax })1578 Some(Self { syntax })1100 } else {1579 } else {1101 None1580 None1102 }1581 }1103 }1582 }1104 fn syntax(&self) -> &SyntaxNode { &self.syntax }1583 fn syntax(&self) -> &SyntaxNode {1584 &self.syntax1585 }1105}1586}1106impl AstNode for Assertion {1587impl AstNode for SliceDescEnd {1107 fn can_cast(kind: SyntaxKind) -> bool { kind == ASSERTION }1588 fn can_cast(kind: SyntaxKind) -> bool {1589 kind == SLICE_DESC_END1590 }1108 fn cast(syntax: SyntaxNode) -> Option<Self> {1591 fn cast(syntax: SyntaxNode) -> Option<Self> {1109 if Self::can_cast(syntax.kind()) {1592 if Self::can_cast(syntax.kind()) {1110 Some(Self { syntax })1593 Some(Self { syntax })1111 } else {1594 } else {1112 None1595 None1113 }1596 }1114 }1597 }1115 fn syntax(&self) -> &SyntaxNode { &self.syntax }1598 fn syntax(&self) -> &SyntaxNode {1599 &self.syntax1600 }1116}1601}1117impl AstNode for ExprError {1602impl AstNode for SliceDescStep {1118 fn can_cast(kind: SyntaxKind) -> bool { kind == EXPR_ERROR }1603 fn can_cast(kind: SyntaxKind) -> bool {1604 kind == SLICE_DESC_STEP1605 }1119 fn cast(syntax: SyntaxNode) -> Option<Self> {1606 fn cast(syntax: SyntaxNode) -> Option<Self> {1120 if Self::can_cast(syntax.kind()) {1607 if Self::can_cast(syntax.kind()) {1121 Some(Self { syntax })1608 Some(Self { syntax })1122 } else {1609 } else {1123 None1610 None1124 }1611 }1125 }1612 }1126 fn syntax(&self) -> &SyntaxNode { &self.syntax }1613 fn syntax(&self) -> &SyntaxNode {1614 &self.syntax1615 }1127}1616}1128impl AstNode for Arg {1617impl AstNode for Arg {1129 fn can_cast(kind: SyntaxKind) -> bool { kind == ARG }1618 fn can_cast(kind: SyntaxKind) -> bool {1619 kind == ARG1620 }1130 fn cast(syntax: SyntaxNode) -> Option<Self> {1621 fn cast(syntax: SyntaxNode) -> Option<Self> {1131 if Self::can_cast(syntax.kind()) {1622 if Self::can_cast(syntax.kind()) {1132 Some(Self { syntax })1623 Some(Self { syntax })1133 } else {1624 } else {1134 None1625 None1135 }1626 }1136 }1627 }1137 fn syntax(&self) -> &SyntaxNode { &self.syntax }1628 fn syntax(&self) -> &SyntaxNode {1629 &self.syntax1630 }1138}1631}1139impl AstNode for ObjBodyComp {1632impl AstNode for ObjBodyComp {1140 fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_BODY_COMP }1633 fn can_cast(kind: SyntaxKind) -> bool {1634 kind == OBJ_BODY_COMP1635 }1141 fn cast(syntax: SyntaxNode) -> Option<Self> {1636 fn cast(syntax: SyntaxNode) -> Option<Self> {1142 if Self::can_cast(syntax.kind()) {1637 if Self::can_cast(syntax.kind()) {1143 Some(Self { syntax })1638 Some(Self { syntax })1144 } else {1639 } else {1145 None1640 None1146 }1641 }1147 }1642 }1148 fn syntax(&self) -> &SyntaxNode { &self.syntax }1643 fn syntax(&self) -> &SyntaxNode {1644 &self.syntax1645 }1149}1646}1150impl AstNode for ObjLocalPostComma {1647impl AstNode for ObjLocalPostComma {1151 fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_LOCAL_POST_COMMA }1648 fn can_cast(kind: SyntaxKind) -> bool {1649 kind == OBJ_LOCAL_POST_COMMA1650 }1152 fn cast(syntax: SyntaxNode) -> Option<Self> {1651 fn cast(syntax: SyntaxNode) -> Option<Self> {1153 if Self::can_cast(syntax.kind()) {1652 if Self::can_cast(syntax.kind()) {1154 Some(Self { syntax })1653 Some(Self { syntax })1155 } else {1654 } else {1156 None1655 None1157 }1656 }1158 }1657 }1159 fn syntax(&self) -> &SyntaxNode { &self.syntax }1658 fn syntax(&self) -> &SyntaxNode {1659 &self.syntax1660 }1160}1661}1161impl AstNode for ObjLocalPreComma {1662impl AstNode for ObjLocalPreComma {1162 fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_LOCAL_PRE_COMMA }1663 fn can_cast(kind: SyntaxKind) -> bool {1664 kind == OBJ_LOCAL_PRE_COMMA1665 }1163 fn cast(syntax: SyntaxNode) -> Option<Self> {1666 fn cast(syntax: SyntaxNode) -> Option<Self> {1164 if Self::can_cast(syntax.kind()) {1667 if Self::can_cast(syntax.kind()) {1165 Some(Self { syntax })1668 Some(Self { syntax })1166 } else {1669 } else {1167 None1670 None1168 }1671 }1169 }1672 }1170 fn syntax(&self) -> &SyntaxNode { &self.syntax }1673 fn syntax(&self) -> &SyntaxNode {1674 &self.syntax1675 }1171}1676}1172impl AstNode for ObjBodyMemberList {1677impl AstNode for ObjBodyMemberList {1173 fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_BODY_MEMBER_LIST }1678 fn can_cast(kind: SyntaxKind) -> bool {1679 kind == OBJ_BODY_MEMBER_LIST1680 }1174 fn cast(syntax: SyntaxNode) -> Option<Self> {1681 fn cast(syntax: SyntaxNode) -> Option<Self> {1175 if Self::can_cast(syntax.kind()) {1682 if Self::can_cast(syntax.kind()) {1176 Some(Self { syntax })1683 Some(Self { syntax })1177 } else {1684 } else {1178 None1685 None1179 }1686 }1180 }1687 }1181 fn syntax(&self) -> &SyntaxNode { &self.syntax }1688 fn syntax(&self) -> &SyntaxNode {1689 &self.syntax1690 }1182}1691}1183impl AstNode for ObjLocal {1692impl AstNode for ObjLocal {1184 fn can_cast(kind: SyntaxKind) -> bool { kind == OBJ_LOCAL }1693 fn can_cast(kind: SyntaxKind) -> bool {1694 kind == OBJ_LOCAL1695 }1185 fn cast(syntax: SyntaxNode) -> Option<Self> {1696 fn cast(syntax: SyntaxNode) -> Option<Self> {1186 if Self::can_cast(syntax.kind()) {1697 if Self::can_cast(syntax.kind()) {1187 Some(Self { syntax })1698 Some(Self { syntax })1188 } else {1699 } else {1189 None1700 None1190 }1701 }1191 }1702 }1192 fn syntax(&self) -> &SyntaxNode { &self.syntax }1703 fn syntax(&self) -> &SyntaxNode {1704 &self.syntax1705 }1193}1706}1194impl AstNode for MemberBindStmt {1707impl AstNode for MemberBindStmt {1195 fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_BIND_STMT }1708 fn can_cast(kind: SyntaxKind) -> bool {1709 kind == MEMBER_BIND_STMT1710 }1196 fn cast(syntax: SyntaxNode) -> Option<Self> {1711 fn cast(syntax: SyntaxNode) -> Option<Self> {1197 if Self::can_cast(syntax.kind()) {1712 if Self::can_cast(syntax.kind()) {1198 Some(Self { syntax })1713 Some(Self { syntax })1199 } else {1714 } else {1200 None1715 None1201 }1716 }1202 }1717 }1203 fn syntax(&self) -> &SyntaxNode { &self.syntax }1718 fn syntax(&self) -> &SyntaxNode {1719 &self.syntax1720 }1204}1721}1205impl AstNode for MemberAssertStmt {1722impl AstNode for MemberAssertStmt {1206 fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_ASSERT_STMT }1723 fn can_cast(kind: SyntaxKind) -> bool {1724 kind == MEMBER_ASSERT_STMT1725 }1207 fn cast(syntax: SyntaxNode) -> Option<Self> {1726 fn cast(syntax: SyntaxNode) -> Option<Self> {1208 if Self::can_cast(syntax.kind()) {1727 if Self::can_cast(syntax.kind()) {1209 Some(Self { syntax })1728 Some(Self { syntax })1210 } else {1729 } else {1211 None1730 None1212 }1731 }1213 }1732 }1214 fn syntax(&self) -> &SyntaxNode { &self.syntax }1733 fn syntax(&self) -> &SyntaxNode {1734 &self.syntax1735 }1215}1736}1216impl AstNode for MemberField {1737impl AstNode for MemberField {1217 fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_FIELD }1738 fn can_cast(kind: SyntaxKind) -> bool {1739 kind == MEMBER_FIELD1740 }1218 fn cast(syntax: SyntaxNode) -> Option<Self> {1741 fn cast(syntax: SyntaxNode) -> Option<Self> {1219 if Self::can_cast(syntax.kind()) {1742 if Self::can_cast(syntax.kind()) {1220 Some(Self { syntax })1743 Some(Self { syntax })1221 } else {1744 } else {1222 None1745 None1223 }1746 }1224 }1747 }1225 fn syntax(&self) -> &SyntaxNode { &self.syntax }1748 fn syntax(&self) -> &SyntaxNode {1749 &self.syntax1750 }1226}1751}1227impl AstNode for FieldNormal {1752impl AstNode for FieldNormal {1228 fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_NORMAL }1753 fn can_cast(kind: SyntaxKind) -> bool {1754 kind == FIELD_NORMAL1755 }1229 fn cast(syntax: SyntaxNode) -> Option<Self> {1756 fn cast(syntax: SyntaxNode) -> Option<Self> {1230 if Self::can_cast(syntax.kind()) {1757 if Self::can_cast(syntax.kind()) {1231 Some(Self { syntax })1758 Some(Self { syntax })1232 } else {1759 } else {1233 None1760 None1234 }1761 }1235 }1762 }1236 fn syntax(&self) -> &SyntaxNode { &self.syntax }1763 fn syntax(&self) -> &SyntaxNode {1764 &self.syntax1765 }1237}1766}1238impl AstNode for Visibility {1767impl AstNode for FieldMethod {1239 fn can_cast(kind: SyntaxKind) -> bool { kind == VISIBILITY }1768 fn can_cast(kind: SyntaxKind) -> bool {1769 kind == FIELD_METHOD1770 }1240 fn cast(syntax: SyntaxNode) -> Option<Self> {1771 fn cast(syntax: SyntaxNode) -> Option<Self> {1241 if Self::can_cast(syntax.kind()) {1772 if Self::can_cast(syntax.kind()) {1242 Some(Self { syntax })1773 Some(Self { syntax })1243 } else {1774 } else {1244 None1775 None1245 }1776 }1246 }1777 }1247 fn syntax(&self) -> &SyntaxNode { &self.syntax }1778 fn syntax(&self) -> &SyntaxNode {1779 &self.syntax1780 }1248}1781}1249impl AstNode for FieldMethod {1782impl AstNode for FieldNameFixed {1250 fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_METHOD }1783 fn can_cast(kind: SyntaxKind) -> bool {1784 kind == FIELD_NAME_FIXED1785 }1251 fn cast(syntax: SyntaxNode) -> Option<Self> {1786 fn cast(syntax: SyntaxNode) -> Option<Self> {1252 if Self::can_cast(syntax.kind()) {1787 if Self::can_cast(syntax.kind()) {1253 Some(Self { syntax })1788 Some(Self { syntax })1254 } else {1789 } else {1255 None1790 None1256 }1791 }1257 }1792 }1258 fn syntax(&self) -> &SyntaxNode { &self.syntax }1793 fn syntax(&self) -> &SyntaxNode {1794 &self.syntax1795 }1259}1796}1260impl AstNode for FieldNameFixed {1797impl AstNode for FieldNameDynamic {1261 fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_NAME_FIXED }1798 fn can_cast(kind: SyntaxKind) -> bool {1799 kind == FIELD_NAME_DYNAMIC1800 }1262 fn cast(syntax: SyntaxNode) -> Option<Self> {1801 fn cast(syntax: SyntaxNode) -> Option<Self> {1263 if Self::can_cast(syntax.kind()) {1802 if Self::can_cast(syntax.kind()) {1264 Some(Self { syntax })1803 Some(Self { syntax })1265 } else {1804 } else {1266 None1805 None1267 }1806 }1268 }1807 }1269 fn syntax(&self) -> &SyntaxNode { &self.syntax }1808 fn syntax(&self) -> &SyntaxNode {1809 &self.syntax1810 }1270}1811}1271impl AstNode for FieldNameDynamic {1812impl AstNode for ForSpec {1272 fn can_cast(kind: SyntaxKind) -> bool { kind == FIELD_NAME_DYNAMIC }1813 fn can_cast(kind: SyntaxKind) -> bool {1814 kind == FOR_SPEC1815 }1273 fn cast(syntax: SyntaxNode) -> Option<Self> {1816 fn cast(syntax: SyntaxNode) -> Option<Self> {1274 if Self::can_cast(syntax.kind()) {1817 if Self::can_cast(syntax.kind()) {1275 Some(Self { syntax })1818 Some(Self { syntax })1276 } else {1819 } else {1277 None1820 None1278 }1821 }1279 }1822 }1280 fn syntax(&self) -> &SyntaxNode { &self.syntax }1823 fn syntax(&self) -> &SyntaxNode {1824 &self.syntax1825 }1281}1826}1282impl AstNode for IfSpec {1827impl AstNode for IfSpec {1283 fn can_cast(kind: SyntaxKind) -> bool { kind == IF_SPEC }1828 fn can_cast(kind: SyntaxKind) -> bool {1829 kind == IF_SPEC1830 }1284 fn cast(syntax: SyntaxNode) -> Option<Self> {1831 fn cast(syntax: SyntaxNode) -> Option<Self> {1285 if Self::can_cast(syntax.kind()) {1832 if Self::can_cast(syntax.kind()) {1286 Some(Self { syntax })1833 Some(Self { syntax })1287 } else {1834 } else {1288 None1835 None1289 }1836 }1290 }1837 }1291 fn syntax(&self) -> &SyntaxNode { &self.syntax }1838 fn syntax(&self) -> &SyntaxNode {1839 &self.syntax1840 }1292}1841}1293impl AstNode for BindDestruct {1842impl AstNode for BindDestruct {1294 fn can_cast(kind: SyntaxKind) -> bool { kind == BIND_DESTRUCT }1843 fn can_cast(kind: SyntaxKind) -> bool {1844 kind == BIND_DESTRUCT1845 }1295 fn cast(syntax: SyntaxNode) -> Option<Self> {1846 fn cast(syntax: SyntaxNode) -> Option<Self> {1296 if Self::can_cast(syntax.kind()) {1847 if Self::can_cast(syntax.kind()) {1297 Some(Self { syntax })1848 Some(Self { syntax })1298 } else {1849 } else {1299 None1850 None1300 }1851 }1301 }1852 }1302 fn syntax(&self) -> &SyntaxNode { &self.syntax }1853 fn syntax(&self) -> &SyntaxNode {1854 &self.syntax1855 }1303}1856}1304impl AstNode for Destruct {1857impl AstNode for BindFunction {1305 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT }1858 fn can_cast(kind: SyntaxKind) -> bool {1859 kind == BIND_FUNCTION1860 }1306 fn cast(syntax: SyntaxNode) -> Option<Self> {1861 fn cast(syntax: SyntaxNode) -> Option<Self> {1307 if Self::can_cast(syntax.kind()) {1862 if Self::can_cast(syntax.kind()) {1308 Some(Self { syntax })1863 Some(Self { syntax })1309 } else {1864 } else {1310 None1865 None1311 }1866 }1312 }1867 }1313 fn syntax(&self) -> &SyntaxNode { &self.syntax }1868 fn syntax(&self) -> &SyntaxNode {1869 &self.syntax1870 }1314}1871}1315impl AstNode for BindFunction {1872impl AstNode for Param {1316 fn can_cast(kind: SyntaxKind) -> bool { kind == BIND_FUNCTION }1873 fn can_cast(kind: SyntaxKind) -> bool {1874 kind == PARAM1875 }1317 fn cast(syntax: SyntaxNode) -> Option<Self> {1876 fn cast(syntax: SyntaxNode) -> Option<Self> {1318 if Self::can_cast(syntax.kind()) {1877 if Self::can_cast(syntax.kind()) {1319 Some(Self { syntax })1878 Some(Self { syntax })1320 } else {1879 } else {1321 None1880 None1322 }1881 }1323 }1882 }1324 fn syntax(&self) -> &SyntaxNode { &self.syntax }1883 fn syntax(&self) -> &SyntaxNode {1884 &self.syntax1885 }1325}1886}1326impl AstNode for Param {1887impl AstNode for DestructFull {1327 fn can_cast(kind: SyntaxKind) -> bool { kind == PARAM }1888 fn can_cast(kind: SyntaxKind) -> bool {1889 kind == DESTRUCT_FULL1890 }1328 fn cast(syntax: SyntaxNode) -> Option<Self> {1891 fn cast(syntax: SyntaxNode) -> Option<Self> {1329 if Self::can_cast(syntax.kind()) {1892 if Self::can_cast(syntax.kind()) {1330 Some(Self { syntax })1893 Some(Self { syntax })1331 } else {1894 } else {1332 None1895 None1333 }1896 }1334 }1897 }1335 fn syntax(&self) -> &SyntaxNode { &self.syntax }1898 fn syntax(&self) -> &SyntaxNode {1899 &self.syntax1900 }1336}1901}1337impl AstNode for DestructFull {1902impl AstNode for DestructSkip {1338 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_FULL }1903 fn can_cast(kind: SyntaxKind) -> bool {1904 kind == DESTRUCT_SKIP1905 }1339 fn cast(syntax: SyntaxNode) -> Option<Self> {1906 fn cast(syntax: SyntaxNode) -> Option<Self> {1340 if Self::can_cast(syntax.kind()) {1907 if Self::can_cast(syntax.kind()) {1341 Some(Self { syntax })1908 Some(Self { syntax })1342 } else {1909 } else {1343 None1910 None1344 }1911 }1345 }1912 }1346 fn syntax(&self) -> &SyntaxNode { &self.syntax }1913 fn syntax(&self) -> &SyntaxNode {1914 &self.syntax1915 }1347}1916}1348impl AstNode for DestructSkip {1917impl AstNode for DestructArray {1349 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_SKIP }1918 fn can_cast(kind: SyntaxKind) -> bool {1919 kind == DESTRUCT_ARRAY1920 }1350 fn cast(syntax: SyntaxNode) -> Option<Self> {1921 fn cast(syntax: SyntaxNode) -> Option<Self> {1351 if Self::can_cast(syntax.kind()) {1922 if Self::can_cast(syntax.kind()) {1352 Some(Self { syntax })1923 Some(Self { syntax })1353 } else {1924 } else {1354 None1925 None1355 }1926 }1356 }1927 }1357 fn syntax(&self) -> &SyntaxNode { &self.syntax }1928 fn syntax(&self) -> &SyntaxNode {1929 &self.syntax1930 }1358}1931}1359impl AstNode for DestructArray {1932impl AstNode for DestructObject {1360 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_ARRAY }1933 fn can_cast(kind: SyntaxKind) -> bool {1934 kind == DESTRUCT_OBJECT1935 }1361 fn cast(syntax: SyntaxNode) -> Option<Self> {1936 fn cast(syntax: SyntaxNode) -> Option<Self> {1362 if Self::can_cast(syntax.kind()) {1937 if Self::can_cast(syntax.kind()) {1363 Some(Self { syntax })1938 Some(Self { syntax })1364 } else {1939 } else {1365 None1940 None1366 }1941 }1367 }1942 }1368 fn syntax(&self) -> &SyntaxNode { &self.syntax }1943 fn syntax(&self) -> &SyntaxNode {1944 &self.syntax1945 }1369}1946}1370impl AstNode for DestructRest {1947impl AstNode for DestructObjectField {1371 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_REST }1948 fn can_cast(kind: SyntaxKind) -> bool {1949 kind == DESTRUCT_OBJECT_FIELD1950 }1372 fn cast(syntax: SyntaxNode) -> Option<Self> {1951 fn cast(syntax: SyntaxNode) -> Option<Self> {1373 if Self::can_cast(syntax.kind()) {1952 if Self::can_cast(syntax.kind()) {1374 Some(Self { syntax })1953 Some(Self { syntax })1375 } else {1954 } else {1376 None1955 None1377 }1956 }1378 }1957 }1379 fn syntax(&self) -> &SyntaxNode { &self.syntax }1958 fn syntax(&self) -> &SyntaxNode {1959 &self.syntax1960 }1380}1961}1381impl AstNode for DestructObject {1962impl AstNode for DestructRest {1382 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_OBJECT }1963 fn can_cast(kind: SyntaxKind) -> bool {1964 kind == DESTRUCT_REST1965 }1383 fn cast(syntax: SyntaxNode) -> Option<Self> {1966 fn cast(syntax: SyntaxNode) -> Option<Self> {1384 if Self::can_cast(syntax.kind()) {1967 if Self::can_cast(syntax.kind()) {1385 Some(Self { syntax })1968 Some(Self { syntax })1386 } else {1969 } else {1387 None1970 None1388 }1971 }1389 }1972 }1390 fn syntax(&self) -> &SyntaxNode { &self.syntax }1973 fn syntax(&self) -> &SyntaxNode {1974 &self.syntax1975 }1391}1976}1392impl AstNode for DestructObjectField {1977impl AstNode for DestructArrayElement {1393 fn can_cast(kind: SyntaxKind) -> bool { kind == DESTRUCT_OBJECT_FIELD }1978 fn can_cast(kind: SyntaxKind) -> bool {1979 kind == DESTRUCT_ARRAY_ELEMENT1980 }1394 fn cast(syntax: SyntaxNode) -> Option<Self> {1981 fn cast(syntax: SyntaxNode) -> Option<Self> {1395 if Self::can_cast(syntax.kind()) {1982 if Self::can_cast(syntax.kind()) {1396 Some(Self { syntax })1983 Some(Self { syntax })1397 } else {1984 } else {1398 None1985 None1399 }1986 }1400 }1987 }1401 fn syntax(&self) -> &SyntaxNode { &self.syntax }1988 fn syntax(&self) -> &SyntaxNode {1989 &self.syntax1990 }1402}1991}1403impl From<ExprBinary> for Expr {1992impl From<ExprBinary> for Expr {1404 fn from(node: ExprBinary) -> Expr { Expr::ExprBinary(node) }1993 fn from(node: ExprBinary) -> Expr {1994 Expr::ExprBinary(node)1995 }1405}1996}1406impl From<ExprUnary> for Expr {1997impl From<ExprUnary> for Expr {1407 fn from(node: ExprUnary) -> Expr { Expr::ExprUnary(node) }1998 fn from(node: ExprUnary) -> Expr {1999 Expr::ExprUnary(node)2000 }1408}2001}1409impl From<ExprSlice> for Expr {2002impl From<ExprSlice> for Expr {1410 fn from(node: ExprSlice) -> Expr { Expr::ExprSlice(node) }2003 fn from(node: ExprSlice) -> Expr {2004 Expr::ExprSlice(node)2005 }1411}2006}1412impl From<ExprIndex> for Expr {2007impl From<ExprIndex> for Expr {1413 fn from(node: ExprIndex) -> Expr { Expr::ExprIndex(node) }2008 fn from(node: ExprIndex) -> Expr {2009 Expr::ExprIndex(node)2010 }1414}2011}1415impl From<ExprIndexExpr> for Expr {2012impl From<ExprIndexExpr> for Expr {1416 fn from(node: ExprIndexExpr) -> Expr { Expr::ExprIndexExpr(node) }2013 fn from(node: ExprIndexExpr) -> Expr {2014 Expr::ExprIndexExpr(node)2015 }1417}2016}1418impl From<ExprApply> for Expr {2017impl From<ExprApply> for Expr {1419 fn from(node: ExprApply) -> Expr { Expr::ExprApply(node) }2018 fn from(node: ExprApply) -> Expr {2019 Expr::ExprApply(node)2020 }1420}2021}1421impl From<ExprObjExtend> for Expr {2022impl From<ExprObjExtend> for Expr {1422 fn from(node: ExprObjExtend) -> Expr { Expr::ExprObjExtend(node) }2023 fn from(node: ExprObjExtend) -> Expr {2024 Expr::ExprObjExtend(node)2025 }1423}2026}1424impl From<ExprParened> for Expr {2027impl From<ExprParened> for Expr {1425 fn from(node: ExprParened) -> Expr { Expr::ExprParened(node) }2028 fn from(node: ExprParened) -> Expr {2029 Expr::ExprParened(node)2030 }1426}2031}1427impl From<ExprIntrinsicThisFile> for Expr {2032impl From<ExprIntrinsicThisFile> for Expr {1428 fn from(node: ExprIntrinsicThisFile) -> Expr { Expr::ExprIntrinsicThisFile(node) }2033 fn from(node: ExprIntrinsicThisFile) -> Expr {2034 Expr::ExprIntrinsicThisFile(node)2035 }1429}2036}1430impl From<ExprIntrinsicId> for Expr {2037impl From<ExprIntrinsicId> for Expr {1431 fn from(node: ExprIntrinsicId) -> Expr { Expr::ExprIntrinsicId(node) }2038 fn from(node: ExprIntrinsicId) -> Expr {2039 Expr::ExprIntrinsicId(node)2040 }1432}2041}1433impl From<ExprIntrinsic> for Expr {2042impl From<ExprIntrinsic> for Expr {1434 fn from(node: ExprIntrinsic) -> Expr { Expr::ExprIntrinsic(node) }2043 fn from(node: ExprIntrinsic) -> Expr {2044 Expr::ExprIntrinsic(node)2045 }1435}2046}1436impl From<ExprString> for Expr {2047impl From<ExprString> for Expr {1437 fn from(node: ExprString) -> Expr { Expr::ExprString(node) }2048 fn from(node: ExprString) -> Expr {2049 Expr::ExprString(node)2050 }1438}2051}1439impl From<ExprNumber> for Expr {2052impl From<ExprNumber> for Expr {1440 fn from(node: ExprNumber) -> Expr { Expr::ExprNumber(node) }2053 fn from(node: ExprNumber) -> Expr {2054 Expr::ExprNumber(node)2055 }1441}2056}2057impl From<ExprLiteral> for Expr {2058 fn from(node: ExprLiteral) -> Expr {2059 Expr::ExprLiteral(node)2060 }2061}1442impl From<ExprArray> for Expr {2062impl From<ExprArray> for Expr {1443 fn from(node: ExprArray) -> Expr { Expr::ExprArray(node) }2063 fn from(node: ExprArray) -> Expr {2064 Expr::ExprArray(node)2065 }1444}2066}1445impl From<ExprObject> for Expr {2067impl From<ExprObject> for Expr {1446 fn from(node: ExprObject) -> Expr { Expr::ExprObject(node) }2068 fn from(node: ExprObject) -> Expr {2069 Expr::ExprObject(node)2070 }1447}2071}1448impl From<ExprArrayComp> for Expr {2072impl From<ExprArrayComp> for Expr {1449 fn from(node: ExprArrayComp) -> Expr { Expr::ExprArrayComp(node) }2073 fn from(node: ExprArrayComp) -> Expr {2074 Expr::ExprArrayComp(node)2075 }1450}2076}1451impl From<ExprImport> for Expr {2077impl From<ExprImport> for Expr {1452 fn from(node: ExprImport) -> Expr { Expr::ExprImport(node) }2078 fn from(node: ExprImport) -> Expr {2079 Expr::ExprImport(node)2080 }1453}2081}1454impl From<ExprVar> for Expr {2082impl From<ExprVar> for Expr {1455 fn from(node: ExprVar) -> Expr { Expr::ExprVar(node) }2083 fn from(node: ExprVar) -> Expr {2084 Expr::ExprVar(node)2085 }1456}2086}1457impl From<ExprLocal> for Expr {2087impl From<ExprLocal> for Expr {1458 fn from(node: ExprLocal) -> Expr { Expr::ExprLocal(node) }2088 fn from(node: ExprLocal) -> Expr {2089 Expr::ExprLocal(node)2090 }1459}2091}1460impl From<ExprIfThenElse> for Expr {2092impl From<ExprIfThenElse> for Expr {1461 fn from(node: ExprIfThenElse) -> Expr { Expr::ExprIfThenElse(node) }2093 fn from(node: ExprIfThenElse) -> Expr {2094 Expr::ExprIfThenElse(node)2095 }1462}2096}1463impl From<ExprFunction> for Expr {2097impl From<ExprFunction> for Expr {1464 fn from(node: ExprFunction) -> Expr { Expr::ExprFunction(node) }2098 fn from(node: ExprFunction) -> Expr {2099 Expr::ExprFunction(node)2100 }1465}2101}1466impl From<ExprAssert> for Expr {2102impl From<ExprAssert> for Expr {1467 fn from(node: ExprAssert) -> Expr { Expr::ExprAssert(node) }2103 fn from(node: ExprAssert) -> Expr {2104 Expr::ExprAssert(node)2105 }1468}2106}1469impl From<ExprError> for Expr {2107impl From<ExprError> for Expr {1470 fn from(node: ExprError) -> Expr { Expr::ExprError(node) }2108 fn from(node: ExprError) -> Expr {2109 Expr::ExprError(node)2110 }1471}2111}1472impl AstNode for Expr {2112impl AstNode for Expr {1473 fn can_cast(kind: SyntaxKind) -> bool {2113 fn can_cast(kind: SyntaxKind) -> bool {1485 | EXPR_INTRINSIC2125 | EXPR_INTRINSIC1486 | EXPR_STRING2126 | EXPR_STRING1487 | EXPR_NUMBER2127 | EXPR_NUMBER2128 | EXPR_LITERAL1488 | EXPR_ARRAY2129 | EXPR_ARRAY1489 | EXPR_OBJECT2130 | EXPR_OBJECT1490 | EXPR_ARRAY_COMP2131 | EXPR_ARRAY_COMP1515 EXPR_INTRINSIC => Expr::ExprIntrinsic(ExprIntrinsic { syntax }),2156 EXPR_INTRINSIC => Expr::ExprIntrinsic(ExprIntrinsic { syntax }),1516 EXPR_STRING => Expr::ExprString(ExprString { syntax }),2157 EXPR_STRING => Expr::ExprString(ExprString { syntax }),1517 EXPR_NUMBER => Expr::ExprNumber(ExprNumber { syntax }),2158 EXPR_NUMBER => Expr::ExprNumber(ExprNumber { syntax }),2159 EXPR_LITERAL => Expr::ExprLiteral(ExprLiteral { syntax }),1518 EXPR_ARRAY => Expr::ExprArray(ExprArray { syntax }),2160 EXPR_ARRAY => Expr::ExprArray(ExprArray { syntax }),1519 EXPR_OBJECT => Expr::ExprObject(ExprObject { syntax }),2161 EXPR_OBJECT => Expr::ExprObject(ExprObject { syntax }),1520 EXPR_ARRAY_COMP => Expr::ExprArrayComp(ExprArrayComp { syntax }),2162 EXPR_ARRAY_COMP => Expr::ExprArrayComp(ExprArrayComp { syntax }),1544 Expr::ExprIntrinsic(it) => &it.syntax,2186 Expr::ExprIntrinsic(it) => &it.syntax,1545 Expr::ExprString(it) => &it.syntax,2187 Expr::ExprString(it) => &it.syntax,1546 Expr::ExprNumber(it) => &it.syntax,2188 Expr::ExprNumber(it) => &it.syntax,2189 Expr::ExprLiteral(it) => &it.syntax,1547 Expr::ExprArray(it) => &it.syntax,2190 Expr::ExprArray(it) => &it.syntax,1548 Expr::ExprObject(it) => &it.syntax,2191 Expr::ExprObject(it) => &it.syntax,1549 Expr::ExprArrayComp(it) => &it.syntax,2192 Expr::ExprArrayComp(it) => &it.syntax,1558 }2201 }1559}2202}1560impl From<ObjBodyComp> for ObjBody {2203impl From<ObjBodyComp> for ObjBody {1561 fn from(node: ObjBodyComp) -> ObjBody { ObjBody::ObjBodyComp(node) }2204 fn from(node: ObjBodyComp) -> ObjBody {2205 ObjBody::ObjBodyComp(node)2206 }1562}2207}1563impl From<ObjBodyMemberList> for ObjBody {2208impl From<ObjBodyMemberList> for ObjBody {1564 fn from(node: ObjBodyMemberList) -> ObjBody { ObjBody::ObjBodyMemberList(node) }2209 fn from(node: ObjBodyMemberList) -> ObjBody {2210 ObjBody::ObjBodyMemberList(node)2211 }1565}2212}1566impl AstNode for ObjBody {2213impl AstNode for ObjBody {1567 fn can_cast(kind: SyntaxKind) -> bool {2214 fn can_cast(kind: SyntaxKind) -> bool {1586 }2233 }1587}2234}1588impl From<ForSpec> for CompSpec {2235impl From<ForSpec> for CompSpec {1589 fn from(node: ForSpec) -> CompSpec { CompSpec::ForSpec(node) }2236 fn from(node: ForSpec) -> CompSpec {2237 CompSpec::ForSpec(node)2238 }1590}2239}1591impl From<IfSpec> for CompSpec {2240impl From<IfSpec> for CompSpec {1592 fn from(node: IfSpec) -> CompSpec { CompSpec::IfSpec(node) }2241 fn from(node: IfSpec) -> CompSpec {2242 CompSpec::IfSpec(node)2243 }1593}2244}1594impl AstNode for CompSpec {2245impl AstNode for CompSpec {1595 fn can_cast(kind: SyntaxKind) -> bool {2246 fn can_cast(kind: SyntaxKind) -> bool {1614 }2265 }1615}2266}1616impl From<BindDestruct> for Bind {2267impl From<BindDestruct> for Bind {1617 fn from(node: BindDestruct) -> Bind { Bind::BindDestruct(node) }2268 fn from(node: BindDestruct) -> Bind {2269 Bind::BindDestruct(node)2270 }1618}2271}1619impl From<BindFunction> for Bind {2272impl From<BindFunction> for Bind {1620 fn from(node: BindFunction) -> Bind { Bind::BindFunction(node) }2273 fn from(node: BindFunction) -> Bind {2274 Bind::BindFunction(node)2275 }1621}2276}1622impl AstNode for Bind {2277impl AstNode for Bind {1623 fn can_cast(kind: SyntaxKind) -> bool {2278 fn can_cast(kind: SyntaxKind) -> bool {1642 }2297 }1643}2298}1644impl From<MemberBindStmt> for Member {2299impl From<MemberBindStmt> for Member {1645 fn from(node: MemberBindStmt) -> Member { Member::MemberBindStmt(node) }2300 fn from(node: MemberBindStmt) -> Member {2301 Member::MemberBindStmt(node)2302 }1646}2303}1647impl From<MemberAssertStmt> for Member {2304impl From<MemberAssertStmt> for Member {1648 fn from(node: MemberAssertStmt) -> Member { Member::MemberAssertStmt(node) }2305 fn from(node: MemberAssertStmt) -> Member {2306 Member::MemberAssertStmt(node)2307 }1649}2308}1650impl From<MemberField> for Member {2309impl From<MemberField> for Member {1651 fn from(node: MemberField) -> Member { Member::MemberField(node) }2310 fn from(node: MemberField) -> Member {2311 Member::MemberField(node)2312 }1652}2313}1653impl AstNode for Member {2314impl AstNode for Member {1654 fn can_cast(kind: SyntaxKind) -> bool {2315 fn can_cast(kind: SyntaxKind) -> bool {1675 }2336 }1676}2337}1677impl From<FieldNormal> for Field {2338impl From<FieldNormal> for Field {1678 fn from(node: FieldNormal) -> Field { Field::FieldNormal(node) }2339 fn from(node: FieldNormal) -> Field {2340 Field::FieldNormal(node)2341 }1679}2342}1680impl From<FieldMethod> for Field {2343impl From<FieldMethod> for Field {1681 fn from(node: FieldMethod) -> Field { Field::FieldMethod(node) }2344 fn from(node: FieldMethod) -> Field {2345 Field::FieldMethod(node)2346 }1682}2347}1683impl AstNode for Field {2348impl AstNode for Field {1684 fn can_cast(kind: SyntaxKind) -> bool {2349 fn can_cast(kind: SyntaxKind) -> bool {1703 }2368 }1704}2369}1705impl From<FieldNameFixed> for FieldName {2370impl From<FieldNameFixed> for FieldName {1706 fn from(node: FieldNameFixed) -> FieldName { FieldName::FieldNameFixed(node) }2371 fn from(node: FieldNameFixed) -> FieldName {2372 FieldName::FieldNameFixed(node)2373 }1707}2374}1708impl From<FieldNameDynamic> for FieldName {2375impl From<FieldNameDynamic> for FieldName {1709 fn from(node: FieldNameDynamic) -> FieldName { FieldName::FieldNameDynamic(node) }2376 fn from(node: FieldNameDynamic) -> FieldName {2377 FieldName::FieldNameDynamic(node)2378 }1710}2379}1711impl AstNode for FieldName {2380impl AstNode for FieldName {1712 fn can_cast(kind: SyntaxKind) -> bool {2381 fn can_cast(kind: SyntaxKind) -> bool {1730 }2399 }1731 }2400 }1732}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}1733impl std::fmt::Display for Expr {2844impl std::fmt::Display for Expr {1734 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2845 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1735 std::fmt::Display::fmt(self.syntax(), f)2846 std::fmt::Display::fmt(self.syntax(), f)1765 std::fmt::Display::fmt(self.syntax(), f)2876 std::fmt::Display::fmt(self.syntax(), f)1766 }2877 }1767}2878}1768impl std::fmt::Display for SourceFile {2879impl std::fmt::Display for Destruct {1769 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2880 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1770 std::fmt::Display::fmt(self.syntax(), f)2881 std::fmt::Display::fmt(self.syntax(), f)1771 }2882 }1772}2883}1773impl std::fmt::Display for ExprBinary {2884impl std::fmt::Display for DestructArrayPart {1774 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2885 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1775 std::fmt::Display::fmt(self.syntax(), f)2886 std::fmt::Display::fmt(self.syntax(), f)1776 }2887 }1777}2888}1778impl std::fmt::Display for BinaryOperator {2889impl std::fmt::Display for SourceFile {1779 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2890 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1780 std::fmt::Display::fmt(self.syntax(), f)2891 std::fmt::Display::fmt(self.syntax(), f)1781 }2892 }1782}2893}1783impl std::fmt::Display for ExprUnary {2894impl std::fmt::Display for ExprBinary {1784 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2895 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1785 std::fmt::Display::fmt(self.syntax(), f)2896 std::fmt::Display::fmt(self.syntax(), f)1786 }2897 }1787}2898}1788impl std::fmt::Display for UnaryOperator {2899impl std::fmt::Display for LhsExpr {1789 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2900 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1790 std::fmt::Display::fmt(self.syntax(), f)2901 std::fmt::Display::fmt(self.syntax(), f)1791 }2902 }1792}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}1793impl std::fmt::Display for ExprSlice {2909impl std::fmt::Display for ExprSlice {1794 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2910 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1795 std::fmt::Display::fmt(self.syntax(), f)2911 std::fmt::Display::fmt(self.syntax(), f)1840 std::fmt::Display::fmt(self.syntax(), f)2956 std::fmt::Display::fmt(self.syntax(), f)1841 }2957 }1842}2958}1843impl std::fmt::Display for Literal {1844 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1845 std::fmt::Display::fmt(self.syntax(), f)1846 }1847}1848impl std::fmt::Display for ExprIntrinsicThisFile {2959impl std::fmt::Display for ExprIntrinsicThisFile {1849 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2960 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1850 std::fmt::Display::fmt(self.syntax(), f)2961 std::fmt::Display::fmt(self.syntax(), f)1865 std::fmt::Display::fmt(self.syntax(), f)2976 std::fmt::Display::fmt(self.syntax(), f)1866 }2977 }1867}2978}1868impl std::fmt::Display for String {1869 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1870 std::fmt::Display::fmt(self.syntax(), f)1871 }1872}1873impl std::fmt::Display for ExprNumber {2979impl std::fmt::Display for ExprNumber {1874 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2980 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1875 std::fmt::Display::fmt(self.syntax(), f)2981 std::fmt::Display::fmt(self.syntax(), f)1876 }2982 }1877}2983}1878impl std::fmt::Display for Number {2984impl std::fmt::Display for ExprArray {1879 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2985 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1880 std::fmt::Display::fmt(self.syntax(), f)2986 std::fmt::Display::fmt(self.syntax(), f)1881 }2987 }1882}2988}1883impl std::fmt::Display for ExprArray {2989impl std::fmt::Display for ExprObject {1884 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2990 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1885 std::fmt::Display::fmt(self.syntax(), f)2991 std::fmt::Display::fmt(self.syntax(), f)1886 }2992 }1887}2993}1888impl std::fmt::Display for ExprObject {2994impl std::fmt::Display for ExprArrayComp {1889 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2995 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1890 std::fmt::Display::fmt(self.syntax(), f)2996 std::fmt::Display::fmt(self.syntax(), f)1891 }2997 }1892}2998}1893impl std::fmt::Display for ExprArrayComp {2999impl std::fmt::Display for ExprImport {1894 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3000 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1895 std::fmt::Display::fmt(self.syntax(), f)3001 std::fmt::Display::fmt(self.syntax(), f)1896 }3002 }1897}3003}1898impl std::fmt::Display for ForSpec {3004impl std::fmt::Display for ExprVar {1899 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3005 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1900 std::fmt::Display::fmt(self.syntax(), f)3006 std::fmt::Display::fmt(self.syntax(), f)1901 }3007 }1902}3008}1903impl std::fmt::Display for ExprImport {3009impl std::fmt::Display for ExprLocal {1904 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3010 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1905 std::fmt::Display::fmt(self.syntax(), f)3011 std::fmt::Display::fmt(self.syntax(), f)1906 }3012 }1907}3013}1908impl std::fmt::Display for ExprVar {3014impl std::fmt::Display for ExprIfThenElse {1909 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3015 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1910 std::fmt::Display::fmt(self.syntax(), f)3016 std::fmt::Display::fmt(self.syntax(), f)1911 }3017 }1912}3018}1913impl std::fmt::Display for ExprLocal {3019impl std::fmt::Display for TrueExpr {1914 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3020 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1915 std::fmt::Display::fmt(self.syntax(), f)3021 std::fmt::Display::fmt(self.syntax(), f)1916 }3022 }1917}3023}1918impl std::fmt::Display for ExprIfThenElse {3024impl std::fmt::Display for FalseExpr {1919 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3025 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1920 std::fmt::Display::fmt(self.syntax(), f)3026 std::fmt::Display::fmt(self.syntax(), f)1921 }3027 }1945 std::fmt::Display::fmt(self.syntax(), f)3051 std::fmt::Display::fmt(self.syntax(), f)1946 }3052 }1947}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}1948impl std::fmt::Display for Arg {3064impl std::fmt::Display for Arg {1949 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3065 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {1950 std::fmt::Display::fmt(self.syntax(), f)3066 std::fmt::Display::fmt(self.syntax(), f)1995 std::fmt::Display::fmt(self.syntax(), f)3111 std::fmt::Display::fmt(self.syntax(), f)1996 }3112 }1997}3113}1998impl std::fmt::Display for Visibility {1999 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2000 std::fmt::Display::fmt(self.syntax(), f)2001 }2002}2003impl std::fmt::Display for FieldMethod {3114impl std::fmt::Display for FieldMethod {2004 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3115 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2005 std::fmt::Display::fmt(self.syntax(), f)3116 std::fmt::Display::fmt(self.syntax(), f)2015 std::fmt::Display::fmt(self.syntax(), f)3126 std::fmt::Display::fmt(self.syntax(), f)2016 }3127 }2017}3128}2018impl std::fmt::Display for IfSpec {3129impl std::fmt::Display for ForSpec {2019 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3130 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2020 std::fmt::Display::fmt(self.syntax(), f)3131 std::fmt::Display::fmt(self.syntax(), f)2021 }3132 }2022}3133}2023impl std::fmt::Display for BindDestruct {3134impl std::fmt::Display for IfSpec {2024 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3135 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2025 std::fmt::Display::fmt(self.syntax(), f)3136 std::fmt::Display::fmt(self.syntax(), f)2026 }3137 }2027}3138}2028impl std::fmt::Display for Destruct {3139impl std::fmt::Display for BindDestruct {2029 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3140 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2030 std::fmt::Display::fmt(self.syntax(), f)3141 std::fmt::Display::fmt(self.syntax(), f)2031 }3142 }2055 std::fmt::Display::fmt(self.syntax(), f)3166 std::fmt::Display::fmt(self.syntax(), f)2056 }3167 }2057}3168}2058impl std::fmt::Display for DestructRest {3169impl std::fmt::Display for DestructObject {2059 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3170 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2060 std::fmt::Display::fmt(self.syntax(), f)3171 std::fmt::Display::fmt(self.syntax(), f)2061 }3172 }2062}3173}2063impl std::fmt::Display for DestructObject {3174impl std::fmt::Display for DestructObjectField {2064 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3175 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2065 std::fmt::Display::fmt(self.syntax(), f)3176 std::fmt::Display::fmt(self.syntax(), f)2066 }3177 }2067}3178}2068impl std::fmt::Display for DestructObjectField {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 {2069 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {3185 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {2070 std::fmt::Display::fmt(self.syntax(), f)3186 std::fmt::Display::fmt(self.syntax(), f)2071 }3187 }crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rsdiffbeforeafterboth1//! This is a generated file, please do not edit manually. Changes can be1//! This is a generated file, please do not edit manually. Changes can be2//! made in codegeneration that lives in `xtask` top-level dir.2//! made in codegeneration that lives in `xtask` top-level dir.334#![allow(bad_style, missing_docs, unreachable_pub)]4#![allow(5 bad_style,6 missing_docs,7 unreachable_pub,8 clippy::manual_non_exhaustive,9 clippy::match_like_matches_macro10)]5use logos::Logos;11use logos::Logos;6#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]12#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]7#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Logos)]13#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Logos)]89 INTRINSIC_ID,95 INTRINSIC_ID,90 #[token("$intrinsic")]96 #[token("$intrinsic")]91 INTRINSIC,97 INTRINSIC,98 #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?")]99 FLOAT,100 #[regex("(?:0|[1-9][0-9]*)\\.[^0-9]")]101 ERROR_FLOAT_JUNK_AFTER_POINT,102 #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][^+\\-0-9]")]103 ERROR_FLOAT_JUNK_AFTER_EXPONENT,104 #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?[eE][+-][^0-9]")]105 ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN,106 #[regex("\"(?s:[^\"\\\\]|\\\\.)*\"")]107 STRING_DOUBLE,108 #[regex("\"(?s:[^\"\\\\]|\\\\.)*")]109 ERROR_STRING_DOUBLE_UNTERMINATED,110 #[regex("'(?s:[^'\\\\]|\\\\.)*'")]111 STRING_SINGLE,112 #[regex("'(?s:[^'\\\\]|\\\\.)*")]113 ERROR_STRING_SINGLE_UNTERMINATED,114 #[regex("@\"(?:[^\"]|\"\")*\"")]115 STRING_DOUBLE_VERBATIM,116 #[regex("@\"(?:[^\"]|\"\")*")]117 ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED,118 #[regex("@'(?:[^']|'')*'")]119 STRING_SINGLE_VERBATIM,120 #[regex("@'(?:[^']|'')*")]121 ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED,122 #[regex("@[^\"'\\s]\\S+")]123 ERROR_STRING_VERBATIM_MISSING_QUOTES,124 #[regex("\\|\\|\\|", crate::string_block::lex_str_block_test)]125 STRING_BLOCK,126 ERROR_STRING_BLOCK_UNEXPECTED_END,127 ERROR_STRING_BLOCK_MISSING_NEW_LINE,128 ERROR_STRING_BLOCK_MISSING_TERMINATION,129 ERROR_STRING_BLOCK_MISSING_INDENT,130 #[regex("[_a-zA-Z][_a-zA-Z0-9]*")]131 IDENT,132 #[regex("[ \\t\\n\\r]+")]133 WHITESPACE,134 #[regex("//[^\\r\\n]*(\\r\\n|\\n)?")]135 SINGLE_LINE_SLASH_COMMENT,136 #[regex("#[^\\r\\n]*(\\r\\n|\\n)?")]137 SINGLE_LINE_HASH_COMMENT,138 #[regex("/\\*([^*]|\\*[^/])*\\*/")]139 MULTI_LINE_COMMENT,140 #[regex("/\\*/")]141 ERROR_COMMENT_TOO_SHORT,142 #[regex("/\\*([^*]|\\*[^/])+")]143 ERROR_COMMENT_UNTERMINATED,92 #[token("tailstrict")]144 #[token("tailstrict")]93 TAILSTRICT_KW,145 TAILSTRICT_KW,94 #[token("importstr")]146 #[token("importstr")]111 ERROR_KW,163 ERROR_KW,112 #[token("in")]164 #[token("in")]113 IN_KW,165 IN_KW,166 ERROR_NO_OPERATOR,114 #[token("null")]167 #[token("null")]115 NULL_KW,168 NULL_KW,116 #[token("true")]169 #[token("true")]121 SELF_KW,174 SELF_KW,122 #[token("super")]175 #[token("super")]123 SUPER_KW,176 SUPER_KW,177 META_FORCE_ENUM,124 #[token("for")]178 #[token("for")]125 FOR_KW,179 FOR_KW,126 #[token("assert")]180 #[token("assert")]127 ASSERT_KW,181 ASSERT_KW,128 #[regex("(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?")]129 NUMBER,130 #[regex("\"(?s:[^\"\\\\]|\\\\.)*\"")]131 STRING_DOUBLE,132 #[regex("'(?s:[^'\\\\]|\\\\.)*'")]133 STRING_SINGLE,134 #[regex("@\"(?:[^\"]|\"\")*\"")]135 STRING_DOUBLE_VERBATIM,136 #[regex("@'(?:[^']|'')*'")]137 STRING_SINGLE_VERBATIM,138 #[regex("\\|\\|\\|")]139 STRING_BLOCK,140 #[regex("[_a-zA-Z][_a-zA-Z0-9]*")]141 IDENT,142 #[regex("[ \\t\\n\\r]+")]143 WHITESPACE,144 #[regex("//[^\\r\\n]*(\\r\\n|\\n)?")]145 SINGLE_LINE_SLASH_COMMENT,146 #[regex("#[^\\r\\n]*(\\r\\n|\\n)?")]147 SINGLE_LINE_HASH_COMMENT,148 #[regex("/\\*([^*]|\\*[^/])*\\*/")]149 MULTI_LINE_COMMENT,150 #[error]182 #[error]151 ERROR,183 ERROR,152 SOURCE_FILE,184 SOURCE_FILE,153 EXPR_BINARY,185 EXPR_BINARY,154 BINARY_OPERATOR,186 LHS_EXPR,155 EXPR_UNARY,187 EXPR_UNARY,156 UNARY_OPERATOR,157 EXPR_SLICE,188 EXPR_SLICE,158 SLICE_DESC,189 SLICE_DESC,159 EXPR_INDEX,190 EXPR_INDEX,164 EXPR_OBJ_EXTEND,195 EXPR_OBJ_EXTEND,165 EXPR_PARENED,196 EXPR_PARENED,166 EXPR_LITERAL,197 EXPR_LITERAL,167 LITERAL,168 EXPR_INTRINSIC_THIS_FILE,198 EXPR_INTRINSIC_THIS_FILE,169 EXPR_INTRINSIC_ID,199 EXPR_INTRINSIC_ID,170 EXPR_INTRINSIC,200 EXPR_INTRINSIC,171 EXPR_STRING,201 EXPR_STRING,172 STRING,173 EXPR_NUMBER,202 EXPR_NUMBER,174 EXPR_ARRAY,203 EXPR_ARRAY,175 EXPR_OBJECT,204 EXPR_OBJECT,176 EXPR_ARRAY_COMP,205 EXPR_ARRAY_COMP,177 FOR_SPEC,178 EXPR_IMPORT,206 EXPR_IMPORT,179 EXPR_VAR,207 EXPR_VAR,180 EXPR_LOCAL,208 EXPR_LOCAL,181 EXPR_IF_THEN_ELSE,209 EXPR_IF_THEN_ELSE,210 TRUE_EXPR,211 FALSE_EXPR,182 EXPR_FUNCTION,212 EXPR_FUNCTION,183 PARAMS_DESC,213 PARAMS_DESC,184 EXPR_ASSERT,214 EXPR_ASSERT,185 ASSERTION,215 ASSERTION,186 EXPR_ERROR,216 EXPR_ERROR,217 SLICE_DESC_END,218 SLICE_DESC_STEP,187 ARG,219 ARG,188 OBJ_BODY_COMP,220 OBJ_BODY_COMP,189 OBJ_LOCAL_POST_COMMA,221 OBJ_LOCAL_POST_COMMA,194 MEMBER_ASSERT_STMT,226 MEMBER_ASSERT_STMT,195 MEMBER_FIELD,227 MEMBER_FIELD,196 FIELD_NORMAL,228 FIELD_NORMAL,197 VISIBILITY,198 FIELD_METHOD,229 FIELD_METHOD,199 FIELD_NAME_FIXED,230 FIELD_NAME_FIXED,200 FIELD_NAME_DYNAMIC,231 FIELD_NAME_DYNAMIC,232 FOR_SPEC,201 IF_SPEC,233 IF_SPEC,202 BIND_DESTRUCT,234 BIND_DESTRUCT,203 DESTRUCT,204 BIND_FUNCTION,235 BIND_FUNCTION,205 PARAM,236 PARAM,206 DESTRUCT_FULL,237 DESTRUCT_FULL,207 DESTRUCT_SKIP,238 DESTRUCT_SKIP,208 DESTRUCT_ARRAY,239 DESTRUCT_ARRAY,209 DESTRUCT_REST,210 DESTRUCT_OBJECT,240 DESTRUCT_OBJECT,211 DESTRUCT_OBJECT_FIELD,241 DESTRUCT_OBJECT_FIELD,242 DESTRUCT_REST,243 DESTRUCT_ARRAY_ELEMENT,212 EXPR,244 EXPR,213 OBJ_BODY,245 OBJ_BODY,214 COMP_SPEC,246 COMP_SPEC,215 BIND,247 BIND,216 MEMBER,248 MEMBER,217 FIELD,249 FIELD,218 FIELD_NAME,250 FIELD_NAME,251 DESTRUCT,252 DESTRUCT_ARRAY_PART,253 BINARY_OPERATOR,254 UNARY_OPERATOR,255 LITERAL,256 STRING,257 NUMBER,258 IMPORT_KIND,259 VISIBILITY,219 #[doc(hidden)]260 #[doc(hidden)]220 __LAST,261 __LAST,221}262}222use self::SyntaxKind::*;263use self::SyntaxKind::*;223impl SyntaxKind {264impl SyntaxKind {224 pub fn is_keyword(self) -> bool {265 pub fn is_keyword(self) -> bool {225 match self {266 match self {226 TAILSTRICT_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | LOCAL_KW | IF_KW227 | THEN_KW | ELSE_KW | FUNCTION_KW | ERROR_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW228 | SELF_KW | SUPER_KW | FOR_KW | ASSERT_KW => true,229 _ => false,230 }231 }232 pub fn is_punct(self) -> bool {233 match self {234 OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | LHS | RHS267 OR | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | LHS | RHS235 | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK | L_PAREN268 | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK | L_PAREN236 | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON | SEMI | DOT269 | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON | SEMI | DOT237 | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | INTRINSIC_THIS_FILE270 | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | INTRINSIC_THIS_FILE238 | INTRINSIC_ID | INTRINSIC => true,271 | INTRINSIC_ID | INTRINSIC | TAILSTRICT_KW | IMPORTSTR_KW | IMPORTBIN_KW272 | IMPORT_KW | LOCAL_KW | IF_KW | THEN_KW | ELSE_KW | FUNCTION_KW | ERROR_KW | IN_KW273 | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | SUPER_KW | FOR_KW | ASSERT_KW => true,239 _ => false,274 _ => false,240 }275 }241 }276 }242 pub fn from_keyword(ident: &str) -> Option<SyntaxKind> {277 pub fn is_enum(self) -> bool {243 let kw = match ident {278 match self {244 "tailstrict" => TAILSTRICT_KW,279 EXPR | OBJ_BODY | COMP_SPEC | BIND | MEMBER | FIELD | FIELD_NAME | DESTRUCT245 "importstr" => IMPORTSTR_KW,246 "importbin" => IMPORTBIN_KW,247 "import" => IMPORT_KW,248 "local" => LOCAL_KW,249 "if" => IF_KW,250 "then" => THEN_KW,251 "else" => ELSE_KW,280 | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR | LITERAL | STRING252 "function" => FUNCTION_KW,253 "error" => ERROR_KW,254 "in" => IN_KW,255 "null" => NULL_KW,256 "true" => TRUE_KW,281 | NUMBER | IMPORT_KIND | VISIBILITY => true,257 "false" => FALSE_KW,258 "self" => SELF_KW,259 "super" => SUPER_KW,260 "for" => FOR_KW,261 "assert" => ASSERT_KW,262 _ => return None,263 };264 Some(kw)265 }266 pub fn from_char(c: char) -> Option<SyntaxKind> {267 let tok = match c {268 '|' => BIT_OR,269 '^' => BIT_XOR,270 '&' => BIT_AND,282 _ => false,271 '<' => LT,272 '>' => GT,273 '+' => PLUS,274 '-' => MINUS,275 '*' => MUL,276 '/' => DIV,277 '%' => MODULO,278 '!' => NOT,279 '~' => BIT_NOT,280 '[' => L_BRACK,281 ']' => R_BRACK,282 '(' => L_PAREN,283 ')' => R_PAREN,284 '{' => L_BRACE,285 '}' => R_BRACE,286 ':' => COLON,287 ';' => SEMI,288 '.' => DOT,289 ',' => COMMA,290 '$' => DOLLAR,291 '=' => ASSIGN,292 '?' => QUESTION_MARK,293 _ => return None,294 };283 }295 Some(tok)296 }284 }297 pub fn from_raw(r: u16) -> Self {285 pub fn from_raw(r: u16) -> Self {298 assert!(r < Self::__LAST as u16);286 assert!(r < Self::__LAST as u16);303 }291 }304}292}305#[macro_export]293#[macro_export]306macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; ["$intrinsicThisFile"] => { $ crate :: SyntaxKind :: INTRINSIC_THIS_FILE } ; ["$intrinsicId"] => { $ crate :: SyntaxKind :: INTRINSIC_ID } ; ["$intrinsic"] => { $ crate :: SyntaxKind :: INTRINSIC } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } ; [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT } ; [ident] => { $ crate :: SyntaxKind :: IDENT } ; [shebang] => { $ crate :: SyntaxKind :: SHEBANG } ; }294macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [&&] => { $ crate :: SyntaxKind :: AND } ; [|] => { $ crate :: SyntaxKind :: BIT_OR } ; [^] => { $ crate :: SyntaxKind :: BIT_XOR } ; [&] => { $ crate :: SyntaxKind :: BIT_AND } ; [==] => { $ crate :: SyntaxKind :: EQ } ; [!=] => { $ crate :: SyntaxKind :: NE } ; [<] => { $ crate :: SyntaxKind :: LT } ; [>] => { $ crate :: SyntaxKind :: GT } ; [<=] => { $ crate :: SyntaxKind :: LE } ; [>=] => { $ crate :: SyntaxKind :: GE } ; [<<] => { $ crate :: SyntaxKind :: LHS } ; [>>] => { $ crate :: SyntaxKind :: RHS } ; [+] => { $ crate :: SyntaxKind :: PLUS } ; [-] => { $ crate :: SyntaxKind :: MINUS } ; [*] => { $ crate :: SyntaxKind :: MUL } ; [/] => { $ crate :: SyntaxKind :: DIV } ; [%] => { $ crate :: SyntaxKind :: MODULO } ; [!] => { $ crate :: SyntaxKind :: NOT } ; [~] => { $ crate :: SyntaxKind :: BIT_NOT } ; ['['] => { $ crate :: SyntaxKind :: L_BRACK } ; [']'] => { $ crate :: SyntaxKind :: R_BRACK } ; ['('] => { $ crate :: SyntaxKind :: L_PAREN } ; [')'] => { $ crate :: SyntaxKind :: R_PAREN } ; ['{'] => { $ crate :: SyntaxKind :: L_BRACE } ; ['}'] => { $ crate :: SyntaxKind :: R_BRACE } ; [:] => { $ crate :: SyntaxKind :: COLON } ; [::] => { $ crate :: SyntaxKind :: COLONCOLON } ; [:::] => { $ crate :: SyntaxKind :: COLONCOLONCOLON } ; [;] => { $ crate :: SyntaxKind :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; ["$intrinsicThisFile"] => { $ crate :: SyntaxKind :: INTRINSIC_THIS_FILE } ; ["$intrinsicId"] => { $ crate :: SyntaxKind :: INTRINSIC_ID } ; ["$intrinsic"] => { $ crate :: SyntaxKind :: INTRINSIC } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [if] => { $ crate :: SyntaxKind :: IF_KW } ; [then] => { $ crate :: SyntaxKind :: THEN_KW } ; [else] => { $ crate :: SyntaxKind :: ELSE_KW } ; [function] => { $ crate :: SyntaxKind :: FUNCTION_KW } ; [error] => { $ crate :: SyntaxKind :: ERROR_KW } ; [in] => { $ crate :: SyntaxKind :: IN_KW } ; [null] => { $ crate :: SyntaxKind :: NULL_KW } ; [true] => { $ crate :: SyntaxKind :: TRUE_KW } ; [false] => { $ crate :: SyntaxKind :: FALSE_KW } ; [self] => { $ crate :: SyntaxKind :: SELF_KW } ; [super] => { $ crate :: SyntaxKind :: SUPER_KW } ; [for] => { $ crate :: SyntaxKind :: FOR_KW } ; [assert] => { $ crate :: SyntaxKind :: ASSERT_KW } }307pub use T;295pub use T;308296crates/jrsonnet-rowan-parser/src/generated/tokens.rsdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/lex.rsdiffbeforeafterboth667use crate::SyntaxKind;7use crate::SyntaxKind;89impl SyntaxKind {10 pub fn is_trivia(self) -> bool {11 matches!(12 self,13 Self::WHITESPACE14 | Self::MULTI_LINE_COMMENT15 | Self::SINGLE_LINE_HASH_COMMENT16 | Self::SINGLE_LINE_SLASH_COMMENT17 )18 }19 pub fn is_string(self) -> bool {20 matches!(21 self,22 Self::STRING_SINGLE23 | Self::STRING_DOUBLE24 | Self::STRING_SINGLE_VERBATIM25 | Self::STRING_DOUBLE_VERBATIM26 | Self::STRING_BLOCK27 )28 }29 pub fn is_number(self) -> bool {30 matches!(self, Self::NUMBER)31 }32 pub fn is_literal(self) -> bool {33 matches!(34 self,35 Self::NULL_KW36 | Self::TRUE_KW | Self::FALSE_KW37 | Self::SELF_KW | Self::DOLLAR38 | Self::SUPER_KW39 )40 }41}42843pub struct Lexer<'a> {9pub struct Lexer<'a> {44 inner: logos::Lexer<'a, SyntaxKind>,10 inner: logos::Lexer<'a, SyntaxKind>,74 }40 }75}41}764277#[derive(Clone, Copy)]43#[derive(Clone, Copy, Debug)]78pub struct Lexeme<'i> {44pub struct Lexeme<'i> {79 pub kind: SyntaxKind,45 pub kind: SyntaxKind,80 pub text: &'i str,46 pub text: &'i str,crates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth223mod ast;3mod ast;4mod binary;4mod binary;5mod classify;5mod event;6mod event;6mod generated;7mod generated;7mod language;8mod language;13mod token_set;14mod token_set;14mod unary;15mod unary;151617pub use ast::{AstChildren, AstNode, AstToken};18use event::Sink;19use generated::nodes::SourceFile;16pub use generated::syntax_kinds::SyntaxKind;20pub use generated::{nodes, syntax_kinds::SyntaxKind};17pub use language::{21pub use language::{18 JsonnetLanguage, PreorderWithTokens, SyntaxElement, SyntaxElementChildren, SyntaxNode,22 JsonnetLanguage, PreorderWithTokens, SyntaxElement, SyntaxElementChildren, SyntaxNode,19 SyntaxNodeChildren, SyntaxToken,23 SyntaxNodeChildren, SyntaxToken,20};24};25use lex::lex;26use parser::{Parser, SyntaxError};27pub fn parse(input: &str) -> (SourceFile, Vec<SyntaxError>) {28 let lexemes = lex(input);29 let parser = Parser::new(&lexemes);30 let events = parser.parse();31 let sink = Sink::new(events, &lexemes);3233 let parse = sink.finish();34 (35 SourceFile {36 syntax: parse.syntax(),37 },38 parse.errors,39 )40}2141crates/jrsonnet-rowan-parser/src/marker.rsdiffbeforeafterboth7 pub pos: usize,7 pub pos: usize,8}8}9impl Ranger {9impl Ranger {10 pub fn finish(mut self, p: &Parser) -> FinishedRanger {10 pub fn finish(self, p: &Parser) -> FinishedRanger {11 FinishedRanger {11 FinishedRanger {12 start_token: self.pos,12 start_token: self.pos,13 end_token: self.pos.max(p.offset.saturating_sub(1)),13 end_token: self.pos.max(p.offset.saturating_sub(1)),20 pub end_token: usize,20 pub end_token: usize,21}21}22impl FinishedRanger {22impl FinishedRanger {23 #[allow(dead_code)]23 pub fn had_error_since(&self, p: &Parser) -> bool {24 pub fn had_error_since(&self, p: &Parser) -> bool {24 p.last_error_token >= self.start_token25 p.last_error_token >= self.start_token25 }26 }28#[must_use]29#[must_use]29pub struct Marker {30pub struct Marker {30 pub start_event_idx: usize,31 pub start_event_idx: usize,31 pub token: usize,32 bomb: DropBomb,32 bomb: DropBomb,33}33}34impl Marker {34impl Marker {35 pub fn new(pos: usize, token: usize) -> Self {35 pub fn new(pos: usize) -> Self {36 Self {36 Self {37 start_event_idx: pos,37 start_event_idx: pos,38 token,39 bomb: DropBomb::new("marked dropped while not completed"),38 bomb: DropBomb::new("marked dropped while not completed"),40 }39 }41 }40 }42 pub fn complete(mut self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker {41 pub fn complete(mut self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker {43 self.bomb.defuse();42 self.bomb.defuse();43 assert!(44 !kind.is_enum(),45 "{kind:?} is a enum kind, you should use variant kinds instead"46 );47 // TODO: is_parser should return true if enum variant has #[regex]/#[token] over it48 // debug_assert!(49 // !kind.is_parser(),50 // "{kind:?} should be only emitted by parser, not used directly"51 // );44 let event_at_pos = &mut p.events[self.start_event_idx];52 let event_at_pos = &mut p.events[self.start_event_idx];45 assert_eq!(*event_at_pos, Event::Placeholder);53 assert_eq!(*event_at_pos, Event::Pending);465447 *event_at_pos = Event::Start {55 *event_at_pos = Event::Start {48 kind,56 kind,49 forward_parent: None,57 forward_parent: None,50 };58 };515960 let finish_event_idx = p.events.len();52 p.events.push(Event::Finish);61 p.events.push(Event::Finish { wrapper: None });53 p.entered -= 1;62 p.entered -= 1;54 p.clear_outdated_hints();63 p.clear_outdated_hints();55 CompletedMarker {64 CompletedMarker {56 start_event_idx: self.start_event_idx,65 start_event_idx: self.start_event_idx,57 start_token: self.token,66 finish_event_idx,58 end_token: self.token.max(p.offset.saturating_sub(1)),59 }67 }60 }68 }69 pub fn forget(mut self, p: &mut Parser) {70 self.bomb.defuse();71 let event_at_pos = &mut p.events[self.start_event_idx];72 assert_eq!(*event_at_pos, Event::Pending);7374 *event_at_pos = Event::Noop;75 p.entered -= 1;76 p.clear_outdated_hints();77 }61}78}62pub struct CompletedMarker {79pub struct CompletedMarker {63 start_event_idx: usize,80 start_event_idx: usize,64 pub start_token: usize,81 finish_event_idx: usize,65 pub end_token: usize,66}82}67impl CompletedMarker {83impl CompletedMarker {68 pub(super) fn precede(self, p: &mut Parser) -> Marker {84 pub(super) fn precede(self, p: &mut Parser) -> Marker {69 let mut new_m = p.start();85 let new_m = p.start();70 new_m.token = self.start_token;7172 if let Event::Start {73 ref mut forward_parent,86 match &mut p.events[self.start_event_idx] {74 ..75 } = p.events[self.start_event_idx]76 {87 Event::Start { forward_parent, .. } => {77 *forward_parent = Some(new_m.start_event_idx - self.start_event_idx);88 *forward_parent = Some(new_m.start_event_idx - self.start_event_idx);78 } else {89 }79 unreachable!();90 _ => unreachable!(),80 }91 }819282 new_m93 new_m83 }94 }95 /// Create new node around existing marker, not counting anything that comes after it96 pub fn wrap(self, p: &mut Parser, kind: SyntaxKind) -> CompletedMarker {97 let new_m = p.start();98 match &mut p.events[self.start_event_idx] {99 Event::Start { forward_parent, .. } => {100 *forward_parent = Some(new_m.start_event_idx - self.start_event_idx);101 }102 _ => unreachable!(),103 }104105 let completed = new_m.complete(p, kind);106107 match &mut p.events[self.finish_event_idx] {108 Event::Finish { wrapper } => {109 *wrapper = Some(completed.finish_event_idx - self.finish_event_idx);110 }111 _ => unreachable!(),112 }113 completed114 }84}115}8511686pub trait AsRange {117pub trait AsRange {87 fn as_range(&self, p: &Parser) -> TextRange;118 fn as_range(&self, p: &Parser) -> TextRange;88 fn end_token(&self) -> usize;119 fn end_token(&self) -> usize;89}120}9091impl AsRange for CompletedMarker {92 fn as_range(&self, p: &Parser) -> TextRange {93 TextRange::new(94 p.start_of_token(self.start_token),95 p.end_of_token(self.end_token),96 )97 }98 fn end_token(&self) -> usize {99 self.end_token100 }101}102121103impl AsRange for FinishedRanger {122impl AsRange for FinishedRanger {104 fn as_range(&self, p: &Parser) -> TextRange {123 fn as_range(&self, p: &Parser) -> TextRange {crates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth556use crate::{6use crate::{7 binary::BinaryOperator,7 binary::BinaryOperator,8 event::{Event, Sink},8 event::Event,9 lex::{lex, Lexeme},9 lex::Lexeme,10 marker::{AsRange, CompletedMarker, Marker, Ranger},10 marker::{AsRange, CompletedMarker, Marker, Ranger},11 string_block::{lex_str_block, StringBlockError},11 token_set::SyntaxKindSet,12 token_set::SyntaxKindSet,12 unary::UnaryOperator,13 unary::UnaryOperator,13 SyntaxKind,14 SyntaxKind,43 pub last_error_token: usize,44 pub last_error_token: usize,44 expected_syntax: Option<ExpectedSyntax>,45 expected_syntax: Option<ExpectedSyntax>,45 expected_syntax_tracking_state: Rc<Cell<ExpectedSyntaxTrackingState>>,46 expected_syntax_tracking_state: Rc<Cell<ExpectedSyntaxTrackingState>>,47 steps: Cell<u64>,46}48}474948const DEFAULT_RECOVERY_SET: SyntaxKindSet = TS![; ')' ']' '}' local];50const DEFAULT_RECOVERY_SET: SyntaxKindSet = TS![];495150#[derive(Clone, Debug, PartialEq, Eq)]52#[derive(Clone, Debug, PartialEq, Eq)]51pub enum SyntaxError {53pub enum SyntaxError {68 },70 },69}71}707271impl Into<LabeledSpan> for SyntaxError {73impl From<SyntaxError> for LabeledSpan {72 fn into(self) -> LabeledSpan {74 fn from(val: SyntaxError) -> Self {73 match self {75 match val {74 SyntaxError::Unexpected {76 SyntaxError::Unexpected {75 expected,77 expected,76 found,78 found,91 ),93 ),92 SyntaxError::Custom { error, range } | SyntaxError::Hint { error, range } => {94 SyntaxError::Custom { error, range } | SyntaxError::Hint { error, range } => {93 LabeledSpan::new_with_span(95 LabeledSpan::new_with_span(94 Some(format!("{}", error)),96 Some(error),95 SourceSpan::new(97 SourceSpan::new(96 SourceOffset::from(usize::from(range.start())),98 SourceOffset::from(usize::from(range.start())),97 SourceOffset::from(usize::from(range.end() - range.start())),99 SourceOffset::from(usize::from(range.end() - range.start())),103}105}104106105impl<'i> Parser<'i> {107impl<'i> Parser<'i> {106 fn new(lexemes: &'i [Lexeme<'i>]) -> Self {108 pub fn new(lexemes: &'i [Lexeme<'i>]) -> Self {107 Self {109 Self {108 lexemes,110 lexemes,109 offset: 0,111 offset: 0,115 expected_syntax_tracking_state: Rc::new(Cell::new(117 expected_syntax_tracking_state: Rc::new(Cell::new(116 ExpectedSyntaxTrackingState::Unnamed,118 ExpectedSyntaxTrackingState::Unnamed,117 )),119 )),120 steps: Cell::new(0),118 }121 }119 }122 }120 pub fn clear_outdated_hints(&mut self) {123 pub fn clear_outdated_hints(&mut self) {132 .set(ExpectedSyntaxTrackingState::Unnamed);135 .set(ExpectedSyntaxTrackingState::Unnamed);133 }136 }134 pub fn start(&mut self) -> Marker {137 pub fn start(&mut self) -> Marker {138 self.skip_trivia();135 let start_event_idx = self.events.len();139 let start_event_idx = self.events.len();136 self.events.push(Event::Placeholder);140 self.events.push(Event::Pending);137 self.entered += 1;141 self.entered += 1;138 Marker::new(start_event_idx, self.offset)142 Marker::new(start_event_idx)139 }143 }140 pub fn start_ranger(&mut self) -> Ranger {144 pub fn start_ranger(&mut self) -> Ranger {145 self.skip_trivia();141 let pos = self.offset;146 let pos = self.offset;142 Ranger { pos }147 Ranger { pos }143 }148 }144 fn parse(mut self) -> Vec<Event> {149 pub fn parse(mut self) -> Vec<Event> {145 let m = self.start();150 let m = self.start();146 expr(&mut self);151 expr(&mut self);147 if !self.at_end() {152 self.expect(EOF);148 let ranger = self.start_ranger();149150 while self.peek().is_some() {151 self.bump()152 }153 let end = ranger.finish(&self);154 self.custom_error(end, "unexpected input after expression");155 }156 m.complete(&mut self, SOURCE_FILE);153 m.complete(&mut self, SOURCE_FILE);157154158 self.events155 self.events168 recovery_set: SyntaxKindSet,165 recovery_set: SyntaxKindSet,169 ) {166 ) {170 if self.at(kind) {167 if self.at(kind) {171 self.bump();168 if kind != EOF {169 self.bump();170 }172 } else {171 } else {173 self.error_with_recovery_set(recovery_set);172 self.error_with_recovery_set(recovery_set);174 }173 }181 self.error_with_no_skip();180 self.error_with_no_skip();182 }181 }183 }182 }184 pub(crate) fn last_token_range(&self) -> Option<TextRange> {185 self.lexemes.last().map(|Lexeme { range, .. }| *range)186 }187 fn current_token(&self) -> Lexeme<'i> {183 fn current_token(&self) -> Lexeme<'i> {188 self.lexemes[self.offset]184 self.lexemes[self.offset]189 }185 }236 &mut self,232 &mut self,237 recovery_set: SyntaxKindSet,233 recovery_set: SyntaxKindSet,238 ) -> Option<CompletedMarker> {234 ) -> Option<CompletedMarker> {239 let expected_syntax = self.expected_syntax.take().unwrap();235 let expected_syntax = self236 .expected_syntax237 .take()238 .unwrap_or(ExpectedSyntax::Named("unknown"));240 self.expected_syntax_tracking_state239 self.expected_syntax_tracking_state241 .set(ExpectedSyntaxTrackingState::Unnamed);240 .set(ExpectedSyntaxTrackingState::Unnamed);242241243 if self.at_end() || self.at_set(recovery_set) {242 self.skip_trivia();243 if self.at_end() || self.at_ts(recovery_set) {244 let range = self244 let range = self245 .previous_token()245 .previous_token()246 .map(|t| t.range)246 .map(|t| t.range)247 .unwrap_or(TextRange::at(TextSize::from(0), TextSize::from(0)));247 .unwrap_or_else(|| TextRange::at(TextSize::from(0), TextSize::from(0)));248248249 self.events.push(Event::Error(SyntaxError::Missing {249 self.events.push(Event::Error(SyntaxError::Missing {250 expected: expected_syntax,250 expected: expected_syntax,256 let current_token = self.current_token();256 let current_token = self.current_token();257257258 self.events.push(Event::Error(SyntaxError::Unexpected {258 self.events.push(Event::Error(SyntaxError::Unexpected {259 expected: expected_syntax.clone(),259 expected: expected_syntax,260 found: current_token.kind,260 found: current_token.kind,261 range: current_token.range,261 range: current_token.range,262 }));262 }));270270271 fn bump(&mut self) {271 fn bump(&mut self) {272 self.skip_trivia();272 self.skip_trivia();273 self.bump_remap(self.current());274 }275 fn bump_remap(&mut self, kind: SyntaxKind) {276 self.skip_trivia();273 assert_ne!(self.offset, self.lexemes.len(), "already at end");277 assert_ne!(self.offset, self.lexemes.len(), "already at end");274 self.events.push(Event::Token);278 self.events.push(Event::Token { kind });275 self.offset += 1;279 self.offset += 1;276 self.clear_expected_syntaxes();280 self.clear_expected_syntaxes();277 }281 }278 fn peek(&mut self) -> Option<SyntaxKind> {282 fn step(&self) {283 use std::fmt::Write;284 let steps = self.steps.get();285 if steps >= 15000000 {279 self.skip_trivia();286 let mut out = "seems like parsing is stuck".to_owned();287 {288 let last = 20;289 write!(out, "\n\nLast {} events:", last).unwrap();290 for (i, event) in self291 .events292 .iter()293 .skip(self.events.len().saturating_sub(last))294 .enumerate()295 {296 write!(out, "\n{i}. {event:?}").unwrap();280 self.peek_raw()297 }298 }299 {300 let next = 20;301 write!(out, "\n\nNext {next} tokens:").unwrap();302 for (i, tok) in self.lexemes.iter().skip(self.offset).take(next).enumerate() {303 write!(out, "\n{i}. {tok:?}").unwrap();304 }305 }306 panic!("{out}")307 }308 self.steps.set(steps + 1);281 }309 }282 pub fn peek_token(&mut self) -> Option<&Lexeme<'i>> {310 fn nth(&self, i: usize) -> SyntaxKind {311 self.step();312 let mut offset = self.offset;313 for _ in 0..i {283 self.skip_trivia();314 while self315 .lexemes316 .get(offset)317 .map(|l| l.kind.is_trivia())318 .unwrap_or(false)319 {320 offset += 1;284 self.peek_token_raw()321 }322 offset += 1;323 }324 while self325 .lexemes326 .get(offset)327 .map(|l| l.kind.is_trivia())328 .unwrap_or(false)329 {330 offset += 1;331 }332 self.lexemes.get(offset).map(|l| l.kind).unwrap_or(EOF)285 }333 }334 fn current(&self) -> SyntaxKind {335 self.nth(0)336 }286 fn skip_trivia(&mut self) {337 fn skip_trivia(&mut self) {287 while self.peek_raw().map(|c| c.is_trivia()).unwrap_or(false) {338 while self.peek_raw().is_trivia() {288 self.offset += 1;339 self.offset += 1;289 }340 }290 }341 }291 fn peek_raw(&mut self) -> Option<SyntaxKind> {342 fn current_lexeme(&mut self) -> Option<&Lexeme> {292 self.lexemes.get(self.offset).map(|l| l.kind)343 self.skip_trivia();293 }294 fn peek_token_raw(&mut self) -> Option<&Lexeme<'i>> {295 self.lexemes.get(self.offset)344 self.lexemes.get(self.offset)296 }345 }346 fn peek_raw(&mut self) -> SyntaxKind {347 self.lexemes348 .get(self.offset)349 .map(|l| l.kind)350 .unwrap_or(SyntaxKind::EOF)351 }297 #[must_use]352 #[must_use]298 pub(crate) fn expected_syntax_name(&mut self, name: &'static str) -> ExpectedSyntaxGuard {353 pub(crate) fn expected_syntax_name(&mut self, name: &'static str) -> ExpectedSyntaxGuard {299 self.expected_syntax_tracking_state354 self.expected_syntax_tracking_state303 ExpectedSyntaxGuard::new(Rc::clone(&self.expected_syntax_tracking_state))358 ExpectedSyntaxGuard::new(Rc::clone(&self.expected_syntax_tracking_state))304 }359 }305 pub fn at(&mut self, kind: SyntaxKind) -> bool {360 pub fn at(&mut self, kind: SyntaxKind) -> bool {361 self.nth_at(0, kind)362 }363 pub fn nth_at(&mut self, n: usize, kind: SyntaxKind) -> bool {306 if let ExpectedSyntaxTrackingState::Unnamed = self.expected_syntax_tracking_state.get() {364 if let ExpectedSyntaxTrackingState::Unnamed = self.expected_syntax_tracking_state.get() {307 self.expected_syntax = Some(ExpectedSyntax::Unnamed(kind));365 self.expected_syntax = Some(ExpectedSyntax::Unnamed(kind));308 }366 }309 self.peek() == Some(kind)367 self.nth(n) == kind310 }368 }311 pub fn at_set(&mut self, set: SyntaxKindSet) -> bool {369 pub fn at_ts(&mut self, set: SyntaxKindSet) -> bool {312 self.peek().map_or(false, |k| set.contains(k))370 set.contains(self.current())313 }371 }314 pub fn at_end(&mut self) -> bool {372 pub fn at_end(&mut self) -> bool {315 self.peek().is_none()373 self.at(EOF)316 }374 }317}375}318pub(crate) struct ExpectedSyntaxGuard {376pub(crate) struct ExpectedSyntaxGuard {352 }}410 }}353}411}354412355fn expr(p: &mut Parser) {413fn expr(p: &mut Parser) -> Option<CompletedMarker> {356 expr_binding_power(p, 0);414 expr_binding_power(p, 0)357}415}358fn expr_binding_power(p: &mut Parser, minimum_binding_power: u8) -> Option<CompletedMarker> {416fn expr_binding_power(p: &mut Parser, minimum_binding_power: u8) -> Option<CompletedMarker> {359 let mut lhs = lhs(p)?;417 let mut lhs = lhs(p)?;392 p.bump();450 p.bump();393 }451 }394452395 let m = lhs.precede(p);453 let m = lhs.wrap(p, LHS_EXPR).precede(p);396 let parsed_rhs = expr_binding_power(p, right_binding_power).is_some();454 let parsed_rhs = expr_binding_power(p, right_binding_power).is_some();397 lhs = m.complete(455 lhs = m.complete(398 p,456 p,414 if p.at(T![for]) {472 if p.at(T![for]) {415 let m = p.start();473 let m = p.start();416 p.bump();474 p.bump();417 p.expect(IDENT);475 name(p);418 p.expect(T![in]);476 p.expect(T![in]);419 expr(p);477 expr(p);420 m.complete(p, FOR_SPEC);478 m.complete(p, FOR_SPEC);421 } else if p.at(T![in]) {479 } else if p.at(T![if]) {422 let m = p.start();480 let m = p.start();423 p.bump();481 p.bump();424 expr(p);482 expr(p);439 if p.at(T![,]) {497 if p.at(T![,]) {440 p.bump();498 p.bump();441 true499 true442 } else if p.at_set(set) {500 } else if p.at_ts(set) {443 p.expect_with_no_skip(T![,]);501 p.expect_with_no_skip(T![,]);444 p.bump();502 p.bump();445 true503 true449}507}450fn field_name(p: &mut Parser) {508fn field_name(p: &mut Parser) {451 let _e = p.expected_syntax_name("field name");509 let _e = p.expected_syntax_name("field name");510 let m = p.start();452 if p.at(T!['[']) {511 if p.at(T!['[']) {453 p.bump();512 p.bump();454 expr(p);513 expr(p);455 p.expect(T![']']);514 p.expect(T![']']);515 m.complete(p, FIELD_NAME_DYNAMIC);456 } else if p.at(IDENT) {516 } else if p.at(IDENT) {457 p.bump()517 name(p);518 m.complete(p, FIELD_NAME_FIXED);519 } else if p.current().is_string() {520 string(p);521 m.complete(p, FIELD_NAME_FIXED);458 } else {522 } else {459 p.error_with_recovery_set(TS![;]);523 p.error_with_recovery_set(TS![;]);460 }524 }461}525}526fn visibility(p: &mut Parser) {527 if p.at_ts(TS![: :: :::]) {528 p.bump()529 } else {530 p.error_with_recovery_set(TS![]);531 }532}533fn field(p: &mut Parser) {534 let m = p.start();535 field_name(p);536 let plus = if p.at(T![+]) {537 let r = p.start_ranger();538 p.bump();539 Some(r.finish(p))540 } else {541 None542 };543 let params = if p.at(T!['(']) {544 if let Some(plus) = plus {545 p.custom_error(plus, "can't extend with method");546 }547 params_desc(p);548 if p.at(T![+]) {549 let r = p.start_ranger();550 p.bump();551 p.custom_error(r.finish(p), "can't extend with method");552 }553 true554 } else {555 false556 };557 visibility(p);558 expr(p);559560 if params {561 m.complete(p, FIELD_METHOD)562 } else {563 m.complete(p, FIELD_NORMAL)564 };565}566fn assertion(p: &mut Parser) {567 assert!(p.at(T![assert]));568 let m = p.start();569 p.bump();570 expr(p).map(|c| c.wrap(p, LHS_EXPR));571 if p.at(T![:]) {572 p.bump();573 expr(p);574 }575 m.complete(p, ASSERTION);576}462fn object(p: &mut Parser) -> CompletedMarker {577fn object(p: &mut Parser) -> CompletedMarker {463 assert!(p.at(T!['{']));578 assert!(p.at(T!['{']));579 let m_t = p.start();464 let m = p.start();580 let m = p.start();465 p.bump();581 p.bump();466582470 break;586 break;471 }587 }472 let m = p.start();588 let m = p.start();473 field_name(p);589 if p.at(T![local]) {590 obj_local(p);474 p.expect(T![,]);591 m.complete(p, MEMBER_BIND_STMT)592 } else if p.at(T![assert]) {593 assertion(p);475 expr(p);594 m.complete(p, MEMBER_ASSERT_STMT)595 } else {596 field(p);476 while p.at(T![for]) || p.at(T![if]) {597 while p.at(T![for]) || p.at(T![if]) {477 compspec(p)598 compspec(p)478 }599 }479 m.complete(p, MEMBER);600 m.complete(p, MEMBER_FIELD)601 };480 if comma_with_alternatives(p, SyntaxKindSet::new(&[T![=]])) {602 if comma_with_alternatives(p, SyntaxKindSet::new(&[T![=]])) {481 continue;603 continue;482 }604 }483 p.expect(R_BRACE);605 p.expect(R_BRACE);484 break;606 break;485 }607 }486608487 m.complete(p, OBJ_BODY)609 m.complete(p, OBJ_BODY_MEMBER_LIST);610 m_t.complete(p, EXPR_OBJECT)488}611}489612fn param(p: &mut Parser) {613 let m = p.start();614 destruct(p);615 if p.at(T![=]) {616 p.bump();617 expr(p);618 }619 m.complete(p, PARAM);620}490fn params(p: &mut Parser) -> CompletedMarker {621fn params_desc(p: &mut Parser) -> CompletedMarker {491 assert!(p.at(T!['(']));622 assert!(p.at(T!['(']));492 let m = p.start();623 let m = p.start();493 p.bump();624 p.bump();497 p.bump();628 p.bump();498 break;629 break;499 }630 }500 let m = p.start();631 param(p);501 p.expect(IDENT);502 if p.at(T![=]) {503 p.bump();504 expr(p);505 }506 m.complete(p, PARAM);507 if comma(p) {632 if comma(p) {508 continue;633 continue;509 }634 }513638514 m.complete(p, PARAMS_DESC)639 m.complete(p, PARAMS_DESC)515}640}516fn args(p: &mut Parser) {641fn args_desc(p: &mut Parser) {642 let m = p.start();517 assert!(p.at(T!['(']));643 assert!(p.at(T!['(']));518 p.bump();644 p.bump();519645520 let mut error_positional_start = None::<Marker>;646 let started_named = Cell::new(false);521 let mut started_named = Cell::new(false);647522 let mut on_positional = |p: &mut Parser, m: Marker| {523 let c = m.complete(p, ARG);524 if started_named.get() && error_positional_start.is_none() {525 error_positional_start = Some(c.precede(p));526 }527 };528 loop {648 loop {529 if p.at(T![')']) {649 if p.at(T![')']) {530 break;650 break;531 }651 }532652533 let m = p.start();653 let m = p.start();534 if p.at(IDENT) {654 if p.at(IDENT) && p.nth_at(1, T![=]) {655 name(p);535 p.bump();656 p.bump();536 if p.at(T![=]) {657 expr(p);537 p.bump();538 expr(p);539 m.complete(p, ARG);658 m.complete(p, ARG);540 started_named.set(true);659 started_named.set(true);541 } else {542 on_positional(p, m);543 }544 } else {660 } else {545 expr(p);661 expr(p);546 on_positional(p, m);662 m.complete(p, ARG);547 }663 }548 if comma(p) {664 if comma(p) {549 continue;665 continue;550 }666 }551 break;667 break;552 }668 }553 if let Some(error_positional_start) = error_positional_start {669 p.expect(T![')']);554 let c = error_positional_start.complete(p, ERROR);670 if p.at(T![tailstrict]) {555 p.custom_error(c, "positional arguments can't be placed after named")671 p.bump()556 }672 }557 p.expect(T![')']);673 m.complete(p, ARGS_DESC);558}674}559675560fn array(p: &mut Parser) -> CompletedMarker {676fn array(p: &mut Parser) -> CompletedMarker {605 m.complete(p, EXPR_ARRAY)721 m.complete(p, EXPR_ARRAY)606 }722 }607}723}608724/// Returns true if it was slice, false if just index725#[must_use]726fn slice_desc_or_index(p: &mut Parser) -> bool {727 let m = p.start();728 p.bump();729 // TODO: do not treat :, ::, ::: as full tokens?730 // Start731 if !p.at(T![:]) && !p.at(T![::]) {732 expr(p);733 }734 if p.at(T![:]) {735 p.bump();736 // End737 if !p.at(T![']']) {738 expr(p).map(|c| c.wrap(p, SLICE_DESC_END));739 }740 if p.at(T![:]) {741 p.bump();742 // Step743 if !p.at(T![']']) {744 expr(p).map(|c| c.wrap(p, SLICE_DESC_STEP));745 }746 }747 } else if p.at(T![::]) {748 p.bump();749 // End750 if !p.at(T![']']) {751 expr(p).map(|c| c.wrap(p, SLICE_DESC_END));752 }753 } else {754 // It was not a slice755 p.expect(T![']']);756 m.forget(p);757 return false;758 }759 p.expect(T![']']);760 m.complete(p, SLICE_DESC);761 true762}609fn lhs(p: &mut Parser) -> Option<CompletedMarker> {763fn lhs(p: &mut Parser) -> Option<CompletedMarker> {610 let mut lhs = lhs_basic(p)?;764 let mut lhs = lhs_basic(p)?;611765612 loop {766 loop {613 if p.at(T![.]) {767 if p.at(T![.]) {614 let m = lhs.precede(p);768 let m = lhs.precede(p);615 p.bump();769 p.bump();616 p.expect(IDENT);770 name(p);617 lhs = m.complete(p, EXPR_INDEX);771 lhs = m.complete(p, EXPR_INDEX);618 } else if p.at(T!['[']) {772 } else if p.at(T!['[']) {619 let m = lhs.precede(p);773 if slice_desc_or_index(p) {774 lhs = lhs.precede(p).complete(p, EXPR_SLICE);620 p.bump();775 } else {621 // Start776 lhs = lhs622 if !p.at(T![:]) {777 .wrap(p, LHS_EXPR)778 .precede(p)623 expr(p);779 .complete(p, EXPR_INDEX_EXPR);624 }780 }625 if p.at(T![:]) {626 p.bump();627 // End628 if !p.at(T![']']) && !p.at(T![:]) {629 expr(p);630 }631 if p.at(T![:]) {632 p.bump();633 // Step634 if !p.at(T![']']) {635 expr(p);636 }637 }638 }639 p.expect(T![']']);640 lhs = m.complete(p, EXPR_SLICE);641 } else if p.at(T!['(']) {781 } else if p.at(T!['(']) {642 let m = lhs.precede(p);782 let m = lhs.precede(p);643 args(p);783 args_desc(p);644 lhs = m.complete(p, EXPR_APPLY);784 lhs = m.complete(p, EXPR_APPLY);645 } else {785 } else {646 break;786 break;649789650 Some(lhs)790 Some(lhs)651}791}652792fn name(p: &mut Parser) {793 let m = p.start();794 p.expect(IDENT);795 m.complete(p, NAME);796}797fn destruct_rest(p: &mut Parser) {798 assert!(p.at(T![...]));799 p.bump();800 let m = p.start();801 if p.at(IDENT) {802 p.bump()803 }804 m.complete(p, DESTRUCT_REST);805}806fn destruct_object_field(p: &mut Parser) {807 let m = p.start();808 name(p);809 if p.at(T![:]) {810 p.bump();811 destruct(p);812 };813 if p.at(T![=]) {814 p.bump();815 expr(p);816 }817 m.complete(p, DESTRUCT_OBJECT_FIELD);818}819fn obj_local(p: &mut Parser) {820 assert!(p.at(T![local]));821 let m = p.start();822 p.bump();823 bind(p);824 m.complete(p, OBJ_LOCAL);825}826fn destruct(p: &mut Parser) -> CompletedMarker {827 let m = p.start();828 if p.at(T![?]) {829 p.bump();830 m.complete(p, DESTRUCT_SKIP)831 } else if p.at(T!['[']) {832 p.bump();833 let mut had_rest = false;834 loop {835 if p.at(T![']']) {836 p.bump();837 break;838 } else if p.at(T![...]) {839 let m_err = p.start_ranger();840 destruct_rest(p);841 if had_rest {842 p.custom_error(m_err.finish(p), "only one rest can be present in array");843 }844 had_rest = true;845 } else {846 destruct(p);847 }848 if p.at(T![,]) {849 p.bump();850 continue;851 }852 p.expect(T![']']);853 break;854 }855 m.complete(p, DESTRUCT_ARRAY)856 } else if p.at(T!['{']) {857 p.bump();858 let mut had_rest = false;859 loop {860 if p.at(T!['}']) {861 p.bump();862 break;863 } else if p.at(T![...]) {864 let m_err = p.start_ranger();865 destruct_rest(p);866 if had_rest {867 p.custom_error(m_err.finish(p), "only one rest can be present in object");868 }869 had_rest = true;870 } else {871 if had_rest {872 p.error_with_recovery_set(TS![]);873 }874 destruct_object_field(p);875 }876 if p.at(T![,]) {877 p.bump();878 continue;879 }880 p.expect(T!['}']);881 break;882 }883 m.complete(p, DESTRUCT_OBJECT)884 } else if p.at(IDENT) {885 name(p);886 m.complete(p, DESTRUCT_FULL)887 } else {888 m.complete(p, ERROR)889 }890}891fn bind(p: &mut Parser) {892 let m = p.start();893 if p.at(IDENT) && p.nth_at(1, T!['(']) {894 name(p);895 params_desc(p);896 p.expect(T![=]);897 expr(p);898 m.complete(p, BIND_FUNCTION)899 } else {900 destruct(p);901 p.expect(T![=]);902 expr(p);903 m.complete(p, BIND_DESTRUCT)904 };905}906fn string(p: &mut Parser) {907 assert!(p.current().is_string());908 if p.at(STRING_BLOCK) {909 // We use custom lexer, which skips enough bytes, but not returns error910 // Instead we should call lexer again to verify if there is something wrong with string block911 let mut lexer = logos::Lexer::<SyntaxKind>::new(dbg!(912 &p.current_lexeme().expect("parser is at string block").text913 ));914 // In kinds, string blocks is parsed at least as `|||`915 lexer.bump(3);916 let res = lex_str_block(&mut lexer);917 debug_assert!(lexer.next().is_none(), "str_block is lexed");918 match res {919 Ok(_) => {920 p.bump();921 }922 Err(e) => p.bump_remap(match e {923 StringBlockError::UnexpectedEnd => ERROR_STRING_BLOCK_UNEXPECTED_END,924 StringBlockError::MissingNewLine => ERROR_STRING_BLOCK_MISSING_NEW_LINE,925 StringBlockError::MissingTermination => ERROR_STRING_BLOCK_MISSING_TERMINATION,926 StringBlockError::MissingIndent => ERROR_STRING_BLOCK_MISSING_INDENT,927 }),928 }929 } else {930 p.bump();931 }932}933fn number(p: &mut Parser) {934 assert!(p.current().is_number());935 p.bump();936}937fn literal(p: &mut Parser) {938 assert!(p.current().is_literal());939 p.bump();940}653fn lhs_basic(p: &mut Parser) -> Option<CompletedMarker> {941fn lhs_basic(p: &mut Parser) -> Option<CompletedMarker> {654 let _e = p.expected_syntax_name("value");942 let _e = p.expected_syntax_name("value");655 Some(if p.peek().map(|l| l.is_literal()).unwrap_or(false) {943 Some(if p.current().is_literal() {656 let m = p.start();944 let m = p.start();657 p.bump();945 literal(p);658 m.complete(p, EXPR_LITERAL)946 m.complete(p, EXPR_LITERAL)659 } else if p.peek().map(|l| l.is_string()).unwrap_or(false) {947 } else if p.current().is_string() {660 let m = p.start();948 let m = p.start();661 p.bump();949 string(p);662 m.complete(p, EXPR_STRING)950 m.complete(p, EXPR_STRING)663 } else if p.peek().map(|l| l.is_number()).unwrap_or(false) {951 } else if p.current().is_number() {664 let m = p.start();952 let m = p.start();665 p.bump();953 number(p);666 m.complete(p, EXPR_NUMBER)954 m.complete(p, EXPR_NUMBER)667 } else if p.at(IDENT) {955 } else if p.at(IDENT) {668 let m = p.start();956 let m = p.start();957 name(p);958 m.complete(p, EXPR_VAR)959 } else if p.at(INTRINSIC_THIS_FILE) {960 let m = p.start();669 p.bump();961 p.bump();670 m.complete(p, EXPR_VAR)962 m.complete(p, EXPR_INTRINSIC_THIS_FILE)963 } else if p.at(INTRINSIC_ID) {964 let m = p.start();965 p.bump();966 m.complete(p, EXPR_INTRINSIC_ID)967 } else if p.at(INTRINSIC) {968 let m = p.start();969 p.bump();970 p.expect(T!['(']);971 name(p);972 p.expect(T![')']);973 m.complete(p, EXPR_INTRINSIC)974 } else if p.at(T![if]) {975 let m = p.start();976 p.bump();977 expr(p);978 p.expect(T![then]);979 expr(p).map(|c| c.wrap(p, TRUE_EXPR));980 if p.at(T![else]) {981 p.bump();982 expr(p).map(|c| c.wrap(p, FALSE_EXPR));983 }984 m.complete(p, EXPR_IF_THEN_ELSE)671 } else if p.at(T!['[']) {985 } else if p.at(T!['[']) {672 array(p)986 array(p)673 } else if p.at(T!['{']) {987 } else if p.at(T!['{']) {674 object(p)988 object(p)675 } else if p.at(T![local]) {989 } else if p.at(T![local]) {676 let m = p.start();990 let m = p.start();677 p.bump();991 p.bump();678 let mut sus_local = None;679 loop {992 loop {680 p.expect_with_recovery_set(IDENT, TS![= ; local]);993 if p.at(T![;]) {681 if p.at(T!['(']) {994 p.bump();682 params(p);995 break;683 }996 }997 bind(p);684998685 let sus_local_candidate = p.start_ranger();999 if p.at(T![,]) {686 p.expect_with_recovery_set(T![=], TS![; local]);687688 sus_local = p.at(T![local]).then(|| sus_local_candidate.finish(p));1000 p.bump();689 expr(p);690691 if !comma(p) {692 break;1001 continue;693 }1002 }1003 p.expect(T![;]);1004 break;694 }1005 }695 p.expect(T![;]);696 if let Some(sus_local) = sus_local {697 if sus_local.had_error_since(p) {698 p.custom_error(sus_local, "unusal local placement, missing ';' ?")699 }700 }701 expr(p);1006 expr(p);702 m.complete(p, T![local])1007 m.complete(p, EXPR_LOCAL)703 } else if p.at(T![function]) {1008 } else if p.at(T![function]) {704 let m = p.start();1009 let m = p.start();705 p.bump();1010 p.bump();706 args(p);1011 params_desc(p);707 expr(p);1012 expr(p);708 m.complete(p, EXPR_FUNCTION)1013 m.complete(p, EXPR_FUNCTION)709 } else if p.at(T![error]) {1014 } else if p.at(T![error]) {713 m.complete(p, EXPR_ERROR)1018 m.complete(p, EXPR_ERROR)714 } else if p.at(T![assert]) {1019 } else if p.at(T![assert]) {715 let m = p.start();1020 let m = p.start();716 p.bump();1021 assertion(p);1022 p.expect(T![;]);717 expr(p);1023 expr(p);718 if p.at(T![:]) {719 p.bump();720 expr(p);721 }722 m.complete(p, EXPR_ASSERT)1024 m.complete(p, EXPR_ASSERT)723 } else if p.at(T![import]) || p.at(T![importstr]) || p.at(T![importbin]) {1025 } else if p.at(T![import]) || p.at(T![importstr]) || p.at(T![importbin]) {724 let m = p.start();1026 let m = p.start();725 p.bump();1027 p.bump();726 expr(p);1028 string(p);727 m.complete(p, EXPR_IMPORT)1029 m.complete(p, EXPR_IMPORT)728 } else if p.at(T![-]) || p.at(T![!]) || p.at(T![~]) {1030 } else if p.at(T![-]) || p.at(T![!]) || p.at(T![~]) {729 let op = match p.peek().unwrap() {1031 let op = match p.current() {730 T![-] => UnaryOperator::Minus,1032 T![-] => UnaryOperator::Minus,731 T![!] => UnaryOperator::Not,1033 T![!] => UnaryOperator::Not,732 T![~] => UnaryOperator::BitNegate,1034 T![~] => UnaryOperator::BitNegate,746 p.bump();1048 p.bump();747 m.complete(p, EXPR_PARENED)1049 m.complete(p, EXPR_PARENED)748 } else {1050 } else {749 p.error_with_no_skip();1051 p.error_with_recovery_set(TS![]);750 return None;1052 return None;751 })1053 })752}1054}755 pub fn syntax(&self) -> SyntaxNode {1057 pub fn syntax(&self) -> SyntaxNode {756 SyntaxNode::new_root(self.green_node.clone())1058 SyntaxNode::new_root(self.green_node.clone())757 }1059 }758}759760pub fn parse(input: &str) -> Parse {761 let lexemes = lex(input);762 let parser = Parser::new(&lexemes);763 let events = parser.parse();764 dbg!(&events);765 let sink = Sink::new(events, &lexemes);766767 sink.finish()768}1060}7691061crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "[a for a in [1, 2, 3]]\n"3expression: "[a for a in [1, 2, 3]]\n"56---4---7Root@0..235SOURCE_FILE@0..228 Array@0..236 EXPR_ARRAY_COMP@0..229 SymbolLeftBracket@0..1 "["7 L_BRACK@0..1 "["10 ArrayElem@1..218 EXPR_VAR@1..211 BodyDef@1..39 NAME@1..212 Ident@1..310 IDENT@1..2 "a"13 Ident@1..2 "a"14 Whitespace@2..3 " "11 WHITESPACE@2..3 " "15 CompspecFor@3..2112 FOR_SPEC@3..2116 KeywordFor@3..6 "for"13 FOR_KW@3..6 "for"17 Whitespace@6..7 " "14 WHITESPACE@6..7 " "18 Ident@7..8 "a"15 NAME@7..816 IDENT@7..8 "a"19 Whitespace@8..9 " "17 WHITESPACE@8..9 " "20 OpIn@9..11 "in"18 IN_KW@9..11 "in"21 Whitespace@11..12 " "19 WHITESPACE@11..12 " "22 Array@12..2120 EXPR_ARRAY@12..2123 SymbolLeftBracket@12..13 "["21 L_BRACK@12..13 "["24 ArrayElem@13..1422 EXPR_NUMBER@13..1425 BodyDef@13..1423 FLOAT@13..14 "1"26 Literal@13..1427 Number@13..14 "1"28 SymbolComma@14..15 ","24 COMMA@14..15 ","29 Whitespace@15..16 " "25 WHITESPACE@15..16 " "30 ArrayElem@16..1726 EXPR_NUMBER@16..1731 BodyDef@16..1727 FLOAT@16..17 "2"32 Literal@16..1733 Number@16..17 "2"34 SymbolComma@17..18 ","28 COMMA@17..18 ","35 Whitespace@18..19 " "29 WHITESPACE@18..19 " "36 ArrayElem@19..2030 EXPR_NUMBER@19..2037 BodyDef@19..2031 FLOAT@19..20 "3"38 Literal@19..2039 Number@19..20 "3"40 SymbolRightBracket@20..21 "]"32 R_BRACK@20..21 "]"41 SymbolRightBracket@21..22 "]"33 R_BRACK@21..22 "]"42 Whitespace@22..23 "\n"43344435crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__array_comp_incompatible_with_multiple_elems.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "[a for a in [1, 2, 3], b]\n"3expression: "[a for a in [1, 2, 3], b]\n"56---4---7Root@0..265SOURCE_FILE@0..258 Array@0..266 EXPR_ARRAY@0..259 SymbolLeftBracket@0..1 "["7 L_BRACK@0..1 "["10 ArrayElem@1..218 EXPR_VAR@1..211 BodyDef@1..39 NAME@1..212 Ident@1..310 IDENT@1..2 "a"13 Ident@1..2 "a"14 Whitespace@2..3 " "11 WHITESPACE@2..3 " "15 CompspecFor@3..2112 FOR_SPEC@3..2116 KeywordFor@3..6 "for"13 FOR_KW@3..6 "for"17 Whitespace@6..7 " "14 WHITESPACE@6..7 " "18 Ident@7..8 "a"15 NAME@7..816 IDENT@7..8 "a"19 Whitespace@8..9 " "17 WHITESPACE@8..9 " "20 OpIn@9..11 "in"18 IN_KW@9..11 "in"21 Whitespace@11..12 " "19 WHITESPACE@11..12 " "22 Array@12..2120 EXPR_ARRAY@12..2123 SymbolLeftBracket@12..13 "["21 L_BRACK@12..13 "["24 ArrayElem@13..1422 EXPR_NUMBER@13..1425 BodyDef@13..1423 FLOAT@13..14 "1"26 Literal@13..1427 Number@13..14 "1"28 SymbolComma@14..15 ","24 COMMA@14..15 ","29 Whitespace@15..16 " "25 WHITESPACE@15..16 " "30 ArrayElem@16..1726 EXPR_NUMBER@16..1731 BodyDef@16..1727 FLOAT@16..17 "2"32 Literal@16..1733 Number@16..17 "2"34 SymbolComma@17..18 ","28 COMMA@17..18 ","35 Whitespace@18..19 " "29 WHITESPACE@18..19 " "36 ArrayElem@19..2030 EXPR_NUMBER@19..2037 BodyDef@19..2031 FLOAT@19..20 "3"38 Literal@19..2039 Number@19..20 "3"40 SymbolRightBracket@20..21 "]"32 R_BRACK@20..21 "]"41 SymbolComma@21..22 ","33 COMMA@21..22 ","42 Whitespace@22..23 " "34 WHITESPACE@22..23 " "43 ArrayElem@23..2435 EXPR_VAR@23..2444 BodyDef@23..2436 NAME@23..2445 Ident@23..2437 IDENT@23..24 "b"46 Ident@23..24 "b"47 SymbolRightBracket@24..25 "]"38 R_BRACK@24..25 "]"48 Whitespace@25..26 "\n"49===39===50Custom { error: "compspec may only be used if there is only one array element", range: 3..21 }40Custom { error: "compspec may only be used if there is only one array element", range: 3..21 }51===41===52 [38;2;255;30;30m×[0m syntax error42 x syntax error53 ╭────43 ,----54 [2m1[0m │ [a for a in [1, 2, 3], b]44 1 | [a for a in [1, 2, 3], b]55 · [38;2;246;87;248m ─────────┬────────[0m45 : ^^^^^^^^^|^^^^^^^^56 · [38;2;246;87;248m╰── [38;2;246;87;248mcompspec may only be used if there is only one array element[0m[0m46 : `-- compspec may only be used if there is only one array element57 ╰────47 `----58485949crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__empty.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: " "3expression: " "56---4---7Root@0..15SOURCE_FILE@0..18 Whitespace@0..1 " "6 WHITESPACE@0..1 " "9===7===10Missing { expected: Named("value"), offset: 1 }8Missing { expected: Named("value"), offset: 1 }11===9===12 [38;2;255;30;30m×[0m syntax error10 x syntax error13 ╭────11 ,----14 [2m1[0m │ 12 1 | 15 · [38;2;246;87;248m ▲[0m13 `----16 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m17 ╰────18141915crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "function(a, b = 1) a + b\n"3expression: "function(a, b = 1) a + b\n"56---4---7Root@0..255SOURCE_FILE@0..248 FunctionDef@0..256 EXPR_FUNCTION@0..249 KeywordFunction@0..8 "function"7 FUNCTION_KW@0..8 "function"10 LParen@8..9 "("8 PARAMS_DESC@8..189 L_PAREN@8..9 "("11 DefPositionalArg@9..1010 PARAM@9..1012 Ident@9..10 "a"11 DESTRUCT_FULL@9..1012 NAME@9..1013 IDENT@9..10 "a"13 SymbolComma@10..11 ","14 COMMA@10..11 ","14 Whitespace@11..12 " "15 WHITESPACE@11..12 " "15 DefNamedArg@12..1716 PARAM@12..1716 Ident@12..13 "b"17 DESTRUCT_FULL@12..1318 NAME@12..1319 IDENT@12..13 "b"17 Whitespace@13..14 " "20 WHITESPACE@13..14 " "18 SymbolAssign@14..15 "="21 ASSIGN@14..15 "="19 Whitespace@15..16 " "22 WHITESPACE@15..16 " "20 Literal@16..1723 EXPR_NUMBER@16..1721 Number@16..17 "1"24 FLOAT@16..17 "1"22 RParen@17..18 ")"25 R_PAREN@17..18 ")"23 Whitespace@18..19 " "26 WHITESPACE@18..19 " "24 BodyDef@19..2527 EXPR_BINARY@19..2425 BinOp@19..2528 LHS_EXPR@19..2026 Ident@19..2129 EXPR_VAR@19..2027 Ident@19..20 "a"30 NAME@19..2028 Whitespace@20..21 " "31 IDENT@19..20 "a"32 WHITESPACE@20..21 " "29 OpPlus@21..22 "+"33 PLUS@21..22 "+"30 Whitespace@22..23 " "34 WHITESPACE@22..23 " "31 Ident@23..2535 EXPR_VAR@23..2432 Ident@23..24 "b"36 NAME@23..2433 Whitespace@24..25 "\n"37 IDENT@23..24 "b"34383539crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_body.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "function(a, b)\n"3expression: "function(a, b)\n"56---4---7Root@0..155SOURCE_FILE@0..148 FunctionDef@0..156 EXPR_FUNCTION@0..149 KeywordFunction@0..8 "function"7 FUNCTION_KW@0..8 "function"10 LParen@8..9 "("8 PARAMS_DESC@8..149 L_PAREN@8..9 "("11 DefPositionalArg@9..1010 PARAM@9..1012 Ident@9..10 "a"11 DESTRUCT_FULL@9..1012 NAME@9..1013 IDENT@9..10 "a"13 SymbolComma@10..11 ","14 COMMA@10..11 ","14 Whitespace@11..12 " "15 WHITESPACE@11..12 " "15 DefPositionalArg@12..1316 PARAM@12..1316 Ident@12..13 "b"17 DESTRUCT_FULL@12..1317 RParen@13..14 ")"18 NAME@12..1318 Whitespace@14..15 "\n"19 IDENT@12..13 "b"19 BodyDef@15..1520 R_PAREN@13..14 ")"20===21===21Missing { expected: Named("value"), offset: 14 }22Missing { expected: Named("value"), offset: 14 }22===23===23 [38;2;255;30;30m×[0m syntax error24 x syntax error24 ╭────25 ,----25 [2m1[0m │ function(a, b)26 1 | function(a, b)26 · [38;2;246;87;248m ▲[0m27 : ^27 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m28 : `-- missing value28 ╰────29 `----29303031crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_no_value.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "function(a, b = ) a + b\n"3expression: "function(a, b = ) a + b\n"56---4---7Root@0..245SOURCE_FILE@0..248 FunctionDef@0..246 EXPR_FUNCTION@0..249 KeywordFunction@0..8 "function"7 FUNCTION_KW@0..8 "function"10 LParen@8..9 "("8 PARAMS_DESC@8..189 L_PAREN@8..9 "("11 DefPositionalArg@9..1010 PARAM@9..1012 Ident@9..10 "a"11 IDENT@9..10 "a"13 SymbolComma@10..11 ","12 COMMA@10..11 ","14 Whitespace@11..12 " "13 WHITESPACE@11..12 " "15 DefNamedArg@12..1614 PARAM@12..1616 Ident@12..13 "b"15 IDENT@12..13 "b"17 Whitespace@13..14 " "16 WHITESPACE@13..14 " "18 SymbolAssign@14..15 "="17 ASSIGN@14..15 "="19 Whitespace@15..16 " "18 WHITESPACE@15..16 " "20 RParen@16..17 ")"19 R_PAREN@16..17 ")"21 Whitespace@17..18 " "20 WHITESPACE@17..18 " "22 BodyDef@18..2421 EXPR_BINARY@18..2423 BinOp@18..2422 EXPR_VAR@18..2024 Ident@18..2025 Ident@18..19 "a"23 IDENT@18..19 "a"26 Whitespace@19..20 " "24 WHITESPACE@19..20 " "27 OpPlus@20..21 "+"25 PLUS@20..21 "+"28 Whitespace@21..22 " "26 WHITESPACE@21..22 " "29 Ident@22..2427 EXPR_VAR@22..2430 Ident@22..23 "b"28 IDENT@22..23 "b"31 Whitespace@23..24 "\n"29 WHITESPACE@23..24 "\n"32===30===33Missing { expected: Named("value"), offset: 15 }31Missing { expected: Named("value"), offset: 15 }34===32===35 [38;2;255;30;30m×[0m syntax error33 x syntax error36 ╭────34 ,----37 [2m1[0m │ function(a, b = ) a + b35 1 | function(a, b = ) a + b38 · [38;2;246;87;248m ▲[0m36 : ^39 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m37 : `-- missing value40 ╰────38 `----41394240crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__function_error_rparen.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "function(a, b\n"3expression: "function(a, b\n"56---4---7Root@0..145SOURCE_FILE@0..138 FunctionDef@0..146 EXPR_FUNCTION@0..139 KeywordFunction@0..8 "function"7 FUNCTION_KW@0..8 "function"10 LParen@8..9 "("8 PARAMS_DESC@8..139 L_PAREN@8..9 "("11 DefPositionalArg@9..1010 PARAM@9..1012 Ident@9..10 "a"11 DESTRUCT_FULL@9..1012 NAME@9..1013 IDENT@9..10 "a"13 SymbolComma@10..11 ","14 COMMA@10..11 ","14 Whitespace@11..12 " "15 WHITESPACE@11..12 " "15 DefPositionalArg@12..1416 PARAM@12..1316 Ident@12..13 "b"17 DESTRUCT_FULL@12..1317 Whitespace@13..14 "\n"18 NAME@12..1318 BodyDef@14..1419 IDENT@12..13 "b"19===20===20Missing { expected: Unnamed(RParen), offset: 13 }21Missing { expected: Unnamed(R_PAREN), offset: 13 }21Missing { expected: Named("value"), offset: 13 }22Missing { expected: Named("value"), offset: 13 }22===23===23 [38;2;255;30;30m×[0m syntax error24 x syntax error24 ╭────25 ,----25 [2m1[0m │ function(a, b26 1 | function(a, b26 · [38;2;246;87;248m ▲[0m27 : ^27 · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212mmissing value[0m[0m28 : |`-- missing value28 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing RParen[0m[0m29 : `-- missing R_PAREN29 ╰────30 `----30313132crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "local a =\nlocal b = 3;\n1\n"3expression: "local a =\nlocal b = 3;\n1\n"56---4---7Root@0..255SOURCE_FILE@0..258 Local@0..256 LOCAL_KW@0..259 KeywordLocal@0..5 "local"7 LOCAL_KW@0..5 "local"10 Whitespace@5..6 " "8 WHITESPACE@5..6 " "11 Ident@6..7 "a"9 IDENT@6..7 "a"12 Whitespace@7..8 " "10 WHITESPACE@7..8 " "13 SymbolAssign@8..9 "="11 ASSIGN@8..9 "="14 Whitespace@9..10 "\n"12 WHITESPACE@9..10 "\n"15 Local@10..2513 LOCAL_KW@10..2516 KeywordLocal@10..15 "local"14 LOCAL_KW@10..15 "local"17 Whitespace@15..16 " "15 WHITESPACE@15..16 " "18 Ident@16..17 "b"16 IDENT@16..17 "b"19 Whitespace@17..18 " "17 WHITESPACE@17..18 " "20 SymbolAssign@18..19 "="18 ASSIGN@18..19 "="21 Whitespace@19..20 " "19 WHITESPACE@19..20 " "22 Literal@20..2120 EXPR_NUMBER@20..2123 Number@20..21 "3"21 NUMBER@20..21 "3"24 SymbolSemi@21..22 ";"22 SEMI@21..22 ";"25 Whitespace@22..23 "\n"23 WHITESPACE@22..23 "\n"26 BodyDef@23..2524 EXPR_NUMBER@23..2527 Literal@23..2525 NUMBER@23..24 "1"28 Number@23..24 "1"29 Whitespace@24..25 "\n"26 WHITESPACE@24..25 "\n"30 BodyDef@25..2531===27===32Missing { expected: Unnamed(SymbolSemi), offset: 24 }28Missing { expected: Unnamed(SEMI), offset: 24 }33Custom { error: "unusal local placement, missing ';' ?", range: 8..9 }34Missing { expected: Named("value"), offset: 24 }29Missing { expected: Named("value"), offset: 24 }35===30===36 [38;2;255;30;30m×[0m syntax error31 x syntax error37 ╭─[1:1]32 ,-[2:1]38 [2m1[0m │ local a =33 2 | local b = 3;39 · [38;2;246;87;248m ┬[0m40 · [38;2;246;87;248m╰── [38;2;246;87;248munusal local placement, missing ';' ?[0m[0m41 [2m2[0m │ local b = 3;42 [2m3[0m │ 134 3 | 143 · [38;2;30;201;212m ▲[0m35 : ^44 · [38;2;30;201;212m│[0m[38;2;145;246;111m╰── [38;2;145;246;111mmissing value[0m[0m36 : |`-- missing value45 · [38;2;30;201;212m╰── [38;2;30;201;212mmissing SymbolSemi[0m[0m37 : `-- missing SEMI46 ╰────38 `----47394840crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_no_value_recovery.snap.newdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__local_novalue.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "local a =\n"3expression: "local a =\n"56---4---7Root@0..105SOURCE_FILE@0..108 Local@0..106 LOCAL_KW@0..109 KeywordLocal@0..5 "local"7 LOCAL_KW@0..5 "local"10 Whitespace@5..6 " "8 WHITESPACE@5..6 " "11 Ident@6..7 "a"9 IDENT@6..7 "a"12 Whitespace@7..8 " "10 WHITESPACE@7..8 " "13 SymbolAssign@8..9 "="11 ASSIGN@8..9 "="14 Whitespace@9..10 "\n"12 WHITESPACE@9..10 "\n"15 BodyDef@10..1016===13===17Missing { expected: Named("value"), offset: 9 }14Missing { expected: Named("value"), offset: 9 }18Missing { expected: Unnamed(SymbolSemi), offset: 9 }15Missing { expected: Unnamed(SEMI), offset: 9 }19Missing { expected: Named("value"), offset: 9 }16Missing { expected: Named("value"), offset: 9 }20===17===21 [38;2;255;30;30m×[0m syntax error18 x syntax error22 ╭────19 ,----23 [2m1[0m │ local a =20 1 | local a =24 · [38;2;246;87;248m ▲[0m21 : ^25 · [38;2;145;246;111m╰── [38;2;145;246;111mmissing value[0m[0m22 : `-- missing value26 · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212mmissing SymbolSemi[0m[0m23 : |`-- missing SEMI27 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m24 : `-- missing value28 ╰────25 `----29263027crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__named_before_positional.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "a(1, 2, b=4, 3, 5, k = 12, 6)\n"3expression: "a(1, 2, b=4, 3, 5, k = 12, 6)\n"56---4---7Root@0..305SOURCE_FILE@0..308 FunctionCall@0..306 EXPR_APPLY@0..309 Ident@0..17 EXPR_VAR@0..110 Ident@0..1 "a"8 IDENT@0..1 "a"11 LParen@1..2 "("9 L_PAREN@1..2 "("12 DefPositionalArg@2..310 ARG@2..313 Literal@2..311 EXPR_NUMBER@2..314 Number@2..3 "1"12 NUMBER@2..3 "1"15 SymbolComma@3..4 ","13 COMMA@3..4 ","16 Whitespace@4..5 " "14 WHITESPACE@4..5 " "17 DefPositionalArg@5..615 ARG@5..618 Literal@5..616 EXPR_NUMBER@5..619 Number@5..6 "2"17 NUMBER@5..6 "2"20 SymbolComma@6..7 ","18 COMMA@6..7 ","21 Whitespace@7..8 " "19 WHITESPACE@7..8 " "22 DefNamedArg@8..1120 ARG@8..1123 Ident@8..9 "b"21 IDENT@8..9 "b"24 SymbolAssign@9..10 "="22 ASSIGN@9..10 "="25 Literal@10..1123 EXPR_NUMBER@10..1126 Number@10..11 "4"24 NUMBER@10..11 "4"27 SymbolComma@11..12 ","25 COMMA@11..12 ","28 Whitespace@12..13 " "26 WHITESPACE@12..13 " "29 ErrorPositionalAfterNamed@13..2827 ERROR@13..2830 DefPositionalArg@13..1428 ARG@13..1431 Literal@13..1429 EXPR_NUMBER@13..1432 Number@13..14 "3"30 NUMBER@13..14 "3"33 SymbolComma@14..15 ","31 COMMA@14..15 ","34 Whitespace@15..16 " "32 WHITESPACE@15..16 " "35 DefPositionalArg@16..1733 ARG@16..1736 Literal@16..1734 EXPR_NUMBER@16..1737 Number@16..17 "5"35 NUMBER@16..17 "5"38 SymbolComma@17..18 ","36 COMMA@17..18 ","39 Whitespace@18..19 " "37 WHITESPACE@18..19 " "40 DefNamedArg@19..2538 ARG@19..2541 Ident@19..20 "k"39 IDENT@19..20 "k"42 Whitespace@20..21 " "40 WHITESPACE@20..21 " "43 SymbolAssign@21..22 "="41 ASSIGN@21..22 "="44 Whitespace@22..23 " "42 WHITESPACE@22..23 " "45 Literal@23..2543 EXPR_NUMBER@23..2546 Number@23..25 "12"44 NUMBER@23..25 "12"47 SymbolComma@25..26 ","45 COMMA@25..26 ","48 Whitespace@26..27 " "46 WHITESPACE@26..27 " "49 DefPositionalArg@27..2847 ARG@27..2850 Literal@27..2848 EXPR_NUMBER@27..2851 Number@27..28 "6"49 NUMBER@27..28 "6"52 RParen@28..29 ")"50 R_PAREN@28..29 ")"53 Whitespace@29..30 "\n"51 WHITESPACE@29..30 "\n"54===52===55Custom { error: "positional arguments can't be placed after named", range: 13..28 }53Custom { error: "positional arguments can't be placed after named", range: 13..28 }56===54===57 [38;2;255;30;30m×[0m syntax error55 x syntax error58 ╭────56 ,----59 [2m1[0m │ a(1, 2, b=4, 3, 5, k = 12, 6)57 1 | a(1, 2, b=4, 3, 5, k = 12, 6)60 · [38;2;246;87;248m ───────┬───────[0m58 : ^^^^^^^|^^^^^^^61 · [38;2;246;87;248m╰── [38;2;246;87;248mpositional arguments can't be placed after named[0m[0m59 : `-- positional arguments can't be placed after named62 ╰────60 `----63616462crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "+ 2\n"3expression: "+ 2\n"56---4---7Root@0..45SOURCE_FILE@0..28 OpPlus@0..1 "+"6 PLUS@0..1 "+"9 Whitespace@1..2 " "7 WHITESPACE@1..2 " "10 Number@2..3 "2"11 Whitespace@3..4 "\n"12===8===13Missing { expected: Named("value"), offset: 0 }9Missing { expected: Named("value"), offset: 0 }14Custom { error: "unexpected input after expression", range: 0..3 }10Custom { error: "unexpected input after expression", range: 0..1 }15===11===16 [38;2;255;30;30m×[0m syntax error12 x syntax error17 ╭────13 ,----18 [2m1[0m │ + 214 1 | + 219 · [38;2;246;87;248m▲[0m[38;2;30;201;212m─┬─[0m15 : ^20 · [38;2;246;87;248m│[0m[38;2;30;201;212m╰── [38;2;30;201;212munexpected input after expression[0m[0m16 : |`-- unexpected input after expression21 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m17 : `-- missing value22 ╰────18 `----23192420crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_operator.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "2 2\n"3expression: "2 2\n"56---4---7Root@0..45SOURCE_FILE@0..38 Literal@0..26 EXPR_NUMBER@0..19 Number@0..1 "2"7 FLOAT@0..1 "2"10 Whitespace@1..2 " "8 WHITESPACE@1..2 " "11 Number@2..3 "2"9 ERROR@2..312 Whitespace@3..4 "\n"10 FLOAT@2..3 "2"13===11===14Custom { error: "unexpected input after expression", range: 2..3 }12Unexpected { expected: Unnamed(EOF), found: FLOAT, range: 2..3 }15===13===16 [38;2;255;30;30m×[0m syntax error14 x syntax error17 ╭────15 ,----18 [2m1[0m │ 2 216 1 | 2 219 · [38;2;246;87;248m ┬[0m17 : |20 · [38;2;246;87;248m╰── [38;2;246;87;248munexpected input after expression[0m[0m18 : `-- expected EOF, found FLOAT21 ╰────19 `----22202321crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_rhs.snapdiffbeforeafterboth1---1---2source: crates/jrsonnet-rowan-parser/src/lib.rs2source: crates/jrsonnet-rowan-parser/src/tests.rs3assertion_line: 884expression: "a +\n"3expression: "a +\n"56---4---7Root@0..45SOURCE_FILE@0..38 BinOp@0..46 EXPR_BINARY@0..39 Ident@0..27 LHS_EXPR@0..110 Ident@0..1 "a"8 EXPR_VAR@0..19 NAME@0..111 Whitespace@1..2 " "10 IDENT@0..1 "a"12 OpPlus@2..3 "+"11 WHITESPACE@1..2 " "13 Whitespace@3..4 "\n"12 PLUS@2..3 "+"14===13===15Missing { expected: Named("value"), offset: 3 }14Missing { expected: Named("value"), offset: 3 }16===15===17 [38;2;255;30;30m×[0m syntax error16 x syntax error18 ╭────17 ,----19 [2m1[0m │ a +18 1 | a +20 · [38;2;246;87;248m ▲[0m19 : ^21 · [38;2;246;87;248m╰── [38;2;246;87;248mmissing value[0m[0m20 : `-- missing value22 ╰────21 `----23222423crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__plain_call.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__stdlib.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_indent_text.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_newline.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__str_block_missing_termination.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snapdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap.newdiffbeforeafterbothno changes
crates/jrsonnet-rowan-parser/src/string_block.rsdiffbeforeafterboth1#[derive(Clone, Copy, Debug, PartialEq, Eq)]1#[derive(Clone, Copy, Debug, PartialEq, Eq)]2pub enum StringBlockToken {2pub enum StringBlockError {3 Valid,3 UnexpectedEnd,4 UnexpectedEndOfString,4 MissingNewLine,5 MissingTextBlockNewLine,5 MissingTermination,6 MissingTextBlockTermination,6 MissingIndent,7 MissingTextBlockIndent,8}7}9810use std::ops::Range;9use std::ops::Range;111011use logos::Lexer;12use StringBlockToken::*;12use StringBlockError::*;131314use crate::SyntaxKind;14use crate::SyntaxKind;151516pub fn lex_str_block_test<'a>(lex: &mut logos::Lexer<'a, SyntaxKind>) {16pub fn lex_str_block_test(lex: &mut Lexer<SyntaxKind>) {17 lex_str_block(lex);17 let _ = lex_str_block(lex);18}18}191920fn lex_str_block<'a>(lex: &mut logos::Lexer<'a, SyntaxKind>) -> StringBlockToken {20pub fn lex_str_block(lex: &mut Lexer<SyntaxKind>) -> Result<(), StringBlockError> {21 struct Context<'a> {21 struct Context<'a> {22 source: &'a str,22 source: &'a str,23 index: usize,23 index: usize,116 a.len()116 a.len()117 }117 }118118119 fn guess_token_end_and_bump<'a>(lex: &mut logos::Lexer<'a, SyntaxKind>, ctx: &Context<'a>) {119 fn guess_token_end_and_bump<'a>(lex: &mut Lexer<'a, SyntaxKind>, ctx: &Context<'a>) {120 let end_index = ctx120 let end_index = ctx121 .rest()121 .rest()122 .find("|||")122 .find("|||")140 Some('\n') => (),140 Some('\n') => (),141 None => {141 None => {142 guess_token_end_and_bump(lex, &ctx);142 guess_token_end_and_bump(lex, &ctx);143 return UnexpectedEndOfString;143 return Err(UnexpectedEnd);144 }144 }145 // Text block requires new line after |||.145 // Text block requires new line after |||.146 Some(_) => {146 Some(_) => {147 guess_token_end_and_bump(lex, &ctx);147 guess_token_end_and_bump(lex, &ctx);148 return MissingTextBlockNewLine;148 return Err(MissingNewLine);149 }149 }150 }150 }151151160 if num_whitespace == 0 {160 if num_whitespace == 0 {161 // Text block's first line must start with whitespace161 // Text block's first line must start with whitespace162 guess_token_end_and_bump(lex, &ctx);162 guess_token_end_and_bump(lex, &ctx);163 return MissingTextBlockIndent;163 return Err(MissingIndent);164 }164 }165165166 loop {166 loop {171 match ctx.next() {171 match ctx.next() {172 None => {172 None => {173 guess_token_end_and_bump(lex, &ctx);173 guess_token_end_and_bump(lex, &ctx);174 return UnexpectedEndOfString;174 return Err(UnexpectedEnd);175 }175 }176 Some('\n') => break,176 Some('\n') => break,177 Some(_) => (),177 Some(_) => (),188 if num_whitespace == 0 {188 if num_whitespace == 0 {189 // End of the text block189 // End of the text block190 let mut term_indent = String::with_capacity(num_whitespace);190 let mut term_indent = String::with_capacity(num_whitespace);191 loop {192 match ctx.peek() {191 while let Some(' ' | '\t') = ctx.peek() {193 Some(' ') | Some('\t') => {194 term_indent.push(ctx.next().unwrap());192 term_indent.push(ctx.next().unwrap());195 }196 _ => break,197 }193 }198 }199194200 if !ctx.rest().starts_with("|||") {195 if !ctx.rest().starts_with("|||") {201 // Text block not terminated with |||196 // Text block not terminated with |||202 let pos = ctx.pos();197 let pos = ctx.pos();203 if pos.len() == 0 {198 if pos.is_empty() {204 // eof199 // eof205 lex.bump(ctx.index);200 lex.bump(ctx.index);206 return UnexpectedEndOfString;201 return Err(UnexpectedEnd);207 }202 }208203209 guess_token_end_and_bump(lex, &ctx);204 guess_token_end_and_bump(lex, &ctx);210 return MissingTextBlockTermination;205 return Err(MissingTermination);211 }206 }212207213 // Skip '|||'208 // Skip '|||'217 }212 }218213219 lex.bump(ctx.index);214 lex.bump(ctx.index);220 Valid215 Ok(())221}216}222217crates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth1#![cfg(test)]1#![cfg(test)]223use miette::{Diagnostic, GraphicalReportHandler, LabeledSpan};3use miette::{4 Diagnostic, GraphicalReportHandler, GraphicalTheme, LabeledSpan, ThemeCharacters, ThemeStyles,5};4use thiserror::Error;6use thiserror::Error;576use crate::parser::parse;8use crate::{parse, AstNode};798#[derive(Debug, Error)]10#[derive(Debug, Error)]9#[error("syntax error")]11#[error("syntax error")]44fn process(text: &str) -> String {46fn process(text: &str) -> String {45 use std::fmt::Write;47 use std::fmt::Write;46 let mut out = String::new();48 let mut out = String::new();47 let node = parse(text);49 let (node, errors) = parse(text);48 write!(out, "{:#?}", node.syntax()).unwrap();50 write!(out, "{:#?}", node.syntax()).unwrap();49 if !node.errors.is_empty() && !text.is_empty() {51 if !errors.is_empty() && !text.is_empty() {50 writeln!(out, "===").unwrap();52 writeln!(out, "===").unwrap();51 for err in &node.errors {53 for err in &errors {52 writeln!(out, "{:?}", err).unwrap();54 writeln!(out, "{:?}", err).unwrap();53 }55 }54 let diag = MyDiagnostic {56 let diag = MyDiagnostic {55 code: text.to_string(),57 code: text.to_string(),56 spans: node.errors.into_iter().map(|e| e.into()).collect(),58 spans: errors.into_iter().map(|e| e.into()).collect(),57 };59 };586059 let handler = GraphicalReportHandler::new();61 let handler = GraphicalReportHandler::new_themed(GraphicalTheme {62 characters: ThemeCharacters::ascii(),63 styles: ThemeStyles::none(),64 });606561 write!(out, "===").unwrap();66 write!(out, "===").unwrap();62 handler.render_report(&mut out, &diag).unwrap();67 handler.render_report(&mut out, &diag).unwrap();76 }81 }77mk_test!(82mk_test!(78 empty => r#" "#83 empty => r#" "#79 function => r#"84 function => r#"80 function(a, b = 1) a + b85 function(a, b = 1) a + b81 "#86 "#82 function_error_no_value => r#"87 function_error_no_value => r#"83 function(a, b = ) a + b88 function(a, b = ) a + b84 "#89 "#85 function_error_rparen => r#"90 function_error_rparen => r#"86 function(a, b91 function(a, b87 "#92 "#88 function_error_body => r#"93 function_error_body => r#"89 function(a, b)94 function(a, b)90 "#95 "#91 local_novalue => r#"96 local_novalue => r#"92 local a =97 local a =93 "#98 "#94 local_no_value_recovery => r#"99 local_no_value_recovery => r#"95 local a =100 local a =96 local b = 3;101 local b = 3;97 1102 198 "#103 "#99104100 array_comp => r#"105 array_comp => r#"101 [a for a in [1, 2, 3]]106 [a for a in [1, 2, 3]]102 "#107 "#103 array_comp_incompatible_with_multiple_elems => r#"108 array_comp_incompatible_with_multiple_elems => r#"104 [a for a in [1, 2, 3], b]109 [a for a in [1, 2, 3], b]105 "#110 "#106111107 no_rhs => r#"112 no_rhs => r#"108 a +113 a +109 "#114 "#110 no_lhs => r#"115 no_lhs => r#"111 + 2116 + 2112 "#117 "#113 no_operator => "118 no_operator => "114 2 2119 2 2115 "120 "116121117 named_before_positional => "122 named_before_positional => "118 a(1, 2, b=4, 3, 5, k = 12, 6)123 a(1, 2, b=4, 3, 5, k = 12, 6)119 "124 "120125121 wrong_field_end => "126 wrong_field_end => "122 {127 {123 a: 1;128 a: 1;124 b: 2;129 b: 2;125 }130 }126 "131 "132133134 plain_call => "135 std.substr(a, 0, std.length(b)) == b136 "137138 destruct => "139 local [a, b, c] = arr;140 local [a, ...] = arr_rest;141 local [..., a] = rest_arr;142 local [...] = rest_in_arr;143 local [a, ...n] = arr_rest_n;144 local [...n, a] = rest_arr_n;145 local [...n] = rest_in_arr_n;146147 local {a, b, c} = obj;148 local {a, b, c, ...} = obj_rest;149 local {a, b, c, ...n} = obj_rest_n;150151 null152 "153154 str_block_missing_indent => "155 |||156 "157 str_block_missing_termination => "158 |||159 hello160 "161 str_block_missing_newline => "162 |||hello163 "164 str_block_missing_indent_text => "165 |||166 hello167 "127);168);169170#[test]171fn stdlib() {172 let src = jrsonnet_stdlib::STDLIB_STR;173 let result = process(src);174 insta::assert_snapshot!("stdlib", result, src);175}128176crates/jrsonnet-rowan-parser/src/token_set.rsdiffbeforeafterboth1use crate::SyntaxKind;1use crate::SyntaxKind;223#[derive(Clone, Copy, Default)]3#[derive(Clone, Copy, Default)]4pub struct SyntaxKindSet(u64);4pub struct SyntaxKindSet(u128);556impl SyntaxKindSet {6impl SyntaxKindSet {7 #[allow(dead_code)]7 pub const EMPTY: Self = Self(0);8 pub const EMPTY: Self = Self(0);8 pub const ALL: Self = Self(u64::MAX);9 pub const ALL: Self = Self(u128::MAX);91010 pub const fn new(kinds: &[SyntaxKind]) -> SyntaxKindSet {11 pub const fn new(kinds: &[SyntaxKind]) -> SyntaxKindSet {11 let mut res = 0u64;12 let mut res = 0u128;12 let mut i = 0;13 let mut i = 0;13 while i < kinds.len() {14 while i < kinds.len() {14 res |= mask(kinds[i]);15 res |= mask(kinds[i]);26 }27 }27}28}282929const fn mask(kind: SyntaxKind) -> u64 {30const fn mask(kind: SyntaxKind) -> u128 {30 1u64 << (kind as usize)31 1u128 << (kind as u128)31}32}323333#[macro_export]34#[macro_export]41 };42 };42}43}4445#[test]46fn sanity() {47 assert!(48 (SyntaxKind::ERROR as u32) < 127,49 "can't keep KindSet as bitset"50 );51}4352xtask/Cargo.tomldiffbeforeafterboth556[dependencies]6[dependencies]7anyhow = "1.0.57"7anyhow = "1.0.57"8indexmap = "1.9.0"8itertools = "0.10.3"9itertools = "0.10.3"9proc-macro2 = "1.0.39"10proc-macro2 = "1.0.39"10quote = "1.0.18"11quote = "1.0.18"xtask/src/sourcegen/ast.rsdiffbeforeafterboth1use std::collections::{BTreeSet, HashMap};21use proc_macro2::TokenStream;3use proc_macro2::TokenStream;2use quote::{format_ident, quote};4use quote::format_ident;5use ungrammar::{Grammar, Rule};364use super::{escape_token_macro, KindsSrc};7use super::{8 util::{pluralize, to_lower_snake_case},9 KindsSrc,10};5116impl AstNodeSrc {12impl AstNodeSrc {14#[allow(dead_code)]20#[allow(dead_code)]15#[derive(Default, Debug)]21#[derive(Default, Debug)]16pub struct AstSrc {22pub struct AstSrc {17 pub tokens: Vec<String>,23 pub nodes: Vec<AstNodeSrc>,18 pub nodes: Vec<AstNodeSrc>,24 pub enums: Vec<AstEnumSrc>,19 pub enums: Vec<AstEnumSrc>,25 pub token_enums: Vec<AstTokenEnumSrc>,20}26}21#[derive(Debug)]27#[derive(Debug)]22pub struct AstNodeSrc {28pub struct AstNodeSrc {384439#[derive(Debug, Eq, PartialEq)]45#[derive(Debug, Eq, PartialEq)]40pub enum Cardinality {46pub enum Cardinality {47 /// This field may not exist in code41 Optional,48 Optional,49 /// This field should exist in correctly parsed code50 Required,51 /// There may be multiple field values of this kind42 Many,52 Many,43}53}445450 pub variants: Vec<String>,60 pub variants: Vec<String>,51}61}6263#[derive(Debug, Clone)]64pub struct AstTokenEnumSrc {65 pub doc: Vec<String>,66 pub name: String,67 pub variants: Vec<String>,68}526953impl Field {70impl Field {54 pub fn is_many(&self) -> bool {71 pub fn is_many(&self) -> bool {61 )78 )62 }79 }8081 pub fn token_name(&self) -> Option<String> {82 match self {83 Field::Token(token) => Some(token.clone()),84 _ => None,85 }86 }63 pub fn token_kind(&self) -> Option<TokenStream> {87 pub fn token_kind(&self, kinds: &KindsSrc) -> Option<TokenStream> {64 match self {88 match self {65 Field::Token(token) => {89 Field::Token(token) => Some(kinds.token(token).expect("token exists").reference()),66 let token: TokenStream = escape_token_macro(token);67 Some(quote! { T![#token] })68 }69 _ => None,90 _ => None,70 }91 }71 }92 }93 pub fn is_token_enum(&self, grammar: &AstSrc) -> bool {94 match self {95 Field::Node { ty, .. } => grammar.token_enums.iter().any(|e| &e.name == ty),96 _ => false,97 }98 }729973 pub fn method_name(&self, kinds: &KindsSrc) -> proc_macro2::Ident {100 pub fn method_name(&self, kinds: &KindsSrc) -> proc_macro2::Ident {74 match self {101 match self {75 Field::Token(name) => {102 Field::Token(name) => kinds.token(name).expect("token exists").method_name(),76 if let Some(punct_name) = kinds.get_punct_name(name) {77 format_ident!("{}_token", punct_name.to_lowercase())78 } else {79 format_ident!("{}_token", name.to_lowercase())80 }81 }82 Field::Node { name, .. } => {103 Field::Node { name, .. } => {83 format_ident!("{}", name)104 format_ident!("{}", name)84 }105 }92 }113 }93}114}115116pub fn lower(kinds: &KindsSrc, grammar: &Grammar) -> AstSrc {117 let mut res = AstSrc {118 // tokens,119 ..Default::default()120 };121122 let nodes = grammar.iter().collect::<Vec<_>>();123124 for &node in &nodes {125 let name = grammar[node].name.clone();126 let rule = &grammar[node].rule;127 match lower_enum(grammar, rule) {128 Some(variants) => {129 let enum_src = AstEnumSrc {130 doc: Vec::new(),131 name,132 traits: Vec::new(),133 variants,134 };135 res.enums.push(enum_src);136 }137 None => match lower_token_enum(grammar, rule) {138 Some(variants) => {139 let tokens_enum_src = AstTokenEnumSrc {140 doc: Vec::new(),141 name,142 variants,143 };144 res.token_enums.push(tokens_enum_src);145 }146 None => {147 let mut fields = Vec::new();148 lower_rule(&mut fields, grammar, None, rule, false);149 let mut types = HashMap::new();150 for field in fields.iter().filter(|f| f.token_name().is_none()) {151 if let Some(old) = types.insert(field.ty(), field.method_name(kinds)) {152 panic!("{name}.{} has same type as {name}.{}, resolve conflict by wrapping one field: {}", old, field.method_name(kinds), field.ty());153 }154 }155 res.nodes.push(AstNodeSrc {156 doc: Vec::new(),157 name,158 traits: Vec::new(),159 fields,160 });161 }162 },163 }164 }165166 deduplicate_fields(&mut res);167 extract_struct_traits(kinds, &mut res);168 extract_enum_traits(&mut res);169 res170}171172fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {173 let alternatives = match rule {174 Rule::Alt(it) => it,175 _ => return None,176 };177 let mut variants = Vec::new();178 for alternative in alternatives {179 match alternative {180 Rule::Node(it) => variants.push(grammar[*it].name.clone()),181 Rule::Token(it) if grammar[*it].name == ";" => (),182 _ => return None,183 }184 }185 Some(variants)186}187fn lower_token_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {188 let alternatives = match rule {189 Rule::Alt(it) => it,190 _ => return None,191 };192 let mut variants = Vec::new();193 for alternative in alternatives {194 match alternative {195 Rule::Token(it) => variants.push(grammar[*it].name.clone()),196 _ => return None,197 }198 }199 Some(variants)200}201202fn lower_rule(203 acc: &mut Vec<Field>,204 grammar: &Grammar,205 label: Option<&String>,206 rule: &Rule,207 in_optional: bool,208) {209 if lower_comma_list(acc, grammar, label, rule) {210 return;211 }212213 match rule {214 Rule::Node(node) => {215 let ty = grammar[*node].name.clone();216 let name = label.cloned().unwrap_or_else(|| to_lower_snake_case(&ty));217 let field = Field::Node {218 name,219 ty,220 cardinality: if in_optional {221 Cardinality::Optional222 } else {223 Cardinality::Required224 },225 };226 acc.push(field);227 }228 Rule::Token(token) => {229 assert!(label.is_none(), "uexpected label: {:?}", label);230 let name = grammar[*token].name.clone();231 let field = Field::Token(name);232 acc.push(field);233 }234 Rule::Rep(inner) => {235 if let Rule::Node(node) = &**inner {236 let ty = grammar[*node].name.clone();237 let name = label238 .cloned()239 .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));240 let field = Field::Node {241 name,242 ty,243 cardinality: Cardinality::Many,244 };245 acc.push(field);246 return;247 }248 todo!("unsupported repitition: {:?}", rule)249 }250 Rule::Labeled { label: l, rule } => {251 assert!(label.is_none());252 lower_rule(acc, grammar, Some(l), rule, in_optional);253 }254 Rule::Seq(rules) | Rule::Alt(rules) => {255 for rule in rules {256 lower_rule(acc, grammar, label, rule, in_optional)257 }258 }259 Rule::Opt(rule) => lower_rule(acc, grammar, label, rule, true),260 }261}262263// (T (',' T)* ','?)264fn lower_comma_list(265 acc: &mut Vec<Field>,266 grammar: &Grammar,267 label: Option<&String>,268 rule: &Rule,269) -> bool {270 let rule = match rule {271 Rule::Seq(it) => it,272 _ => return false,273 };274 let (node, repeat, trailing_comma) = match rule.as_slice() {275 [Rule::Node(node), Rule::Rep(repeat), Rule::Opt(trailing_comma)] => {276 (node, repeat, trailing_comma)277 }278 _ => return false,279 };280 let repeat = match &**repeat {281 Rule::Seq(it) => it,282 _ => return false,283 };284 match repeat.as_slice() {285 [comma, Rule::Node(n)] if comma == &**trailing_comma && n == node => (),286 _ => return false,287 }288 let ty = grammar[*node].name.clone();289 let name = label290 .cloned()291 .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));292 let field = Field::Node {293 name,294 ty,295 cardinality: Cardinality::Many,296 };297 acc.push(field);298 true299}300301fn deduplicate_fields(ast: &mut AstSrc) {302 for node in &mut ast.nodes {303 let mut i = 0;304 'outer: while i < node.fields.len() {305 for j in 0..i {306 let f1 = &node.fields[i];307 let f2 = &node.fields[j];308 if f1 == f2 {309 node.fields.remove(i);310 continue 'outer;311 }312 }313 i += 1;314 }315 }316}317318fn extract_struct_traits(kinds: &KindsSrc, ast: &mut AstSrc) {319 // TODO: add common accessor traits here.320 let traits: &[(&str, &[&str])] = &[];321322 for node in &mut ast.nodes {323 for (name, methods) in traits {324 extract_struct_trait(kinds, node, name, methods);325 }326 }327}328329fn extract_struct_trait(330 kinds: &KindsSrc,331 node: &mut AstNodeSrc,332 trait_name: &str,333 methods: &[&str],334) {335 let mut to_remove = Vec::new();336 for (i, field) in node.fields.iter().enumerate() {337 let method_name = field.method_name(kinds).to_string();338 if methods.iter().any(|&it| it == method_name) {339 to_remove.push(i);340 }341 }342 if to_remove.len() == methods.len() {343 node.traits.push(trait_name.to_string());344 node.remove_field(to_remove);345 }346}347348fn extract_enum_traits(ast: &mut AstSrc) {349 let enums = ast.enums.clone();350 for enm in &mut ast.enums {351 let nodes = &ast.nodes;352353 let mut variant_traits = enm.variants.iter().map(|var| {354 nodes355 .iter()356 .find_map(|node| {357 if &node.name != var {358 return None;359 }360 Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())361 })362 .unwrap_or_else(|| {363 enums364 .iter()365 .find_map(|node| {366 if &node.name != var {367 return None;368 }369 Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())370 })371 .unwrap_or_else(|| {372 panic!("could not find struct {var} for enum {}::{var}", enm.name)373 })374 })375 });376377 let mut enum_traits = match variant_traits.next() {378 Some(it) => it,379 None => continue,380 };381 for traits in variant_traits {382 enum_traits = enum_traits.intersection(&traits).cloned().collect();383 }384 enm.traits = enum_traits.into_iter().collect();385 }386}94387xtask/src/sourcegen/kinds.rsdiffbeforeafterbothno changes
xtask/src/sourcegen/mod.rsdiffbeforeafterboth1use std::{1use std::path::PathBuf;2 collections::{BTreeSet, HashSet},3 path::PathBuf,4};526use anyhow::Result;3use anyhow::Result;7use ast::{AstEnumSrc, AstNodeSrc, AstSrc, Cardinality, Field};4use ast::{lower, AstSrc};8use itertools::Itertools;5use itertools::Itertools;6use kinds::{KindsSrc, TokenKind};9use proc_macro2::{Punct, Spacing, TokenStream};7use proc_macro2::{Punct, Spacing, TokenStream};10use quote::{format_ident, quote};8use quote::{format_ident, quote};11use ungrammar::{Grammar, Rule};9use ungrammar::Grammar;12use util::{10use util::{ensure_file_contents, reformat, to_pascal_case, to_upper_snake_case};13 ensure_file_contents, pluralize, reformat, to_lower_snake_case, to_pascal_case,14 to_upper_snake_case,15};161117mod ast;12mod ast;13mod kinds;18mod util;14mod util;191516enum SpecialName {17 Literal,18 Meta,19 Error,20}21fn classify_special(name: &str) -> Option<(SpecialName, &str)> {22 let name = name.strip_suffix('!')?;23 Some(if let Some(name) = name.strip_prefix("LIT_") {24 (SpecialName::Literal, name)25 } else if let Some(name) = name.strip_prefix("META_") {26 (SpecialName::Meta, name)27 } else if let Some(name) = name.strip_prefix("ERROR_") {28 (SpecialName::Error, name)29 } else {30 return None;31 })32}3320pub fn generate_ungrammar() -> Result<()> {34pub fn generate_ungrammar() -> Result<()> {21 let grammar: Grammar = include_str!(concat!(35 let grammar: Grammar = include_str!(concat!(22 env!("CARGO_MANIFEST_DIR"),36 env!("CARGO_MANIFEST_DIR"),23 "/../crates/jrsonnet-rowan-parser/jsonnet.ungram"37 "/../crates/jrsonnet-rowan-parser/jsonnet.ungram"24 ))38 ))25 .parse()?;39 .parse()?;264027 let mut kinds: KindsSrc = KindsSrc {41 let mut kinds = kinds::jsonnet_kinds();28 punct: puncts![29 "||" => "OR";30 "&&" => "AND";31 "|" => "BIT_OR";32 "^" => "BIT_XOR";33 "&" => "BIT_AND";34 "==" => "EQ";35 "!=" => "NE";36 "<" => "LT";37 ">" => "GT";38 "<=" => "LE";39 ">=" => "GE";40 "<<" => "LHS";41 ">>" => "RHS";42 "+" => "PLUS";43 "-" => "MINUS";44 "*" => "MUL";45 "/" => "DIV";46 "%" => "MODULO";47 "!" => "NOT";48 "~" => "BIT_NOT";49 "[" => "L_BRACK";50 "]" => "R_BRACK";51 "(" => "L_PAREN";52 ")" => "R_PAREN";53 "{" => "L_BRACE";54 "}" => "R_BRACE";55 ":" => "COLON";56 "::" => "COLONCOLON";57 ":::" => "COLONCOLONCOLON";58 ";" => "SEMI";59 "." => "DOT";60 "..." => "DOTDOTDOT";61 "," => "COMMA";62 "$" => "DOLLAR";63 "=" => "ASSIGN";64 "?" => "QUESTION_MARK";65 "$intrinsicThisFile" => "INTRINSIC_THIS_FILE";66 "$intrinsicId" => "INTRINSIC_ID";67 "$intrinsic" => "INTRINSIC";68 ],69 keywords: vec![],70 literals: literals![71 "NUMBER" => r"(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?";72 "STRING_DOUBLE" => "\"(?s:[^\"\\\\]|\\\\.)*\"";73 "STRING_SINGLE" => "'(?s:[^'\\\\]|\\\\.)*'";74 "STRING_DOUBLE_VERBATIM" => "@\"(?:[^\"]|\"\")*\"";75 "STRING_SINGLE_VERBATIM" => "@'(?:[^']|'')*'";76 "STRING_BLOCK" => r"\|\|\|";7778 "IDENT" => r"[_a-zA-Z][_a-zA-Z0-9]*";79 "WHITESPACE" => r"[ \t\n\r]+";80 "SINGLE_LINE_SLASH_COMMENT" => r"//[^\r\n]*(\r\n|\n)?";81 "SINGLE_LINE_HASH_COMMENT" => r"#[^\r\n]*(\r\n|\n)?";82 "MULTI_LINE_COMMENT" => r"/\*([^*]|\*[^/])*\*/";83 ],84 nodes: vec![],85 };8687 let ast = lower(&kinds, &grammar);42 let ast = lower(&kinds, &grammar);884344 for token in grammar.tokens() {45 let token = &grammar[token];46 let token = &token.name.clone();47 if !kinds.is_token(token) {48 if let Some((special, name)) = classify_special(token) {49 match special {50 SpecialName::Literal => panic!("literal is not defined: {name}"),51 SpecialName::Meta => kinds.define_token(TokenKind::Meta {52 grammar_name: token.to_owned(),53 name: format!("META_{}", name),54 }),55 SpecialName::Error => kinds.define_token(TokenKind::Error {56 grammar_name: token.to_owned(),57 name: format!("ERROR_{}", name),58 regex: None,59 priority: None,60 }),61 };62 continue;63 };64 let name = to_upper_snake_case(token);65 kinds.define_token(TokenKind::Keyword {66 code: token.to_owned(),67 name: format!("{name}_KW"),68 });69 }70 }89 for node in &ast.nodes {71 for node in &ast.nodes {90 let name = to_upper_snake_case(&node.name);72 let name = to_upper_snake_case(&node.name);91 if !kinds.is_literal(&name) {73 kinds.define_node(&name);92 kinds.nodes.push(name);93 }94 }74 }95 for enum_ in &ast.enums {75 for enum_ in &ast.enums {96 let name = to_upper_snake_case(&enum_.name);76 let name = to_upper_snake_case(&enum_.name);97 if !kinds.is_literal(&name) {77 kinds.define_node(&name);98 kinds.nodes.push(name);99 }100 }78 }101 for token in grammar.tokens() {79 for token_enum in &ast.token_enums {102 let token = &grammar[token];80 let name = to_upper_snake_case(&token_enum.name);103 let token = &token.name.clone();104 let name = to_upper_snake_case(token);81 kinds.define_node(&name);105 if !kinds.is_punct(token) && !kinds.is_literal(&name) {106 kinds.keywords.push(token.to_owned());107 }108 }82 }10983110 let syntax_kinds = generate_syntax_kinds(&kinds)?;84 let syntax_kinds = generate_syntax_kinds(&kinds, &ast)?;11185112 let tokens = generate_tokens(&ast)?;113114 let nodes = generate_nodes(&kinds, &ast)?;86 let nodes = generate_nodes(&kinds, &ast)?;115 ensure_file_contents(87 ensure_file_contents(116 &PathBuf::from(concat!(88 &PathBuf::from(concat!(122 ensure_file_contents(94 ensure_file_contents(123 &PathBuf::from(concat!(95 &PathBuf::from(concat!(124 env!("CARGO_MANIFEST_DIR"),96 env!("CARGO_MANIFEST_DIR"),125 "/../crates/jrsonnet-rowan-parser/src/generated/tokens.rs",126 )),127 &tokens,128 )?;129 ensure_file_contents(130 &PathBuf::from(concat!(131 env!("CARGO_MANIFEST_DIR"),132 "/../crates/jrsonnet-rowan-parser/src/generated/nodes.rs",97 "/../crates/jrsonnet-rowan-parser/src/generated/nodes.rs",133 )),98 )),134 &nodes,99 &nodes,135 )?;100 )?;136 Ok(())101 Ok(())137}102}138103139fn generate_tokens(grammar: &AstSrc) -> Result<String> {104fn generate_syntax_kinds(kinds: &KindsSrc, grammar: &AstSrc) -> Result<String> {140 let tokens = grammar.tokens.iter().map(|token| {105 let t_macros = kinds.tokens().filter_map(TokenKind::expand_t_macros);141 let name = format_ident!("{}", token);142 let kind = format_ident!("{}", to_upper_snake_case(token));106 let token_kinds = kinds.tokens().map(TokenKind::expand_kind);143 quote! {144 #[derive(Debug, Clone, PartialEq, Eq, Hash)]145 pub struct #name {146 pub(crate) syntax: SyntaxToken,147 }148 impl std::fmt::Display for #name {149 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {150 std::fmt::Display::fmt(&self.syntax, f)151 }152 }153 impl AstToken for #name {154 fn can_cast(kind: SyntaxKind) -> bool { kind == #kind }155 fn cast(syntax: SyntaxToken) -> Option<Self> {156 if Self::can_cast(syntax.kind()) { Some(Self { syntax }) } else { None }157 }158 fn syntax(&self) -> &SyntaxToken { &self.syntax }159 }160 }161 });162107163 Ok(reformat(108 let keywords = kinds164 "e! {109 .tokens()165 use crate::{SyntaxKind::{self, *}, SyntaxToken, ast::AstToken};110 .filter(|k| matches!(k, TokenKind::Keyword { .. }))166 #(#tokens)*167 }111 .map(TokenKind::name)168 .to_string(),169 )?112 .map(|n| format_ident!("{n}"));170 .replace("#[derive", "\n#[derive"))171}172113173fn generate_syntax_kinds(grammar: &KindsSrc) -> Result<String> {174 let (single_byte_tokens_values, single_byte_tokens): (Vec<_>, Vec<_>) = grammar175 .punct176 .iter()177 .filter(|(token, _name)| token.len() == 1)178 .map(|(token, name)| (token.chars().next().unwrap(), format_ident!("{}", name)))179 .unzip();180181 let punctuation_values = grammar182 .punct183 .iter()184 .map(|(token, _name)| escape_token_macro(token));185 let punctuation = grammar186 .punct187 .iter()188 .map(|(_token, name)| format_ident!("{}", name))189 .collect::<Vec<_>>();190 let punctuation_enum = grammar191 .punct192 .iter()193 .map(|(token, name)| {194 let id = format_ident!("{}", name);195 quote! {196 #[token(#token)]197 #id198 }199 })200 .collect::<Vec<_>>();201202 let x = |name: &str| format_ident!("{}_KW", to_upper_snake_case(name));203 let full_keywords_values = &grammar.keywords;204 let full_keywords = full_keywords_values.iter().map(|s| x(s.as_str()));205206 let all_keywords_values = grammar.keywords.to_vec();207 let all_keywords_idents = all_keywords_values.iter().map(|kw| format_ident!("{}", kw));208 let all_keywords = all_keywords_values209 .iter()210 .map(|s| x(&**s))211 .collect::<Vec<_>>();212 let all_keywords_enum = all_keywords_values213 .iter()214 .map(|s| {215 let id = x(&**s);216 quote! {217 #[token(#s)]218 #id219 }220 })221 .collect::<Vec<_>>();222223 let tokens_enum = grammar224 .literals225 .iter()226 .map(|l| {227 let regex = &l.regex;228 let id = format_ident!("{}", l.name);229 let lexer = l230 .lexer231 .as_ref()232 .map(|l| {233 let id: TokenStream = l.parse().expect("path");234 quote! {235 , #id236 }237 })238 .unwrap_or_else(|| quote! {});239 quote! {240 #[regex(#regex #lexer)]241 #id242 }243 })244 .collect::<Vec<_>>();245246 let nodes = grammar114 let nodes = kinds247 .nodes115 .nodes248 .iter()116 .iter()249 .map(|name| format_ident!("{}", name))117 .map(|name| format_ident!("{}", name))250 .collect::<Vec<_>>();118 .collect::<Vec<_>>();251119120 let enums = grammar121 .enums122 .iter()123 .map(|e| format_ident!("{}", to_upper_snake_case(&e.name)))124 .chain(125 grammar126 .token_enums127 .iter()128 .map(|e| format_ident!("{}", to_upper_snake_case(&e.name))),129 );130252 let ast = quote! {131 let ast = quote! {253 #![allow(bad_style, missing_docs, unreachable_pub)]132 #![allow(bad_style, missing_docs, unreachable_pub, clippy::manual_non_exhaustive, clippy::match_like_matches_macro)]254 use logos::Logos;133 use logos::Logos;255134256 /// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`.135 /// The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`.261 TOMBSTONE,140 TOMBSTONE,262 #[doc(hidden)]141 #[doc(hidden)]263 EOF,142 EOF,264 #(#punctuation_enum,)*143 #(#token_kinds,)*265 #(#all_keywords_enum,)*266 #(#tokens_enum,)*267 #[error]144 #[error]268 ERROR,145 ERROR,269 #(#nodes,)*146 #(#nodes,)*275 impl SyntaxKind {152 impl SyntaxKind {276 pub fn is_keyword(self) -> bool {153 pub fn is_keyword(self) -> bool {277 match self {154 match self {278 #(#all_keywords)|* => true,155 #(#keywords)|* => true,279 _ => false,156 _ => false,280 }157 }281 }158 }282283 pub fn is_punct(self) -> bool {159 pub fn is_enum(self) -> bool {284 match self {160 match self {285 #(#punctuation)|* => true,161 #(#enums)|* => true,286 _ => false,162 _ => false,287 }163 }288 }164 }289165290 pub fn from_keyword(ident: &str) -> Option<SyntaxKind> {291 let kw = match ident {292 #(#full_keywords_values => #full_keywords,)*293 _ => return None,294 };295 Some(kw)296 }297298 pub fn from_char(c: char) -> Option<SyntaxKind> {299 let tok = match c {300 #(#single_byte_tokens_values => #single_byte_tokens,)*301 _ => return None,302 };303 Some(tok)304 }305306 pub fn from_raw(r: u16) -> Self {166 pub fn from_raw(r: u16) -> Self {307 assert!(r < Self::__LAST as u16);167 assert!(r < Self::__LAST as u16);308 unsafe { std::mem::transmute(r) }168 unsafe { std::mem::transmute(r) }313 }173 }314174315 #[macro_export]175 #[macro_export]316 macro_rules! T {176 macro_rules! T {#(#t_macros);*}317 #([#punctuation_values] => { $crate::SyntaxKind::#punctuation };)*318 #([#all_keywords_idents] => { $crate::SyntaxKind::#all_keywords };)*319 [lifetime_ident] => { $crate::SyntaxKind::LIFETIME_IDENT };320 [ident] => { $crate::SyntaxKind::IDENT };321 [shebang] => { $crate::SyntaxKind::SHEBANG };322 }323 pub use T;177 pub use T;324 };178 };325179326 reformat(&ast.to_string())180 reformat(&ast.to_string())327}181}328182329pub struct KindsSrc {330 pub punct: Vec<(String, String)>,331 pub keywords: Vec<String>,332 pub literals: Vec<LiteralKind>,333 pub nodes: Vec<String>,334}335336pub struct LiteralKind {337 name: String,338 regex: String,339 lexer: Option<String>,340}341342#[macro_export]343macro_rules! literals {344 ($($name:expr => $regex:expr $(, $lexer:expr)?);* $(;)?) => {345 vec![346 $(LiteralKind {347 name: $name.to_owned(),348 regex: $regex.to_owned(),349 lexer: None $(.or_else(|| Some($lexer.to_string())))?,350 }),*351 ]352 };353}354355#[macro_export]356macro_rules! puncts {357 ($($tok:expr => $name:expr);* $(;)?) => {358 vec![359 $(($tok.to_owned(), $name.to_owned())),*360 ]361 };362}363use crate::{literals, puncts};364365impl KindsSrc {366 pub fn is_punct(&self, tok: &str) -> bool {367 self.punct.iter().any(|(t, _)| *t == tok)368 }369 pub fn is_literal(&self, tok: &str) -> bool {370 self.literals.iter().any(|l| l.name == tok)371 }372373 fn get_punct_name(&self, tok: &str) -> Option<&str> {374 self.punct375 .iter()376 .find(|(t, _)| *t == tok)377 .map(|(_, n)| n.as_str())378 }379}380381fn generate_nodes(kinds: &KindsSrc, grammar: &AstSrc) -> Result<String> {183fn generate_nodes(kinds: &KindsSrc, grammar: &AstSrc) -> Result<String> {382 let (node_defs, node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar184 let (node_defs, node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar383 .nodes185 .nodes400 support::children(&self.syntax)202 support::children(&self.syntax)401 }203 }402 }204 }403 } else if let Some(token_kind) = field.token_kind() {205 } else if let Some(token_kind) = field.token_kind(kinds) {404 quote! {206 quote! {405 pub fn #method_name(&self) -> Option<#ty> {207 pub fn #method_name(&self) -> Option<#ty> {406 support::token(&self.syntax, #token_kind)208 support::token(&self.syntax, #token_kind)407 }209 }408 }210 }211 } else if field.is_token_enum(grammar) {212 quote! {213 pub fn #method_name(&self) -> Option<#ty> {214 support::token_child(&self.syntax)215 }216 }409 } else {217 } else {410 quote! {218 quote! {411 pub fn #method_name(&self) -> Option<#ty> {219 pub fn #method_name(&self) -> Option<#ty> {513 })321 })514 .unzip();322 .unzip();515323324 let (token_enum_defs, token_enum_boilerplate_impls): (Vec<_>, Vec<_>) = grammar325 .token_enums326 .iter()327 .map(|en| {328 let variants: Vec<_> = en329 .variants330 .iter()331 .map(|token| {332 format_ident!(333 "{}",334 to_pascal_case(kinds.token(token).expect("token exists").name())335 )336 })337 .collect();338 let name = format_ident!("{}", en.name);339 let kind_name = format_ident!("{}Kind", en.name);340 let kinds: Vec<_> = variants341 .iter()342 .map(|name| format_ident!("{}", to_upper_snake_case(&name.to_string())))343 .collect();344345 let ast_node = quote! {346 impl AstToken for #name {347 fn can_cast(kind: SyntaxKind) -> bool {348 match kind {349 #(#kinds)|* => true,350 _ => false,351 }352 }353 fn cast(syntax: SyntaxToken) -> Option<Self> {354 let res = match syntax.kind() {355 #(356 #kinds => #name { syntax, kind: #kind_name::#variants },357 )*358 _ => return None,359 };360 Some(res)361 }362 fn syntax(&self) -> &SyntaxToken {363 &self.syntax364 }365 }366 };367368 (369 quote! {370 #[pretty_doc_comment_placeholder_workaround]371 #[derive(Debug, Clone, PartialEq, Eq, Hash)]372 pub struct #name { syntax: SyntaxToken, kind: #kind_name }373374 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]375 pub enum #kind_name {376 #(#variants,)*377 }378 },379 quote! {380 #ast_node381382 impl #name {383 pub fn kind(&self) -> #kind_name {384 self.kind385 }386 }387388 impl std::fmt::Display for #name {389 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {390 std::fmt::Display::fmt(self.syntax(), f)391 }392 }393 },394 )395 })396 .unzip();397516 let (any_node_defs, any_node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar398 let (any_node_defs, any_node_boilerplate_impls): (Vec<_>, Vec<_>) = grammar517 .nodes399 .nodes518 .iter()400 .iter()581 }463 }582 });464 });583465584 let defined_nodes: HashSet<_> = node_names.collect();585586 for node in kinds587 .nodes588 .iter()589 .map(|kind| to_pascal_case(kind))590 .filter(|name| !defined_nodes.iter().any(|&it| it == name))591 {592 drop(node)593 // FIXME: restore this594 // eprintln!("Warning: node {} not defined in ast source", node);595 }596597 let ast = quote! {466 let ast = quote! {598 #![allow(non_snake_case)]467 #![allow(non_snake_case, clippy::match_like_matches_macro)]468599 use crate::{469 use crate::{600 SyntaxNode, SyntaxToken, SyntaxKind::{self, *},470 SyntaxNode, SyntaxToken, SyntaxKind::{self, *},601 ast::{self, AstNode, AstChildren, support},471 ast::{AstNode, AstToken, AstChildren, support},602 T,472 T,603 };473 };604474605 #(#node_defs)*475 #(#node_defs)*606 #(#enum_defs)*476 #(#enum_defs)*477 #(#token_enum_defs)*607 #(#any_node_defs)*478 #(#any_node_defs)*608 #(#node_boilerplate_impls)*479 #(#node_boilerplate_impls)*609 #(#enum_boilerplate_impls)*480 #(#enum_boilerplate_impls)*481 #(#token_enum_boilerplate_impls)*610 #(#any_node_boilerplate_impls)*482 #(#any_node_boilerplate_impls)*611 #(#display_impls)*483 #(#display_impls)*612 };484 };636 use std::fmt::Write;508 use std::fmt::Write;637 for line in contents {509 for line in contents {638 writeln!(dest, "///{}", line).unwrap();510 writeln!(dest, "///{}", line).unwrap();639 }640}641642fn lower(kinds: &KindsSrc, grammar: &Grammar) -> AstSrc {643 let tokens = "Whitespace Comment String StringVerbantim StringBlock Number Ident"644 .split_ascii_whitespace()645 .map(|it| it.to_string())646 .collect::<Vec<_>>();647648 let mut res = AstSrc {649 tokens,650 ..Default::default()651 };652653 let nodes = grammar.iter().collect::<Vec<_>>();654655 for &node in &nodes {656 let name = grammar[node].name.clone();657 let rule = &grammar[node].rule;658 match lower_enum(grammar, rule) {659 Some(variants) => {660 let enum_src = AstEnumSrc {661 doc: Vec::new(),662 name,663 traits: Vec::new(),664 variants,665 };666 res.enums.push(enum_src);667 }668 None => {669 let mut fields = Vec::new();670 lower_rule(&mut fields, grammar, None, rule);671 res.nodes.push(AstNodeSrc {672 doc: Vec::new(),673 name,674 traits: Vec::new(),675 fields,676 });677 }678 }679 }680681 deduplicate_fields(&mut res);682 extract_enums(&mut res);683 extract_struct_traits(kinds, &mut res);684 extract_enum_traits(&mut res);685 res686}687688fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {689 let alternatives = match rule {690 Rule::Alt(it) => it,691 _ => return None,692 };693 let mut variants = Vec::new();694 for alternative in alternatives {695 match alternative {696 Rule::Node(it) => variants.push(grammar[*it].name.clone()),697 Rule::Token(it) if grammar[*it].name == ";" => (),698 _ => return None,699 }700 }701 Some(variants)702}703704fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, label: Option<&String>, rule: &Rule) {705 if lower_comma_list(acc, grammar, label, rule) {706 return;707 }708709 match rule {710 Rule::Node(node) => {711 let ty = grammar[*node].name.clone();712 let name = label.cloned().unwrap_or_else(|| to_lower_snake_case(&ty));713 let field = Field::Node {714 name,715 ty,716 cardinality: Cardinality::Optional,717 };718 acc.push(field);719 }720 Rule::Token(token) => {721 assert!(label.is_none(), "uexpected label: {:?}", label);722 let name = grammar[*token].name.clone();723 let field = Field::Token(name);724 acc.push(field);725 }726 Rule::Rep(inner) => {727 if let Rule::Node(node) = &**inner {728 let ty = grammar[*node].name.clone();729 let name = label730 .cloned()731 .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));732 let field = Field::Node {733 name,734 ty,735 cardinality: Cardinality::Many,736 };737 acc.push(field);738 return;739 }740 todo!("unsupported repitition: {:?}", rule)741 }742 Rule::Labeled { label: l, rule } => {743 assert!(label.is_none());744 lower_rule(acc, grammar, Some(l), rule);745 }746 Rule::Seq(rules) | Rule::Alt(rules) => {747 for rule in rules {748 lower_rule(acc, grammar, label, rule)749 }750 }751 Rule::Opt(rule) => lower_rule(acc, grammar, label, rule),752 }753}754755// (T (',' T)* ','?)756fn lower_comma_list(757 acc: &mut Vec<Field>,758 grammar: &Grammar,759 label: Option<&String>,760 rule: &Rule,761) -> bool {762 let rule = match rule {763 Rule::Seq(it) => it,764 _ => return false,765 };766 let (node, repeat, trailing_comma) = match rule.as_slice() {767 [Rule::Node(node), Rule::Rep(repeat), Rule::Opt(trailing_comma)] => {768 (node, repeat, trailing_comma)769 }770 _ => return false,771 };772 let repeat = match &**repeat {773 Rule::Seq(it) => it,774 _ => return false,775 };776 match repeat.as_slice() {777 [comma, Rule::Node(n)] if comma == &**trailing_comma && n == node => (),778 _ => return false,779 }780 let ty = grammar[*node].name.clone();781 let name = label782 .cloned()783 .unwrap_or_else(|| pluralize(&to_lower_snake_case(&ty)));784 let field = Field::Node {785 name,786 ty,787 cardinality: Cardinality::Many,788 };789 acc.push(field);790 true791}792793fn deduplicate_fields(ast: &mut AstSrc) {794 for node in &mut ast.nodes {795 let mut i = 0;796 'outer: while i < node.fields.len() {797 for j in 0..i {798 let f1 = &node.fields[i];799 let f2 = &node.fields[j];800 if f1 == f2 {801 node.fields.remove(i);802 continue 'outer;803 }804 }805 i += 1;806 }807 }808}809810fn extract_enums(ast: &mut AstSrc) {811 for node in &mut ast.nodes {812 for enm in &ast.enums {813 let mut to_remove = Vec::new();814 for (i, field) in node.fields.iter().enumerate() {815 let ty = field.ty().to_string();816 if enm.variants.iter().any(|it| it == &ty) {817 to_remove.push(i);818 }819 }820 if to_remove.len() == enm.variants.len() {821 node.remove_field(to_remove);822 let ty = enm.name.clone();823 let name = to_lower_snake_case(&ty);824 node.fields.push(Field::Node {825 name,826 ty,827 cardinality: Cardinality::Optional,828 });829 }830 }831 }832}833834fn extract_struct_traits(kinds: &KindsSrc, ast: &mut AstSrc) {835 // TODO: add common accessor traits here.836 let traits: &[(&str, &[&str])] = &[];837838 for node in &mut ast.nodes {839 for (name, methods) in traits {840 extract_struct_trait(kinds, node, name, methods);841 }842 }843}844845fn extract_struct_trait(846 kinds: &KindsSrc,847 node: &mut AstNodeSrc,848 trait_name: &str,849 methods: &[&str],850) {851 let mut to_remove = Vec::new();852 for (i, field) in node.fields.iter().enumerate() {853 let method_name = field.method_name(kinds).to_string();854 if methods.iter().any(|&it| it == method_name) {855 to_remove.push(i);856 }857 }858 if to_remove.len() == methods.len() {859 node.traits.push(trait_name.to_string());860 node.remove_field(to_remove);861 }862}863864fn extract_enum_traits(ast: &mut AstSrc) {865 let enums = ast.enums.clone();866 for enm in &mut ast.enums {867 if enm.name == "Stmt" {868 continue;869 }870 let nodes = &ast.nodes;871872 let mut variant_traits = enm.variants.iter().map(|var| {873 nodes874 .iter()875 .find_map(|node| {876 if &node.name != var {877 return None;878 }879 Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())880 })881 .unwrap_or_else(|| {882 enums883 .iter()884 .find_map(|node| {885 if &node.name != var {886 return None;887 }888 Some(node.traits.iter().cloned().collect::<BTreeSet<_>>())889 })890 .unwrap_or_else(|| {891 panic!("{}", {892 &format!(893 "Could not find a struct `{}` for enum `{}::{}`",894 var, enm.name, var895 )896 })897 })898 })899 });900901 let mut enum_traits = match variant_traits.next() {902 Some(it) => it,903 None => continue,904 };905 for traits in variant_traits {906 enum_traits = enum_traits.intersection(&traits).cloned().collect();907 }908 enm.traits = enum_traits.into_iter().collect();909 }511 }910}512}911513xtask/src/sourcegen/util.rsdiffbeforeafterboth1use std::{fs, path::Path};1use std::{fs, path::Path};223use anyhow::{bail, Result};3use anyhow::Result;4use xshell::{cmd, Shell};4use xshell::{cmd, Shell};556/// Checks that the `file` has the specified `contents`. If that is not the6/// Checks that the `file` has the specified `contents`. If that is not the151516 eprintln!(" {} was not up-to-date, updating\n", file.display());16 eprintln!(" {} was not up-to-date, updating\n", file.display());17 if std::env::var("CI").is_ok() {17 if std::env::var("CI").is_ok() {18 eprintln!("NOTE: run `cargo test` locally and commit the updated files\n");18 eprintln!("NOTE: run `cargo xtask` locally and commit the updated files\n");19 }19 }20 if let Some(parent) = file.parent() {20 if let Some(parent) = file.parent() {21 let _ = fs::create_dir_all(parent);21 let _ = fs::create_dir_all(parent);22 }22 }23 fs::write(file, contents).unwrap();23 fs::write(file, contents).unwrap();24 bail!("some file was not up to date and has been updated, simply re-run the tests");24 Ok(())25}25}262627// Eww, someone configured git to use crlf?27// Eww, someone configured git to use crlf?80 // let _e = pushenv("RUSTUP_TOOLCHAIN", "stable");80 // let _e = pushenv("RUSTUP_TOOLCHAIN", "stable");81 // rustfmt()?;81 // rustfmt()?;82 let sh = Shell::new()?;82 let sh = Shell::new()?;83 let stdout = cmd!(sh, "rustfmt --config fn_single_line=true")83 let stdout = cmd!(sh, "rustfmt").stdin(text).read()?;84 .stdin(text)85 .read()?;86 Ok(format!(84 Ok(format!(