Skip to content

Commit 9fce04e

Browse files
mysticateanzakas
authored andcommitted
Fix: generator-star-spacing false positive (fixes #6135) (#6168)
1 parent 6f2edba commit 9fce04e

File tree

2 files changed

+149
-3
lines changed

2 files changed

+149
-3
lines changed

lib/rules/generator-star-spacing.js

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,24 @@ module.exports = {
5454

5555
var sourceCode = context.getSourceCode();
5656

57+
/**
58+
* Gets `*` token from a given node.
59+
*
60+
* @param {ASTNode} node - A node to get `*` token. This is one of
61+
* FunctionDeclaration, FunctionExpression, Property, and
62+
* MethodDefinition.
63+
* @returns {Token} `*` token.
64+
*/
65+
function getStarToken(node) {
66+
var token = sourceCode.getFirstToken(node);
67+
68+
while (token.value !== "*") {
69+
token = sourceCode.getTokenAfter(token);
70+
}
71+
72+
return token;
73+
}
74+
5775
/**
5876
* Checks the spacing between two tokens before or after the star token.
5977
* @param {string} side Either "before" or "after".
@@ -100,12 +118,12 @@ module.exports = {
100118
}
101119

102120
if (node.parent.method || node.parent.type === "MethodDefinition") {
103-
starToken = sourceCode.getTokenBefore(node, 1);
121+
starToken = getStarToken(node.parent);
104122
} else {
105-
starToken = sourceCode.getFirstToken(node, 1);
123+
starToken = getStarToken(node);
106124
}
107125

108-
// Only check before when preceded by `function` keyword
126+
// Only check before when preceded by `function`|`static` keyword
109127
prevToken = sourceCode.getTokenBefore(starToken);
110128
if (prevToken.value === "function" || prevToken.value === "static") {
111129
checkSpacing("before", prevToken, starToken);

tests/lib/rules/generator-star-spacing.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ ruleTester.run("generator-star-spacing", rule, {
6262
code: "class Foo { static *foo(){} }",
6363
parserOptions: { ecmaVersion: 6 }
6464
},
65+
{
66+
code: "var foo = {*[ foo ](){} };",
67+
parserOptions: { ecmaVersion: 6 }
68+
},
69+
{
70+
code: "class Foo {*[ foo ](){} }",
71+
parserOptions: { ecmaVersion: 6 }
72+
},
6573

6674
// "before"
6775
{
@@ -113,6 +121,16 @@ ruleTester.run("generator-star-spacing", rule, {
113121
options: ["before"],
114122
parserOptions: { ecmaVersion: 6 }
115123
},
124+
{
125+
code: "class Foo {*[ foo ](){} }",
126+
options: ["before"],
127+
parserOptions: { ecmaVersion: 6 }
128+
},
129+
{
130+
code: "var foo = {*[ foo ](){} };",
131+
options: ["before"],
132+
parserOptions: { ecmaVersion: 6 }
133+
},
116134

117135
// "after"
118136
{
@@ -164,6 +182,16 @@ ruleTester.run("generator-star-spacing", rule, {
164182
options: ["after"],
165183
parserOptions: { ecmaVersion: 6 }
166184
},
185+
{
186+
code: "var foo = {* [foo](){} };",
187+
options: ["after"],
188+
parserOptions: { ecmaVersion: 6 }
189+
},
190+
{
191+
code: "class Foo {* [foo](){} }",
192+
options: ["after"],
193+
parserOptions: { ecmaVersion: 6 }
194+
},
167195

168196
// "both"
169197
{
@@ -215,6 +243,16 @@ ruleTester.run("generator-star-spacing", rule, {
215243
options: ["both"],
216244
parserOptions: { ecmaVersion: 6 }
217245
},
246+
{
247+
code: "var foo = {* [foo](){} };",
248+
options: ["both"],
249+
parserOptions: { ecmaVersion: 6 }
250+
},
251+
{
252+
code: "class Foo {* [foo](){} }",
253+
options: ["both"],
254+
parserOptions: { ecmaVersion: 6 }
255+
},
218256

219257
// "neither"
220258
{
@@ -266,6 +304,16 @@ ruleTester.run("generator-star-spacing", rule, {
266304
options: ["neither"],
267305
parserOptions: { ecmaVersion: 6 }
268306
},
307+
{
308+
code: "var foo = {*[ foo ](){} };",
309+
options: ["neither"],
310+
parserOptions: { ecmaVersion: 6 }
311+
},
312+
{
313+
code: "class Foo {*[ foo ](){} }",
314+
options: ["neither"],
315+
parserOptions: { ecmaVersion: 6 }
316+
},
269317

270318
// {"before": true, "after": false}
271319
{
@@ -616,6 +664,26 @@ ruleTester.run("generator-star-spacing", rule, {
616664
type: "Punctuator"
617665
}]
618666
},
667+
{
668+
code: "var foo = {* [ foo ](){} };",
669+
output: "var foo = {*[ foo ](){} };",
670+
options: ["before"],
671+
parserOptions: { ecmaVersion: 6 },
672+
errors: [{
673+
message: "Unexpected space after *.",
674+
type: "Punctuator"
675+
}]
676+
},
677+
{
678+
code: "class Foo {* [ foo ](){} }",
679+
output: "class Foo {*[ foo ](){} }",
680+
options: ["before"],
681+
parserOptions: { ecmaVersion: 6 },
682+
errors: [{
683+
message: "Unexpected space after *.",
684+
type: "Punctuator"
685+
}]
686+
},
619687

620688
// "after"
621689
{
@@ -700,6 +768,26 @@ ruleTester.run("generator-star-spacing", rule, {
700768
type: "Punctuator"
701769
}]
702770
},
771+
{
772+
code: "var foo = { *[foo](){} };",
773+
output: "var foo = { * [foo](){} };",
774+
options: ["after"],
775+
parserOptions: { ecmaVersion: 6 },
776+
errors: [{
777+
message: "Missing space after *.",
778+
type: "Punctuator"
779+
}]
780+
},
781+
{
782+
code: "class Foo { *[foo](){} }",
783+
output: "class Foo { * [foo](){} }",
784+
options: ["after"],
785+
parserOptions: { ecmaVersion: 6 },
786+
errors: [{
787+
message: "Missing space after *.",
788+
type: "Punctuator"
789+
}]
790+
},
703791

704792
// "both"
705793
{
@@ -787,6 +875,26 @@ ruleTester.run("generator-star-spacing", rule, {
787875
type: "Punctuator"
788876
}]
789877
},
878+
{
879+
code: "var foo = {*[foo](){} };",
880+
output: "var foo = {* [foo](){} };",
881+
options: ["both"],
882+
parserOptions: { ecmaVersion: 6 },
883+
errors: [{
884+
message: "Missing space after *.",
885+
type: "Punctuator"
886+
}]
887+
},
888+
{
889+
code: "class Foo {*[foo](){} }",
890+
output: "class Foo {* [foo](){} }",
891+
options: ["both"],
892+
parserOptions: { ecmaVersion: 6 },
893+
errors: [{
894+
message: "Missing space after *.",
895+
type: "Punctuator"
896+
}]
897+
},
790898

791899
// "neither"
792900
{
@@ -874,6 +982,26 @@ ruleTester.run("generator-star-spacing", rule, {
874982
type: "Punctuator"
875983
}]
876984
},
985+
{
986+
code: "var foo = { * [ foo ](){} };",
987+
output: "var foo = { *[ foo ](){} };",
988+
options: ["neither"],
989+
parserOptions: { ecmaVersion: 6 },
990+
errors: [{
991+
message: "Unexpected space after *.",
992+
type: "Punctuator"
993+
}]
994+
},
995+
{
996+
code: "class Foo { * [ foo ](){} }",
997+
output: "class Foo { *[ foo ](){} }",
998+
options: ["neither"],
999+
parserOptions: { ecmaVersion: 6 },
1000+
errors: [{
1001+
message: "Unexpected space after *.",
1002+
type: "Punctuator"
1003+
}]
1004+
},
8771005

8781006
// {"before": true, "after": false}
8791007
{

0 commit comments

Comments
 (0)