--- a/crates/jrsonnet-formatter/Cargo.toml +++ b/crates/jrsonnet-formatter/Cargo.toml @@ -11,6 +11,7 @@ hi-doc.workspace = true indoc.workspace = true insta.workspace = true +jrsonnet-lexer = { version = "0.5.0-pre97", path = "../jrsonnet-lexer" } jrsonnet-rowan-parser.workspace = true [lints] --- a/crates/jrsonnet-formatter/src/lib.rs +++ b/crates/jrsonnet-formatter/src/lib.rs @@ -8,8 +8,8 @@ ConditionResolver, ConditionResolverContext, LineNumber, PrintItems, PrintOptions, }; use hi_doc::{Formatting, SnippetBuilder}; +use jrsonnet_lexer::collect_lexed_str_block; use jrsonnet_rowan_parser::{ - collect_lexed_str_block, nodes::{ Arg, ArgsDesc, Assertion, BinaryOperator, Bind, CompSpec, Destruct, DestructArrayPart, DestructRest, Expr, ExprArray, ExprBase, FieldName, ForSpec, IfSpec, ImportKind, Literal, @@ -790,7 +790,7 @@ // pi // } Self::ExprObjExtend(ex) => { - p!(out, {ex.lhs_work()} str(" ") {ex.rhs_work()}); + p!(out, {ex.lhs()} str(" ") {ex.rhs()}); } Self::ExprParened(p) => { p!(out, str("(") {p.expr()} str(")")); --- /dev/null +++ b/crates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__snapshots@visibilities.jsonnet.snap @@ -0,0 +1,6 @@ +--- +source: crates/jrsonnet-formatter/src/tests.rs +expression: reformat(&input) +input_file: crates/jrsonnet-formatter/src/tests/visibilities.jsonnet +--- +{ normal: 1, hide:: 2, unhide::: 3 } --- /dev/null +++ b/crates/jrsonnet-formatter/src/tests/visibilities.jsonnet @@ -0,0 +1 @@ +{normal:1,hide::2,unhide:::3} --- a/crates/jrsonnet-lexer/src/generated/syntax_kinds.rs +++ b/crates/jrsonnet-lexer/src/generated/syntax_kinds.rs @@ -72,10 +72,6 @@ R_BRACE, #[token(":")] COLON, - #[token("::")] - COLONCOLON, - #[token(":::")] - COLONCOLONCOLON, #[token(";")] SEMI, #[token(".")] @@ -188,11 +184,10 @@ match self { OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK - | L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON - | SEMI | DOT | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW - | LOCAL_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW - | FUNCTION_KW | ERROR_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW - | SUPER_KW | FOR_KW | ASSERT_KW => true, + | L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | SEMI | DOT | DOTDOTDOT | COMMA + | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW | LOCAL_KW | IMPORTSTR_KW + | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW | FUNCTION_KW | ERROR_KW + | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | SUPER_KW | FOR_KW | ASSERT_KW => true, _ => false, } } @@ -205,6 +200,6 @@ } } #[macro_export] -macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ 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 } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_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 } } +macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ 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 :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_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 } } #[allow(unused_imports)] pub use T; --- a/crates/jrsonnet-lexer/src/lib.rs +++ b/crates/jrsonnet-lexer/src/lib.rs @@ -5,4 +5,6 @@ #[derive(Clone, Copy, Debug)] pub struct Span(pub u32, pub u32); +pub use generated::syntax_kinds::SyntaxKind; pub use lex::{Lexeme, Lexer}; +pub use string_block::{collect_lexed_str_block, CollectStrBlock}; --- a/crates/jrsonnet-rowan-parser/jsonnet.ungram +++ b/crates/jrsonnet-rowan-parser/jsonnet.ungram @@ -44,8 +44,8 @@ UnaryOperator rhs:Expr ExprObjExtend = - Expr - Expr + lhs:Expr + rhs:Expr ExprParened = '(' Expr @@ -209,9 +209,7 @@ | FieldNameDynamic Visibility = - ':::' -| '::' -| ':' + ':' v1:':'? v2:':'? Literal = 'null' --- a/crates/jrsonnet-rowan-parser/src/generated/nodes.rs +++ b/crates/jrsonnet-rowan-parser/src/generated/nodes.rs @@ -228,9 +228,12 @@ pub(crate) syntax: SyntaxNode, } impl ExprObjExtend { - pub fn expr(&self) -> Option { + pub fn lhs(&self) -> Option { support::children(&self.syntax).next() } + pub fn rhs(&self) -> Option { + support::children(&self.syntax).nth(1usize) + } } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -562,7 +565,7 @@ support::token(&self.syntax, T![+]) } pub fn visibility(&self) -> Option { - support::token_child(&self.syntax) + support::children(&self.syntax).next() } pub fn expr(&self) -> Option { support::children(&self.syntax).next() @@ -570,6 +573,16 @@ } #[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Visibility { + pub(crate) syntax: SyntaxNode, +} +impl Visibility { + pub fn colon_token(&self) -> Option { + support::token(&self.syntax, T![:]) + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct MemberFieldMethod { pub(crate) syntax: SyntaxNode, } @@ -581,7 +594,7 @@ support::children(&self.syntax).next() } pub fn visibility(&self) -> Option { - support::token_child(&self.syntax) + support::children(&self.syntax).next() } pub fn expr(&self) -> Option { support::children(&self.syntax).next() @@ -999,19 +1012,6 @@ ImportstrKw, ImportbinKw, ImportKw, -} - -#[derive(Debug, Clone, PartialEq, Eq, Hash)] -pub struct Visibility { - syntax: SyntaxToken, - kind: VisibilityKind, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum VisibilityKind { - Coloncoloncolon, - Coloncolon, - Colon, } #[derive(Debug, Clone, PartialEq, Eq, Hash)] @@ -1627,6 +1627,21 @@ &self.syntax } } +impl AstNode for Visibility { + fn can_cast(kind: SyntaxKind) -> bool { + kind == VISIBILITY + } + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } +} impl AstNode for MemberFieldMethod { fn can_cast(kind: SyntaxKind) -> bool { kind == MEMBER_FIELD_METHOD @@ -2640,45 +2655,6 @@ std::fmt::Display::fmt(self.syntax(), f) } } -impl AstToken for Visibility { - fn can_cast(kind: SyntaxKind) -> bool { - VisibilityKind::can_cast(kind) - } - fn cast(syntax: SyntaxToken) -> Option { - let kind = VisibilityKind::cast(syntax.kind())?; - Some(Visibility { syntax, kind }) - } - fn syntax(&self) -> &SyntaxToken { - &self.syntax - } -} -impl VisibilityKind { - fn can_cast(kind: SyntaxKind) -> bool { - match kind { - COLONCOLONCOLON | COLONCOLON | COLON => true, - _ => false, - } - } - pub fn cast(kind: SyntaxKind) -> Option { - let res = match kind { - COLONCOLONCOLON => Self::Coloncoloncolon, - COLONCOLON => Self::Coloncolon, - COLON => Self::Colon, - _ => return None, - }; - Some(res) - } -} -impl Visibility { - pub fn kind(&self) -> VisibilityKind { - self.kind - } -} -impl std::fmt::Display for Visibility { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) - } -} impl AstToken for Trivia { fn can_cast(kind: SyntaxKind) -> bool { TriviaKind::can_cast(kind) @@ -3015,6 +2991,11 @@ std::fmt::Display::fmt(self.syntax(), f) } } +impl std::fmt::Display for Visibility { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self.syntax(), f) + } +} impl std::fmt::Display for MemberFieldMethod { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(self.syntax(), f) --- a/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs +++ b/crates/jrsonnet-rowan-parser/src/generated/syntax_kinds.rs @@ -44,8 +44,6 @@ L_BRACE, R_BRACE, COLON, - COLONCOLON, - COLONCOLONCOLON, SEMI, DOT, DOTDOTDOT, @@ -142,6 +140,7 @@ OBJ_LOCAL, MEMBER_ASSERT_STMT, MEMBER_FIELD_NORMAL, + VISIBILITY, MEMBER_FIELD_METHOD, FIELD_NAME_FIXED, FIELD_NAME_DYNAMIC, @@ -174,7 +173,6 @@ TEXT, NUMBER, IMPORT_KIND, - VISIBILITY, TRIVIA, CUSTOM_ERROR, #[doc(hidden)] @@ -186,11 +184,10 @@ match self { OR | NULL_COAELSE | AND | BIT_OR | BIT_XOR | BIT_AND | EQ | NE | LT | GT | LE | GE | LHS | RHS | PLUS | MINUS | MUL | DIV | MODULO | NOT | BIT_NOT | L_BRACK | R_BRACK - | L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | COLONCOLON | COLONCOLONCOLON - | SEMI | DOT | DOTDOTDOT | COMMA | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW - | LOCAL_KW | IMPORTSTR_KW | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW - | FUNCTION_KW | ERROR_KW | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW - | SUPER_KW | FOR_KW | ASSERT_KW => true, + | L_PAREN | R_PAREN | L_BRACE | R_BRACE | COLON | SEMI | DOT | DOTDOTDOT | COMMA + | DOLLAR | ASSIGN | QUESTION_MARK | TAILSTRICT_KW | LOCAL_KW | IMPORTSTR_KW + | IMPORTBIN_KW | IMPORT_KW | IF_KW | THEN_KW | ELSE_KW | FUNCTION_KW | ERROR_KW + | IN_KW | NULL_KW | TRUE_KW | FALSE_KW | SELF_KW | SUPER_KW | FOR_KW | ASSERT_KW => true, _ => false, } } @@ -198,7 +195,7 @@ match self { SUFFIX | BIND | STMT | OBJ_BODY | COMP_SPEC | EXPR_BASE | MEMBER_COMP | MEMBER | FIELD_NAME | DESTRUCT | DESTRUCT_ARRAY_PART | BINARY_OPERATOR | UNARY_OPERATOR - | LITERAL | TEXT | NUMBER | IMPORT_KIND | VISIBILITY | TRIVIA | CUSTOM_ERROR => true, + | LITERAL | TEXT | NUMBER | IMPORT_KIND | TRIVIA | CUSTOM_ERROR => true, _ => false, } } @@ -211,6 +208,6 @@ } } #[macro_export] -macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ 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 } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_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 } } +macro_rules ! T { [||] => { $ crate :: SyntaxKind :: OR } ; [??] => { $ crate :: SyntaxKind :: NULL_COAELSE } ; [&&] => { $ 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 :: SEMI } ; [.] => { $ crate :: SyntaxKind :: DOT } ; [...] => { $ crate :: SyntaxKind :: DOTDOTDOT } ; [,] => { $ crate :: SyntaxKind :: COMMA } ; ['$'] => { $ crate :: SyntaxKind :: DOLLAR } ; [=] => { $ crate :: SyntaxKind :: ASSIGN } ; [?] => { $ crate :: SyntaxKind :: QUESTION_MARK } ; [tailstrict] => { $ crate :: SyntaxKind :: TAILSTRICT_KW } ; [local] => { $ crate :: SyntaxKind :: LOCAL_KW } ; [importstr] => { $ crate :: SyntaxKind :: IMPORTSTR_KW } ; [importbin] => { $ crate :: SyntaxKind :: IMPORTBIN_KW } ; [import] => { $ crate :: SyntaxKind :: IMPORT_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 } } #[allow(unused_imports)] pub use T; --- a/crates/jrsonnet-rowan-parser/src/lib.rs +++ b/crates/jrsonnet-rowan-parser/src/lib.rs @@ -21,11 +21,6 @@ pub use language::*; pub use token_set::SyntaxKindSet; -use self::{ - ast::support, - generated::nodes::{Expr, ExprObjExtend}, -}; - pub fn parse(input: &str) -> (SourceFile, Vec) { let lexemes = lex::lex(input); let kinds = lexemes @@ -44,15 +39,4 @@ }, parse.errors, ) -} -impl ExprObjExtend { - pub fn lhs_work(&self) -> Option { - support::child(self.syntax()) - } - pub fn rhs_work(&self) -> Option { - let mut children = support::children(self.syntax()); - // skip lhs - children.next()?; - children.next() - } } --- a/crates/jrsonnet-rowan-parser/src/parser.rs +++ b/crates/jrsonnet-rowan-parser/src/parser.rs @@ -406,17 +406,27 @@ m.complete(p, FIELD_NAME_FIXED); } else { m.forget(p); - // ::: it split because in TS it is being handled as : :: - p.error_with_recovery_set(TS![; : :: '('].with(T![:::])); + // Recover with ::, ::: + p.error_with_recovery_set(TS![; : '(']); } } fn visibility(p: &mut Parser) { - // ::: it split because in TS it is being handled as : :: - if p.at_ts(TS![: ::].with(T![:::])) { + let m = p.start(); + if !p.at_ts(TS![:]) { + p.error_with_recovery_set(TS![=]); + } + p.bump(); + 'colons: { + if !p.at_ts(TS![:]) { + break 'colons; + } p.bump(); - } else { - p.error_with_recovery_set(TS![=]); + if !p.at_ts(TS![:]) { + break 'colons; + } + p.bump(); } + m.complete(p, VISIBILITY); } fn assertion(p: &mut Parser) { let m = p.start(); @@ -472,17 +482,17 @@ visibility(p); expr(p); true - // ::: it split because in TS it is being handled as : :: - } else if p.at_ts(TS![: ::].with(T![:::])) && p.nth_at(1, T![function]) { - visibility(p); - p.bump_assert(T![function]); - params_desc(p); - expr(p); - true } else { visibility(p); - expr(p); - false + if p.at(T![function]) { + p.bump_assert(T![function]); + params_desc(p); + expr(p); + true + } else { + expr(p); + false + } }; elems += 1; @@ -648,15 +658,14 @@ fn slice_desc_or_index(p: &mut Parser) -> bool { let m = p.start(); p.bump(); - // TODO: do not treat :, ::, ::: as full tokens? // Start - if !p.at(T![:]) && !p.at(T![::]) { + if !p.at(T![:]) { expr(p); } if p.at(T![:]) { p.bump(); // End - if !p.at(T![']']) { + if !p.at_ts(TS![']' :]) { expr(p).wrap(p, SLICE_DESC_END, true); } if p.at(T![:]) { @@ -665,12 +674,6 @@ if !p.at(T![']']) { expr(p).wrap(p, SLICE_DESC_STEP, true); } - } - } else if p.at(T![::]) { - p.bump(); - // End - if !p.at(T![']']) { - expr(p).wrap(p, SLICE_DESC_END, true); } } else { // It was not a slice --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec.snap @@ -11,7 +11,8 @@ FIELD_NAME_FIXED@1..2 NAME@1..2 IDENT@1..2 "a" - COLON@2..3 ":" + VISIBILITY@2..3 + COLON@2..3 ":" EXPR@3..4 EXPR_NUMBER@3..4 FLOAT@3..4 "1" --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_comma.snap @@ -11,7 +11,8 @@ FIELD_NAME_FIXED@1..2 NAME@1..2 IDENT@1..2 "a" - COLON@2..3 ":" + VISIBILITY@2..3 + COLON@2..3 ":" EXPR@3..4 EXPR_NUMBER@3..4 FLOAT@3..4 "1" --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_asserts.snap @@ -21,7 +21,8 @@ FIELD_NAME_FIXED@11..12 NAME@11..12 IDENT@11..12 "a" - COLON@12..13 ":" + VISIBILITY@12..13 + COLON@12..13 ":" WHITESPACE@13..14 " " EXPR@14..15 EXPR_NUMBER@14..15 --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems.snap @@ -11,7 +11,8 @@ FIELD_NAME_FIXED@1..2 NAME@1..2 IDENT@1..2 "a" - COLON@2..3 ":" + VISIBILITY@2..3 + COLON@2..3 ":" EXPR@3..4 EXPR_NUMBER@3..4 FLOAT@3..4 "1" @@ -49,7 +50,8 @@ FIELD_NAME_FIXED@25..26 NAME@25..26 IDENT@25..26 "b" - COLON@26..27 ":" + VISIBILITY@26..27 + COLON@26..27 ":" EXPR@27..28 EXPR_NUMBER@27..28 FLOAT@27..28 "1" --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_compspec_incompatible_with_multiple_elems_w.snap @@ -11,7 +11,8 @@ FIELD_NAME_FIXED@1..2 NAME@1..2 IDENT@1..2 "a" - COLON@2..3 ":" + VISIBILITY@2..3 + COLON@2..3 ":" EXPR@3..4 EXPR_NUMBER@3..4 FLOAT@3..4 "1" @@ -21,7 +22,8 @@ FIELD_NAME_FIXED@6..7 NAME@6..7 IDENT@6..7 "b" - COLON@7..8 ":" + VISIBILITY@7..8 + COLON@7..8 ":" EXPR@8..9 EXPR_NUMBER@8..9 FLOAT@8..9 "1" @@ -60,7 +62,8 @@ FIELD_NAME_FIXED@31..32 NAME@31..32 IDENT@31..32 "c" - COLON@32..33 ":" + VISIBILITY@32..33 + COLON@32..33 ":" EXPR@33..34 EXPR_NUMBER@33..34 FLOAT@33..34 "1" --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__obj_method.snap @@ -19,7 +19,8 @@ NAME@5..6 IDENT@5..6 "x" R_PAREN@6..7 ")" - COLON@7..8 ":" + VISIBILITY@7..8 + COLON@7..8 ":" WHITESPACE@8..9 " " EXPR@9..10 EXPR_VAR@9..10 @@ -31,7 +32,8 @@ FIELD_NAME_FIXED@13..14 NAME@13..14 IDENT@13..14 "a" - COLON@14..15 ":" + VISIBILITY@14..15 + COLON@14..15 ":" WHITESPACE@15..16 " " FUNCTION_KW@16..24 "function" PARAMS_DESC@24..27 --- /dev/null +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__visibilities.snap @@ -0,0 +1,51 @@ +--- +source: crates/jrsonnet-rowan-parser/src/tests.rs +expression: "{\n\tnormal: 1,\n\thide:: 2,\n\tunhide::: 3,\n}\n" +--- +SOURCE_FILE@0..41 + EXPR@0..40 + EXPR_OBJECT@0..40 + OBJ_BODY_MEMBER_LIST@0..40 + L_BRACE@0..1 "{" + WHITESPACE@1..3 "\n\t" + MEMBER_FIELD_NORMAL@3..12 + FIELD_NAME_FIXED@3..9 + NAME@3..9 + IDENT@3..9 "normal" + VISIBILITY@9..10 + COLON@9..10 ":" + WHITESPACE@10..11 " " + EXPR@11..12 + EXPR_NUMBER@11..12 + FLOAT@11..12 "1" + COMMA@12..13 "," + WHITESPACE@13..15 "\n\t" + MEMBER_FIELD_NORMAL@15..23 + FIELD_NAME_FIXED@15..19 + NAME@15..19 + IDENT@15..19 "hide" + VISIBILITY@19..21 + COLON@19..20 ":" + COLON@20..21 ":" + WHITESPACE@21..22 " " + EXPR@22..23 + EXPR_NUMBER@22..23 + FLOAT@22..23 "2" + COMMA@23..24 "," + WHITESPACE@24..26 "\n\t" + MEMBER_FIELD_NORMAL@26..37 + FIELD_NAME_FIXED@26..32 + NAME@26..32 + IDENT@26..32 "unhide" + VISIBILITY@32..35 + COLON@32..33 ":" + COLON@33..34 ":" + COLON@34..35 ":" + WHITESPACE@35..36 " " + EXPR@36..37 + EXPR_NUMBER@36..37 + FLOAT@36..37 "3" + COMMA@37..38 "," + WHITESPACE@38..39 "\n" + R_BRACE@39..40 "}" + WHITESPACE@40..41 "\n" --- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap +++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__wrong_field_end.snap @@ -12,7 +12,8 @@ FIELD_NAME_FIXED@3..4 NAME@3..4 IDENT@3..4 "a" - COLON@4..5 ":" + VISIBILITY@4..5 + COLON@4..5 ":" WHITESPACE@5..6 " " EXPR@6..7 EXPR_NUMBER@6..7 @@ -24,7 +25,8 @@ FIELD_NAME_FIXED@10..11 NAME@10..11 IDENT@10..11 "b" - COLON@11..12 ":" + VISIBILITY@11..12 + COLON@11..12 ":" WHITESPACE@12..13 " " EXPR@13..14 EXPR_NUMBER@13..14 --- a/crates/jrsonnet-rowan-parser/src/tests.rs +++ b/crates/jrsonnet-rowan-parser/src/tests.rs @@ -208,6 +208,14 @@ Trimmed text block ||| "# + + visibilities => r#" + { + normal: 1, + hide:: 2, + unhide::: 3, + } + "# ); #[test] --- a/xtask/src/sourcegen/kinds.rs +++ b/xtask/src/sourcegen/kinds.rs @@ -240,8 +240,6 @@ "{" => "L_BRACE"; "}" => "R_BRACE"; ":" => "COLON"; - "::" => "COLONCOLON"; - ":::" => "COLONCOLONCOLON"; ";" => "SEMI"; "." => "DOT"; "..." => "DOTDOTDOT";