difftreelog
fix(rowan-parser) handle unhidden fields
in: master
4 files changed
crates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__snapshots@basic_object.jsonnet.snapdiffbeforeafterboth--- a/crates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__snapshots@basic_object.jsonnet.snap
+++ b/crates/jrsonnet-formatter/src/snapshots/jrsonnet_formatter__tests__snapshots@basic_object.jsonnet.snap
@@ -3,4 +3,4 @@
expression: reformat(&input)
input_file: crates/jrsonnet-formatter/src/tests/basic_object.jsonnet
---
-{ foo: 'bar', baz: 'qux', nested: { a: 1, b: 2 } }
+{ foo: 'bar', baz: 'qux', nested: { a: 1, b: 2 }, unhidden::: 1 }
crates/jrsonnet-formatter/src/tests/basic_object.jsonnetdiffbeforeafterboth--- a/crates/jrsonnet-formatter/src/tests/basic_object.jsonnet
+++ b/crates/jrsonnet-formatter/src/tests/basic_object.jsonnet
@@ -1 +1 @@
-{ foo: 'bar', baz: 'qux', nested: { a: 1, b: 2 } }
+{ foo: 'bar', baz: 'qux', nested: { a: 1, b: 2 }, unhidden::: 1 }
crates/jrsonnet-rowan-parser/src/lib.rsdiffbeforeafterboth1#![deny(unused_must_use)]23use event::Sink;4use generated::nodes::{SourceFile, Trivia};5use lex::lex;6use parser::{LocatedSyntaxError, Parser};7pub use rowan;89mod ast;10mod event;11mod generated;12mod language;13mod lex;14mod marker;15mod parser;16mod precedence;17mod string_block;18mod tests;19mod token_set;2021pub use ast::{AstChildren, AstNode, AstToken};22pub use generated::{nodes, syntax_kinds::SyntaxKind};23pub use language::*;24pub use token_set::SyntaxKindSet;25pub use string_block::{collect_lexed_str_block, CollectStrBlock};2627use self::{28 ast::support,29 generated::nodes::{Expr, ExprBinary, ExprObjExtend},30};3132pub fn parse(input: &str) -> (SourceFile, Vec<LocatedSyntaxError>) {33 let lexemes = lex(input);34 let kinds = lexemes35 .iter()36 .map(|l| l.kind)37 .filter(|k| !Trivia::can_cast(*k))38 .collect();39 let parser = Parser::new(kinds);40 let events = parser.parse();41 let sink = Sink::new(events, &lexemes);4243 let parse = sink.finish();44 (45 SourceFile {46 syntax: parse.syntax(),47 },48 parse.errors,49 )50}51impl ExprObjExtend {52 pub fn lhs_work(&self) -> Option<Expr> {53 support::child(self.syntax())54 }55 pub fn rhs_work(&self) -> Option<Expr> {56 let mut children = support::children(self.syntax());57 // skip lhs58 children.next()?;59 children.next()60 }61}1#![deny(unused_must_use)]23use event::Sink;4use generated::nodes::{SourceFile, Trivia};5use lex::lex;6use parser::{LocatedSyntaxError, Parser};7pub use rowan;89mod ast;10mod event;11mod generated;12mod language;13mod lex;14mod marker;15mod parser;16mod precedence;17mod string_block;18mod tests;19mod token_set;2021pub use ast::{AstChildren, AstNode, AstToken};22pub use generated::{nodes, syntax_kinds::SyntaxKind};23pub use language::*;24pub use string_block::{collect_lexed_str_block, CollectStrBlock};25pub use token_set::SyntaxKindSet;2627use self::{28 ast::support,29 generated::nodes::{Expr, ExprBinary, ExprObjExtend},30};3132pub fn parse(input: &str) -> (SourceFile, Vec<LocatedSyntaxError>) {33 let lexemes = lex(input);34 let kinds = lexemes35 .iter()36 .map(|l| l.kind)37 .filter(|k| !Trivia::can_cast(*k))38 .collect();39 let parser = Parser::new(kinds);40 let events = parser.parse();41 let sink = Sink::new(events, &lexemes);4243 let parse = sink.finish();44 (45 SourceFile {46 syntax: parse.syntax(),47 },48 parse.errors,49 )50}51impl ExprObjExtend {52 pub fn lhs_work(&self) -> Option<Expr> {53 support::child(self.syntax())54 }55 pub fn rhs_work(&self) -> Option<Expr> {56 let mut children = support::children(self.syntax());57 // skip lhs58 children.next()?;59 children.next()60 }61}crates/jrsonnet-rowan-parser/src/parser.rsdiffbeforeafterboth--- a/crates/jrsonnet-rowan-parser/src/parser.rs
+++ b/crates/jrsonnet-rowan-parser/src/parser.rs
@@ -407,11 +407,13 @@
m.complete(p, FIELD_NAME_FIXED);
} else {
m.forget(p);
- p.error_with_recovery_set(TS![; : :: ::: '(']);
+ // ::: it split because in TS it is being handled as : ::
+ p.error_with_recovery_set(TS![; : :: '('].with(T![:::]));
}
}
fn visibility(p: &mut Parser) {
- if p.at_ts(TS![: :: :::]) {
+ // ::: it split because in TS it is being handled as : ::
+ if p.at_ts(TS![: ::].with(T![:::])) {
p.bump();
} else {
p.error_with_recovery_set(TS![=]);
@@ -471,7 +473,8 @@
visibility(p);
expr(p);
true
- } else if p.at_ts(TS![: :: :::]) && p.nth_at(1, T![function]) {
+ // ::: 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);