fix(compiler-core): properly handle for loop variable declarations in… · vuejs/core@67bb820 (original) (raw)
`@@ -2,6 +2,9 @@
`
2
2
`// do not import runtime methods
`
3
3
`import type {
`
4
4
`BlockStatement,
`
``
5
`+
ForInStatement,
`
``
6
`+
ForOfStatement,
`
``
7
`+
ForStatement,
`
5
8
`Function,
`
6
9
`Identifier,
`
7
10
`Node,
`
`@@ -81,6 +84,10 @@ export function walkIdentifiers(
`
81
84
`for (const id of extractIdentifiers(node.param)) {
`
82
85
`markScopeIdentifier(node, id, knownIds)
`
83
86
`}
`
``
87
`+
} else if (isForStatement(node)) {
`
``
88
`+
walkForStatement(node, false, id =>
`
``
89
`+
markScopeIdentifier(node, id, knownIds),
`
``
90
`+
)
`
84
91
`}
`
85
92
`},
`
86
93
`leave(node: Node & { scopeIds?: Set }, parent: Node | null) {
`
`@@ -196,18 +203,36 @@ export function walkBlockDeclarations(
`
196
203
`) {
`
197
204
`if (stmt.declare || !stmt.id) continue
`
198
205
`onIdent(stmt.id)
`
199
``
`-
} else if (
`
200
``
`-
stmt.type === 'ForOfStatement' ||
`
201
``
`-
stmt.type === 'ForInStatement' ||
`
202
``
`-
stmt.type === 'ForStatement'
`
203
``
`-
) {
`
204
``
`-
const variable = stmt.type === 'ForStatement' ? stmt.init : stmt.left
`
205
``
`-
if (variable && variable.type === 'VariableDeclaration') {
`
206
``
`-
for (const decl of variable.declarations) {
`
207
``
`-
for (const id of extractIdentifiers(decl.id)) {
`
208
``
`-
onIdent(id)
`
209
``
`-
}
`
210
``
`-
}
`
``
206
`+
} else if (isForStatement(stmt)) {
`
``
207
`+
walkForStatement(stmt, true, onIdent)
`
``
208
`+
}
`
``
209
`+
}
`
``
210
`+
}
`
``
211
+
``
212
`+
function isForStatement(
`
``
213
`+
stmt: Node,
`
``
214
`+
): stmt is ForStatement | ForOfStatement | ForInStatement {
`
``
215
`+
return (
`
``
216
`+
stmt.type === 'ForOfStatement' ||
`
``
217
`+
stmt.type === 'ForInStatement' ||
`
``
218
`+
stmt.type === 'ForStatement'
`
``
219
`+
)
`
``
220
`+
}
`
``
221
+
``
222
`+
function walkForStatement(
`
``
223
`+
stmt: ForStatement | ForOfStatement | ForInStatement,
`
``
224
`+
isVar: boolean,
`
``
225
`+
onIdent: (id: Identifier) => void,
`
``
226
`+
) {
`
``
227
`+
const variable = stmt.type === 'ForStatement' ? stmt.init : stmt.left
`
``
228
`+
if (
`
``
229
`+
variable &&
`
``
230
`+
variable.type === 'VariableDeclaration' &&
`
``
231
`+
(variable.kind === 'var' ? isVar : !isVar)
`
``
232
`+
) {
`
``
233
`+
for (const decl of variable.declarations) {
`
``
234
`+
for (const id of extractIdentifiers(decl.id)) {
`
``
235
`+
onIdent(id)
`
211
236
`}
`
212
237
`}
`
213
238
`}
`