From 96b59b29897c0bd70cadc0f303298458c45faf4e Mon Sep 17 00:00:00 2001 From: CyanM0un <1544130024@qq.com> Date: Fri, 24 Apr 2026 04:17:48 +0000 Subject: [PATCH] Add support for ??=, ||=,&&= --- .../src/frontend/javascript/parser.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/parser-Java-Js/src/frontend/javascript/parser.ts b/parser-Java-Js/src/frontend/javascript/parser.ts index f7563d7..46b0dc6 100644 --- a/parser-Java-Js/src/frontend/javascript/parser.ts +++ b/parser-Java-Js/src/frontend/javascript/parser.ts @@ -337,7 +337,22 @@ const visitor = (opts: any) => ({ return seq; } - return UAST.assignmentExpression(visit(node.left, opts) as UAST.LVal, visit(node.right, opts) as Expression, node.operator as UAST.AssignmentExpression['operator'], false); + const left = visit(node.left, opts) as UAST.LVal; + const right = visit(node.right, opts) as Expression; + + // handle ??=, ||=, &&= + // a ??= b to a = a ?? b, similar for others + if (node.operator === '??=') { + return UAST.assignmentExpression(left, UAST.binaryExpression('??', left, right), '=', false); + } + if (node.operator === '||=') { + return UAST.assignmentExpression(left, UAST.binaryExpression('||', left, right), '=', false); + } + if (node.operator === '&&=') { + return UAST.assignmentExpression(left, UAST.binaryExpression('&&', left, right), '=', false); + } + + return UAST.assignmentExpression(left, right, node.operator as UAST.AssignmentExpression['operator'], false); }, LogicalExpression(node: AST.LogicalExpression): ParseResult { return UAST.binaryExpression(node.operator as UAST.BinaryExpression['operator'], visit(node.left, opts) as Expression, visit(node.right, opts) as Expression);