From 493027e31b8b64fe912aff2f332bec0911591fa4 Mon Sep 17 00:00:00 2001 From: Лач Date: Wed, 01 Jul 2020 21:50:02 +0000 Subject: [PATCH] fix(parser): allow tabs in multiline strings --- --- a/bindings/jsonnet/src/lib.rs +++ b/bindings/jsonnet/src/lib.rs @@ -198,6 +198,7 @@ add: false, visibility: Visibility::Normal, invoke: LazyBinding::Bound(LazyVal::new_resolved(val.clone())), + location: None, }, ); let new_obj = ObjValue::new(Some(old.clone()), Rc::new(new)); --- a/crates/jrsonnet-parser/src/expr.rs +++ b/crates/jrsonnet-parser/src/expr.rs @@ -1,10 +1,10 @@ +#[cfg(feature = "deserialize")] +use serde::Deserialize; +#[cfg(feature = "serialize")] +use serde::Serialize; use std::{fmt::Debug, ops::Deref, path::PathBuf, rc::Rc}; #[cfg(feature = "dump")] use structdump_derive::Codegen; -#[cfg(feature = "serialize")] -use serde::Serialize; -#[cfg(feature = "deserialize")] -use serde::Deserialize; #[cfg_attr(feature = "dump", derive(Codegen))] #[cfg_attr(feature = "serialize", derive(Serialize))] --- a/crates/jrsonnet-parser/src/lib.rs +++ b/crates/jrsonnet-parser/src/lib.rs @@ -9,6 +9,7 @@ pub use expr::*; pub use peg; +#[derive(Default)] pub struct ParserSettings { pub loc_data: bool, pub file_name: Rc, @@ -83,9 +84,9 @@ = str:$((!['\n'][_])* "\n") {str} pub rule string_block() -> String = "|||" (!['\n']single_whitespace())* "\n" - prefix:[' ']+ first_line:whole_line() - lines:([' ']*<{prefix.len()}> s:whole_line() {s})* - [' ']*<, {prefix.len() - 1}> "|||" + prefix:[' ' | '\t']+ first_line:whole_line() + lines:([' ' | '\t']*<{prefix.len()}> s:whole_line() {s})* + [' ' | '\t']*<, {prefix.len() - 1}> "|||" {let mut l = first_line.to_owned(); l.extend(lines); l} pub rule string() -> String = "\"" str:$(("\\\"" / "\\\\" / (!['"'][_]))*) "\"" {unescape::unescape(str).unwrap()} @@ -359,7 +360,19 @@ assert_eq!( parse!("|||\n Hello world!\n a\n|||"), el!(Expr::Str("Hello world!\n a\n".into())), - ) + ); + assert_eq!( + parse!("|||\n Hello world!\n a\n|||"), + el!(Expr::Str("Hello world!\n a\n".into())), + ); + assert_eq!( + parse!("|||\n\t\tHello world!\n\t\t\ta\n|||"), + el!(Expr::Str("Hello world!\n\ta\n".into())), + ); + assert_eq!( + parse!("|||\n Hello world!\n a\n |||"), + el!(Expr::Str("Hello world!\n a\n".into())), + ); } #[test] -- gitstuff