Skip to content

Commit b434ff9

Browse files
michalsnikmysticatea
authored andcommitted
Fix: no-unused-vars rule false positive (fixes #294)(#302)
1 parent dc61f9d commit b434ff9

File tree

3 files changed

+44
-21
lines changed

3 files changed

+44
-21
lines changed

docs/rules/no-unused-vars.md

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ This rule report variable definitions of v-for directives or scope attributes if
88

99
```html
1010
<template>
11-
<ol v-for="i in 5"><!-- "i" is defined but never used. -->
12-
<li>item</li>
13-
</ol>
11+
<ol v-for="i in 5"><!-- "i" is defined but never used. -->
12+
<li>item</li>
13+
</ol>
1414
</template>
1515
```
1616

1717
:+1: Examples of **correct** code for this rule:
1818

1919
```html
2020
<template>
21-
<ol v-for="i in 5">
22-
<li>{{i}}</li><!-- "i" is defined and used. -->
23-
</ol>
21+
<ol v-for="i in 5">
22+
<li>{{i}}</li><!-- "i" is defined and used. -->
23+
</ol>
2424
</template>
2525
```
2626

lib/rules/no-unused-vars.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,20 @@ const utils = require('../utils')
1515
function create (context) {
1616
return utils.defineTemplateBodyVisitor(context, {
1717
VElement (node) {
18-
for (const variable of node.variables) {
19-
if (variable.references.length === 0) {
20-
context.report({
21-
node: variable.id,
22-
loc: variable.id.loc,
23-
message: `'{{name}}' is defined but never used.`,
24-
data: variable.id
25-
})
26-
}
18+
const variables = node.variables
19+
20+
for (
21+
let i = variables.length - 1;
22+
i >= 0 && !variables[i].references.length;
23+
i--
24+
) {
25+
const variable = variables[i]
26+
context.report({
27+
node: variable.id,
28+
loc: variable.id.loc,
29+
message: `'{{name}}' is defined but never used.`,
30+
data: variable.id
31+
})
2732
}
2833
}
2934
})

tests/lib/rules/no-unused-vars.js

+24-6
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,46 @@ tester.run('no-unused-vars', rule, {
4040
},
4141
{
4242
code: '<template scope="props"><span v-if="props"></span></template>'
43+
},
44+
{
45+
code: '<template><div v-for="(item, key) in items" :key="key">{{item.name}}</div></template>'
46+
},
47+
{
48+
code: '<template><div v-for="(v, i, c) in foo">{{c}}</div></template>'
4349
}
4450
],
4551
invalid: [
4652
{
4753
code: '<template><ol v-for="i in 5"><li></li></ol></template>',
48-
errors: ['\'i\' is defined but never used.']
54+
errors: ["'i' is defined but never used."]
4955
},
5056
{
5157
code: '<template scope="props"></template>',
52-
errors: ['\'props\' is defined but never used.']
58+
errors: ["'props' is defined but never used."]
5359
},
5460
{
5561
code: '<template v-for="i in 5"><comp v-for="j in 10">{{i}}{{i}}</comp></template>',
56-
errors: ['\'j\' is defined but never used.']
62+
errors: ["'j' is defined but never used."]
5763
},
5864
{
5965
code: '<template><ol v-for="i in data"><li v-for="f in i"></li></ol></template>',
60-
errors: ['\'f\' is defined but never used.']
66+
errors: ["'f' is defined but never used."]
67+
},
68+
{
69+
code: '<template><div v-for="(a, b, c) in foo"></div></template>',
70+
errors: ["'a' is defined but never used.", "'b' is defined but never used.", "'c' is defined but never used."]
71+
},
72+
{
73+
code: '<template><div v-for="(a, b, c) in foo">{{a}}</div></template>',
74+
errors: ["'b' is defined but never used.", "'c' is defined but never used."]
75+
},
76+
{
77+
code: '<template><div v-for="(a, b, c) in foo">{{b}}</div></template>',
78+
errors: ["'c' is defined but never used."]
6179
},
6280
{
63-
code: '<template><div v-for="(v, i, c) in foo"></div></template>',
64-
errors: ['\'v\' is defined but never used.', '\'i\' is defined but never used.', '\'c\' is defined but never used.']
81+
code: '<template><div v-for="(item, key) in items" :key="item.id">{{item.name}}</div></template>',
82+
errors: ["'key' is defined but never used."]
6583
}
6684
]
6785
})

0 commit comments

Comments
 (0)