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

`}

`