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

difftreelog

refactor move string unescaping to lexer

lsvkquzlYaroslav Bolyukin2026-05-14parent: #5e8cbcd.patch.diff
in: master

7 files changed

modifiedcrates/jrsonnet-ir-parser/src/lib.rsdiffbeforeafterboth
3 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,3 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BinaryOpType, BindSpec, CompSpec, Destruct, Expr,
4 ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IdentityKind, IfElse,4 ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IdentityKind, IfElse,
5 IfSpecData, ImportKind, IndexPart, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,5 IfSpecData, ImportKind, IndexPart, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,
6 SliceDesc, Source, Span, Spanned, TrivialVal, UnaryOpType, Visibility, unescape,6 SliceDesc, Source, Span, Spanned, TrivialVal, UnaryOpType, Visibility,
7};7};
8use jrsonnet_lexer::{Lexeme, Lexer, Span as LexSpan, SyntaxKind, T, collect_lexed_str_block};8use jrsonnet_lexer::{
9 Lexeme, Lexer, Span as LexSpan, SyntaxKind, T, collect_lexed_str_block, unescape,
10};
911
10pub struct ParserSettings {12pub struct ParserSettings {
11 pub source: Source,13 pub source: Source,
174 let s = match kind {176 let s = match kind {
175 SyntaxKind::STRING_DOUBLE => {177 SyntaxKind::STRING_DOUBLE => {
176 let inner = &text[1..text.len() - 1];178 let inner = &text[1..text.len() - 1];
177 unescape::unescape(inner).ok_or_else(|| p.error("invalid string escape".into()))?179 unescape(inner).ok_or_else(|| p.error("invalid string escape".into()))?
178 }180 }
179 SyntaxKind::STRING_SINGLE => {181 SyntaxKind::STRING_SINGLE => {
180 let inner = &text[1..text.len() - 1];182 let inner = &text[1..text.len() - 1];
181 unescape::unescape(inner).ok_or_else(|| p.error("invalid string escape".into()))?183 unescape(inner).ok_or_else(|| p.error("invalid string escape".into()))?
182 }184 }
183 SyntaxKind::STRING_DOUBLE_VERBATIM => {185 SyntaxKind::STRING_DOUBLE_VERBATIM => {
184 let inner = &text[2..text.len() - 1];186 let inner = &text[2..text.len() - 1];
modifiedcrates/jrsonnet-ir/src/lib.rsdiffbeforeafterboth
9pub mod function;9pub mod function;
10mod location;10mod location;
11mod source;11mod source;
12pub mod unescape;
13pub mod visit;12pub mod visit;
1413
15pub use location::CodeLocation;14pub use location::CodeLocation;
deletedcrates/jrsonnet-ir/src/unescape.rsdiffbeforeafterboth

no changes

modifiedcrates/jrsonnet-lexer/src/lib.rsdiffbeforeafterboth
1mod generated;1mod generated;
2mod lex;2mod lex;
3pub mod string;
3mod string_block;4pub mod string_block;
45
5#[derive(Clone, Copy, Debug)]6#[derive(Clone, Copy, Debug)]
6pub struct Span(pub u32, pub u32);7pub struct Span(pub u32, pub u32);
78
8pub use generated::syntax_kinds::SyntaxKind;9pub use generated::syntax_kinds::SyntaxKind;
9pub use lex::{Lexeme, Lexer, lex};10pub use lex::{Lexeme, Lexer, lex};
11pub use string::unescape;
10pub use string_block::{CollectStrBlock, collect_lexed_str_block};12pub use string_block::{CollectStrBlock, collect_lexed_str_block};
1113
addedcrates/jrsonnet-lexer/src/string.rsdiffbeforeafterboth

no changes

modifiedcrates/jrsonnet-peg-parser/Cargo.tomldiffbeforeafterboth
12[dependencies]12[dependencies]
13jrsonnet-gcmodule.workspace = true13jrsonnet-gcmodule.workspace = true
14jrsonnet-ir.workspace = true14jrsonnet-ir.workspace = true
15jrsonnet-lexer.workspace = true
15peg.workspace = true16peg.workspace = true
1617
17[lints]18[lints]
modifiedcrates/jrsonnet-peg-parser/src/lib.rsdiffbeforeafterboth
3 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, DestructRest, Expr,3 ArgsDesc, AssertExpr, AssertStmt, BinaryOp, BindSpec, CompSpec, Destruct, DestructRest, Expr,
4 ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IdentityKind, IfElse,4 ExprParam, ExprParams, FieldMember, FieldName, ForSpecData, IStr, IdentityKind, IfElse,
5 IfSpecData, ImportKind, IndexPart, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,5 IfSpecData, ImportKind, IndexPart, Member, NumValue, ObjBody, ObjComp, ObjMembers, Slice,
6 SliceDesc, Source, Span, Spanned, TrivialVal, Visibility, unescape,6 SliceDesc, Source, Span, Spanned, TrivialVal, Visibility,
7};7};
8use jrsonnet_lexer::unescape;
8use peg::parser;9use peg::parser;
910
10pub struct ParserSettings {11pub struct ParserSettings {
165 / "\\x" hex_char() hex_char()166 / "\\x" hex_char() hex_char()
166 / ['\\'] (quiet! { ['b' | 'f' | 'n' | 'r' | 't' | '"' | '\''] } / expected!("<escape character>"))167 / ['\\'] (quiet! { ['b' | 'f' | 'n' | 'r' | 't' | '"' | '\''] } / expected!("<escape character>"))
167 pub rule string() -> String168 pub rule string() -> String
168 = ['"'] str:$(string_char(<"\"">)*) ['"'] {? unescape::unescape(str).ok_or("<escaped string>")}169 = ['"'] str:$(string_char(<"\"">)*) ['"'] {? unescape(str).ok_or("<escaped string>")}
169 / ['\''] str:$(string_char(<"\'">)*) ['\''] {? unescape::unescape(str).ok_or("<escaped string>")}170 / ['\''] str:$(string_char(<"\'">)*) ['\''] {? unescape(str).ok_or("<escaped string>")}
170 / quiet!{ "@'" str:$(("''" / (!['\''][_]))*) "'" {str.replace("''", "'")}171 / quiet!{ "@'" str:$(("''" / (!['\''][_]))*) "'" {str.replace("''", "'")}
171 / "@\"" str:$(("\"\"" / (!['"'][_]))*) "\"" {str.replace("\"\"", "\"")}172 / "@\"" str:$(("\"\"" / (!['"'][_]))*) "\"" {str.replace("\"\"", "\"")}
172 / string_block() } / expected!("<string>")173 / string_block() } / expected!("<string>")