git.delta.rocks / jrsonnet / refs/commits / 42f993d5b82c

difftreelog

fix(rowan) unary plus

msnwnxvoYaroslav Bolyukin2026-05-08parent: #5b43fa8.patch.diff
in: master

5 files changed

modifiedcrates/jrsonnet-rowan-parser/jsonnet.ungramdiffbeforeafterboth
after · crates/jrsonnet-rowan-parser/jsonnet.ungram
1// This file describes structure of jsonnet source code2// It is also used to generate files in src/generated34// Token names ending with `!` are considered meta, and handled specifically56SourceFile = Expr78SuffixIndex =9    '?'?10    '.'11    index:Name12SuffixIndexExpr =13    ('?' '.')?14    '['15    index:Expr16    ']'17SuffixSlice =18    SliceDesc19SuffixApply =20    ArgsDesc21    'tailstrict'?22Suffix =23    SuffixIndex24|   SuffixIndexExpr25|   SuffixSlice26|   SuffixApply2728StmtLocal =29    'local'30    (Bind (',' Bind)* ','?)31    ';'32StmtAssert =33    Assertion34    ';'35Stmt =36    StmtLocal37|   StmtAssert3839ExprBinary =40    lhs:Expr41    BinaryOperator42    rhs:Expr43ExprUnary =44    UnaryOperator45    rhs:Expr46ExprObjExtend =47    lhs:Expr48    rhs:Expr49ExprParened =50    '('51    Expr52    ')'5354ExprLiteral =55    Literal56ExprString =57    Text58ExprNumber =59    Number60ExprArray =61    '['62    (Expr (',' Expr)* ','?)?63    ']'64ExprObject =65    ObjBody66ExprArrayComp =67    '['68    Expr69    ','?70    CompSpec*71    ']'7273ExprImport =74    ImportKind Text7576ImportKind =77    'importstr'78|   'importbin'79|   'import'8081ExprVar =82    name:Name8384ExprIfThenElse =85    'if'86    cond:Expr87    'then'88    then:TrueExpr89    ('else' else_:FalseExpr)?9091ExprFunction =92    'function'93    '('94    ParamsDesc95    ')'96    Expr97ExprError =98    'error'99    Expr100101Expr =102    Stmt*103    ExprBase104    Suffix*105106ExprBase =107    ExprBinary108|   ExprUnary109|   ExprObjExtend110|   ExprParened111|   ExprString112|   ExprNumber113|   ExprLiteral114|   ExprArray115|   ExprObject116|   ExprArrayComp117|   ExprImport118|   ExprVar119|   ExprIfThenElse120|   ExprFunction121|   ExprError122123BinaryOperator =124    '||' | '??' | '&&'125|   '|' | '^' | '&'126|   '==' | '!=' | '<' | '>' | '<=' | '>=' | 'in'127|   '<<' | '>>'128|   '+' | '-'129|   '*' | '/' | '%'130|   'META_OBJECT_APPLY!'131|   'ERROR_NO_OPERATOR!'132133UnaryOperator =134    '-' | '!' | '~' | '+'135136SliceDescEnd=Expr137SliceDescStep=Expr138SliceDesc =139    '['140    from:Expr?141    ':'142    (143        end:SliceDescEnd?144        (145            ':'146            step:SliceDescStep?147        )?148    )?149    ']'150151Name =152    'LIT_IDENT!'153154ArgsDesc =155    '('156    (Arg (',' Arg)* ','?)?157    ')'158Arg =159    (name:Name '=')? Expr160161ObjBodyComp =162    '{'163    (MemberComp (',' MemberComp)* ','?)?164    CompSpec*165    '}'166ObjBodyMemberList =167    '{'168    (Member (',' Member)* ','?)?169    '}'170ObjBody =171    ObjBodyComp172|   ObjBodyMemberList173174MemberBindStmt = ObjLocal175MemberAssertStmt = Assertion176MemberFieldNormal =177    FieldName178    '+'?179    Visibility180    Expr181MemberFieldMethod =182    FieldName183    ParamsDesc184    Visibility185    Expr186MemberComp =187    MemberBindStmt188|    MemberFieldNormal189|   MemberFieldMethod190Member =191    MemberBindStmt192|   MemberAssertStmt193|   MemberFieldNormal194|   MemberFieldMethod195196ObjLocal =197    'local'198    Bind199200FieldNameFixed =201    id:Name202|   Text203FieldNameDynamic =204    '['205    Expr206    ']'207FieldName =208    FieldNameFixed209|   FieldNameDynamic210211Visibility =212    ':' ':'? ':'?213214Literal =215    'null'216|   'true'217|   'false'218|   'self'219|   '$'220|   'super'221222Text =223    'LIT_STRING_DOUBLE!'224|   'ERROR_STRING_DOUBLE_UNTERMINATED!'225|   'LIT_STRING_SINGLE!'226|   'ERROR_STRING_SINGLE_UNTERMINATED!'227|   'LIT_STRING_DOUBLE_VERBATIM!'228|   'ERROR_STRING_DOUBLE_VERBATIM_UNTERMINATED!'229|   'LIT_STRING_SINGLE_VERBATIM!'230|   'ERROR_STRING_SINGLE_VERBATIM_UNTERMINATED!'231|   'ERROR_STRING_VERBATIM_MISSING_QUOTES!'232|   'LIT_STRING_BLOCK!'233|   'ERROR_STRING_BLOCK_UNEXPECTED_END!'234|   'ERROR_STRING_BLOCK_MISSING_NEW_LINE!'235|   'ERROR_STRING_BLOCK_MISSING_TERMINATION!'236|   'ERROR_STRING_BLOCK_MISSING_INDENT!'237238Number =239    'LIT_FLOAT!'240|   'ERROR_FLOAT_JUNK_AFTER_POINT!'241|   'ERROR_FLOAT_JUNK_AFTER_EXPONENT!'242|   'ERROR_FLOAT_JUNK_AFTER_EXPONENT_SIGN!'243244ForSpec =245    'for'246    bind:Destruct247    'in'248    Expr249ForObjSpec =250    'for'251    '['252    key:Name253    ']'254    Visibility255    value:Destruct256    'in'257    Expr258IfSpec =259    'if'260    Expr261CompSpec =262    ForSpec263|   ForObjSpec264|   IfSpec265266BindDestruct =267    into:Destruct268    '='269    value:Expr270BindFunction =271    name:Name272    params:ParamsDesc273    '='274    value:Expr275Bind =276    BindDestruct277|   BindFunction278279ParamsDesc =280    '('281    (Param (',' Param)* ','?)?282    ')'283Param =284    Destruct285    (286        '='287        Expr288    )?289290Assertion =291    'assert'292    condition:Expr293    (294        ':'295        message:Expr296    )?297298DestructFull =299    Name300DestructSkip =301    '?'302DestructArray =303    '['304    (305        DestructArrayPart306        (',' DestructArrayPart)*307        ','?308    )?309    ']'310DestructObject =311    '{'312    (313        DestructObjectField314        (',' DestructObjectField)*315        ','?316    )?317    DestructRest?318    ','?319    '}'320Destruct =321    DestructFull322|   DestructSkip323|   DestructArray324|   DestructObject325326DestructArrayElement =327    Destruct328DestructArrayPart =329    DestructArrayElement330|   DestructRest331332DestructRest =333    '...'334    into:Name?335336DestructObjectField =337    field:Name338    (339        ':'340        Destruct341    )?342    (343        '='344        Expr345    )?346347// Aliases used to resolve node type conflicts348TrueExpr=Expr349FalseExpr=Expr350351// Trivia - tokens which will be implicitly skipped for parser352Trivia =353    'LIT_WHITESPACE!'354|   'LIT_MULTI_LINE_COMMENT!'355|   'ERROR_COMMENT_TOO_SHORT!'356|   'ERROR_COMMENT_UNTERMINATED!'357|   'LIT_SINGLE_LINE_HASH_COMMENT!'358|   'LIT_SINGLE_LINE_SLASH_COMMENT!'359360CustomError =361    'ERROR_MISSING_TOKEN!'362|   'ERROR_UNEXPECTED_TOKEN!'363|   'ERROR_CUSTOM!'
modifiedcrates/jrsonnet-rowan-parser/src/generated/nodes.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
+++ b/crates/jrsonnet-rowan-parser/src/generated/nodes.rs
@@ -977,6 +977,7 @@
 	Minus,
 	Not,
 	BitNot,
