Skip to content
This repository was archived by the owner on Oct 30, 2025. It is now read-only.

Commit 2db59a8

Browse files
committed
fix: infer return of the left hand of assignment operator
1 parent c6e456d commit 2db59a8

File tree

6 files changed

+41
-10
lines changed

6 files changed

+41
-10
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @lunarclient/molang
22

3+
## 1.0.10
4+
5+
### Patch Changes
6+
7+
- fix: infer return of the left hand of assignment operator
8+
39
## 1.0.9
410

511
### Patch Changes

__tests__/custom/function.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,6 @@ test('Custom syntax', () => {
135135
`return ({t.__scvar0.length=0;t.__scvar1=t.__scvar0;}+t.__scvar1);`
136136
)
137137
expect(customMolang.transform('f.test_no_return()')).toBe(
138-
`return ({t.__scvar0=0;});`
138+
`return ({t.__scvar0=0;}+t.__scvar1);`
139139
)
140140
})

__tests__/inferReturn.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,15 @@ test('Infer return at end of statement with function', () => {
2626
test('Infer return at end of statement with negative variable', () => {
2727
const statement = `v.y = 10;`
2828

29-
expect(molang.execute(statement)).toBe(0)
29+
expect(molang.execute(statement)).toBe(10)
3030

3131
const statement2 = `-v.y;`
3232

3333
expect(molang.execute(statement2)).toBe(-10)
3434
})
35+
36+
test('Infer return at end of assignment statement', () => {
37+
const statement = `v.z = 10;`
38+
39+
expect(molang.execute(statement)).toBe(10)
40+
})

lib/parser/expressions/genericOperator.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,9 @@ export class GenericOperatorExpression extends Expression {
3535
return `${this.left.toString()}${this.operator}${this.right.toString()}`
3636
}
3737
}
38+
39+
export function isGenericOperatorExpression(
40+
expr: IExpression
41+
): expr is GenericOperatorExpression {
42+
return expr.type === 'GenericOperatorExpression'
43+
}

lib/parser/parselets/statement.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { IInfixParselet } from './infix'
55
import { StatementExpression } from '../expressions/statement'
66
import { StaticExpression } from '../expressions/static'
77
import { ReturnExpression } from '../expressions'
8+
import { isGenericOperatorExpression } from '../expressions/genericOperator'
89

910
export class StatementParselet implements IInfixParselet {
1011
constructor(public precedence = 0) {}
@@ -78,14 +79,26 @@ export class StatementParselet implements IInfixParselet {
7879

7980
// Infer when statement should be returned
8081
if (
81-
!expressions.some((expr) => expr.isReturn) &&
82-
!expressions[expressions.length - 1].isReturn &&
83-
expressions[expressions.length - 1].type !==
84-
'GenericOperatorExpression'
82+
(!expressions.some((expr) => expr.isReturn) ||
83+
!expressions[expressions.length - 1].isReturn) &&
84+
!parser.match('CURLY_RIGHT', false)
8585
) {
86-
expressions[expressions.length - 1] = new ReturnExpression(
87-
expressions[expressions.length - 1]
88-
)
86+
const lastExpression = expressions[expressions.length - 1]
87+
88+
// If the last expression is an assignment then append a return expression
89+
if (
90+
isGenericOperatorExpression(lastExpression) &&
91+
lastExpression.operator === '='
92+
) {
93+
expressions.push(
94+
new ReturnExpression(lastExpression.allExpressions[0])
95+
)
96+
} else {
97+
// Anything else we just return the last expression
98+
expressions[expressions.length - 1] = new ReturnExpression(
99+
lastExpression
100+
)
101+
}
89102
}
90103
}
91104

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lunarclient/molang",
3-
"version": "1.0.9",
3+
"version": "1.0.10",
44
"description": "Lunar Client's fork of bridge-core's molang parser",
55
"main": "lib/main.ts",
66
"files": [

0 commit comments

Comments
 (0)