git.delta.rocks / jrsonnet / refs/commits / b7f33d336d24

difftreelog

fix correct string block parsing

Лач2020-06-14parent: #55e9769.patch.diff
in: master

2 files changed

modifiedcrates/jsonnet-parser/src/lib.rsdiffbeforeafterboth
--- a/crates/jsonnet-parser/src/lib.rs
+++ b/crates/jsonnet-parser/src/lib.rs
@@ -6,10 +6,8 @@
 use peg::parser;
 use std::{path::PathBuf, rc::Rc};
 mod expr;
-mod string_processing;
 pub use expr::*;
 pub use peg;
-use string_processing::deent;
 
 pub struct ParserSettings {
 	pub loc_data: bool,
@@ -81,26 +79,20 @@
 		pub rule assertion(s: &ParserSettings) -> expr::AssertStmt
 			= keyword("assert") _ cond:expr(s) msg:(_ ":" _ e:expr(s) {e})? { expr::AssertStmt(cond, msg) }
 
-		pub rule whole_line() -> String
-			= str:$((!['\n'][_])* "\n") {str.to_owned()}
+		pub rule whole_line() -> &'input str
+			= 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}> "|||"
+			  {let mut l = first_line.to_owned(); l.extend(lines); l}
 		pub rule string() -> String
 			= "\"" str:$(("\\\"" / "\\\\" / (!['"'][_]))*) "\"" {unescape::unescape(str).unwrap()}
 			/ "'" str:$(("\\'" / "\\\\" / (!['\''][_]))*) "'" {unescape::unescape(str).unwrap()}
 			/ "@'" str:$(("''" / (!['\''][_]))*) "'" {str.replace("''", "'")}
 			/ "@\"" str:$(("\"\"" / (!['"'][_]))*) "\"" {str.replace("\"\"", "\"")}
-			// TODO: This is temporary workaround, i still dont know how to write this correctly btw.
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<1, 1> whole_line())+) " "*<0, 0> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<2, 2> whole_line())+) " "*<1, 1> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<3, 3> whole_line())+) " "*<2, 2> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<4, 4> whole_line())+) " "*<3, 3> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<5, 5> whole_line())+) " "*<4, 4> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<6, 6> whole_line())+) " "*<5, 5> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<7, 7> whole_line())+) " "*<6, 6> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<8, 8> whole_line())+) " "*<7, 7> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<9, 9> whole_line())+) " "*<8, 8> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<10, 10> whole_line())+) " "*<9, 9> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<11, 11> whole_line())+) " "*<10, 10> "|||" {deent(str)}
-			/ "|||" (!['\n']single_whitespace())* "\n" str:$((" "*<12, 12> whole_line())+) " "*<11, 10> "|||" {deent(str)}
+			/ string_block()
 
 		pub rule field_name(s: &ParserSettings) -> expr::FieldName
 			= name:id() {expr::FieldName::Fixed(name)}
@@ -342,8 +334,8 @@
 	#[test]
 	fn multiline_string() {
 		assert_eq!(
-			parse!("|||\n      Hello world!\n  a\n|||"),
-			el!(Expr::Str("    Hello world!\na\n".to_owned())),
+			parse!("|||\n    Hello world!\n     a\n|||"),
+			el!(Expr::Str("Hello world!\n a\n".to_owned())),
 		)
 	}
 
deletedcrates/jsonnet-parser/src/string_processing.rsdiffbeforeafterboth

no changes