Skip to content

Commit 103285c

Browse files
committed
fix: insert semi before ExpressionStatement
1 parent 54fc690 commit 103285c

File tree

4 files changed

+66
-2
lines changed

4 files changed

+66
-2
lines changed

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
tests/fixtures/basic.js

src/core/index.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
getLang,
44
isCallOf,
55
isFunctionType,
6+
isTypeOf,
67
walkAST,
78
walkImportDeclaration,
89
type ImportBinding,
@@ -38,11 +39,46 @@ export function transformQuansync(
3839

3940
const s = new MagicString(code)
4041
const functionScopes: boolean[] = []
42+
const nodeStack: t.Node[] = []
43+
44+
function findUpExpressionStatement(): t.ExpressionStatement | undefined {
45+
for (let i = nodeStack.length - 1; i >= 0; i--) {
46+
const node = nodeStack[i]
47+
if (isFunctionType(node)) return
48+
if (node.type === 'ExpressionStatement') {
49+
return node
50+
}
51+
}
52+
}
53+
54+
function prependSemi(stmt: t.Statement & { semi?: boolean }) {
55+
if (stmt.semi) return
56+
s.prependLeft(stmt.start!, `;`)
57+
stmt.semi = true
58+
}
4159

4260
walkAST<t.Node>(program, {
4361
enter(node, parent) {
62+
nodeStack.push(node)
4463
if (node.type === 'AwaitExpression' && functionScopes.at(-1)) {
45-
s.overwrite(node.start!, node.argument.start!, 'yield ')
64+
const needParen = isTypeOf(parent, [
65+
'UnaryExpression',
66+
'BinaryExpression',
67+
'LogicalExpression',
68+
'TSAsExpression',
69+
'TSSatisfiesExpression',
70+
])
71+
s.overwrite(
72+
node.start!,
73+
node.argument.start!,
74+
`${needParen ? '(' : ''}yield `,
75+
)
76+
if (needParen) {
77+
s.appendLeft(node.end!, ')')
78+
79+
const stmt = findUpExpressionStatement()
80+
if (stmt) prependSemi(stmt)
81+
}
4682
return
4783
}
4884

@@ -78,6 +114,7 @@ export function transformQuansync(
78114
}
79115
},
80116
leave(node) {
117+
nodeStack.pop()
81118
if (isFunctionType(node)) {
82119
functionScopes.pop()
83120
}

tests/__snapshots__/transform.test.ts.snap

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,20 @@ return function* () {
9494
}.call(this)
9595
})
9696
97+
quansync(() => {
98+
return function* () {
99+
// prettier-ignore
100+
;!(yield 1)
101+
// prettier-ignore
102+
;'' + (yield 1)
103+
// prettier-ignore
104+
;false && (yield 1)
105+
fn7()
106+
;(yield 1) < (yield 10)
107+
const x = (yield 1) < (yield 10)
108+
}.call(this)
109+
})
110+
97111
export default async () => {
98112
await expect(getNumber(1)).resolves.toBe(1)
99113
expect(getNumber.sync(1)).toBe(1)
@@ -119,7 +133,7 @@ const echoNewLine = quansync(
119133
/** @param {string|Promise<string>} v */ (v) =>
120134
{
121135
return function* () {
122-
return (yield echo(yield v)) + '\\n'
136+
return ((yield echo(yield v))) + '\\n'
123137
}.call(this)
124138
},
125139
)

tests/fixtures/basic.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,18 @@ export const fn7 = quansync(async () => {
5656
}
5757
})
5858

59+
quansync(async () => {
60+
// prettier-ignore
61+
!await 1
62+
// prettier-ignore
63+
'' + await 1
64+
// prettier-ignore
65+
false && await 1
66+
fn7()
67+
await 1 < await 10
68+
const x = await 1 < await 10
69+
})
70+
5971
export default async () => {
6072
await expect(getNumber(1)).resolves.toBe(1)
6173
expect(getNumber.sync(1)).toBe(1)

0 commit comments

Comments
 (0)