+	Plus,
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -2494,7 +2495,7 @@
 impl UnaryOperatorKind {
 	fn can_cast(kind: SyntaxKind) -> bool {
 		match kind {
-			MINUS | NOT | BIT_NOT => true,
+			MINUS | NOT | BIT_NOT | PLUS => true,
 			_ => false,
 		}
 	}
@@ -2503,6 +2504,7 @@
 			MINUS => Self::Minus,
 			NOT => Self::Not,
 			BIT_NOT => Self::BitNot,
+			PLUS => Self::Plus,
 			_ => return None,
 		};
 		Some(res)
modifiedcrates/jrsonnet-rowan-parser/src/precedence.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/precedence.rs
+++ b/crates/jrsonnet-rowan-parser/src/precedence.rs
@@ -22,7 +22,7 @@
 impl UnaryOperatorKind {
 	pub fn binding_power(&self) -> ((), u8) {
 		match self {
-			Self::Minus | Self::Not | Self::BitNot => ((), 20),
+			Self::Minus | Self::Not | Self::BitNot | Self::Plus => ((), 20),
 		}
 	}
 }
modifiedcrates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snapdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snap
+++ b/crates/jrsonnet-rowan-parser/src/snapshots/jrsonnet_rowan_parser__tests__no_lhs.snap
@@ -1,12 +1,13 @@
 ---
 source: crates/jrsonnet-rowan-parser/src/tests.rs
-expression: "+ 2\n"
+assertion_line: 60
+expression: "* 2\n"
 ---
 SOURCE_FILE@0..4
   EXPR@0..0
     ERROR_MISSING_TOKEN@0..0
   ERROR_CUSTOM@0..3
-    PLUS@0..1 "+"
+    MUL@0..1 "*"
     WHITESPACE@1..2 " "
     FLOAT@2..3 "2"
   WHITESPACE@3..4 "\n"
@@ -15,5 +16,5 @@
 LocatedSyntaxError { error: Custom { error: "unexpected tokens after end" }, range: 0..3 }
 ===
    · ╭── missing expression
-1  │ + 2
+1  │ * 2
    · ╰───── unexpected tokens after end
modifiedcrates/jrsonnet-rowan-parser/src/tests.rsdiffbeforeafterboth
--- a/crates/jrsonnet-rowan-parser/src/tests.rs
+++ b/crates/jrsonnet-rowan-parser/src/tests.rs
@@ -85,7 +85,7 @@
 		a +
 	"#
 	no_lhs => r#"
-		+ 2
+		* 2
 	"#
 	no_operator => "
 		2 2