Skip to content
This repository was archived by the owner on Jan 19, 2019. It is now read-only.

Commit 8bf96c5

Browse files
committed
[FIX] generic-type-naming for abstract classes
1 parent 4e908f1 commit 8bf96c5

File tree

4 files changed

+122
-54
lines changed

4 files changed

+122
-54
lines changed

lib/rules/generic-type-naming.js

Lines changed: 16 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,12 @@
11
/**
22
* @fileoverview Enforces naming of generic type variables.
3+
* @author Roman Vasilev
4+
* @author Armano <https://github.com/armano2>
35
*/
46
"use strict";
57

68
const util = require("../util");
79

8-
/**
9-
*
10-
* @param {any} context ESLint context
11-
* @param {string} rule Option
12-
* @returns {Function} Node's visitor function
13-
*/
14-
function createTypeParameterChecker(context, rule) {
15-
const regex = new RegExp(rule);
16-
17-
return function checkTypeParameters(pnode) {
18-
const params = pnode.typeParameters && pnode.typeParameters.params;
19-
20-
if (!Array.isArray(params) || params.length === 0) {
21-
return;
22-
}
23-
params.forEach(node => {
24-
const type = node.type;
25-
26-
if (type === "TSTypeParameter" || type === "TypeParameter") {
27-
const name = node.name;
28-
29-
if (name && !regex.test(name)) {
30-
const data = { name, rule };
31-
32-
context.report({
33-
node,
34-
messageId: "paramNotMatchRule",
35-
data,
36-
});
37-
}
38-
}
39-
});
40-
};
41-
}
42-
4310
module.exports = {
4411
meta: {
4512
docs: {
@@ -60,16 +27,22 @@ module.exports = {
6027
return {};
6128
}
6229

63-
const checkTypeParameters = createTypeParameterChecker(context, rule);
30+
const regex = new RegExp(rule);
6431

6532
return {
66-
VariableDeclarator: checkTypeParameters,
67-
ClassDeclaration: checkTypeParameters,
68-
InterfaceDeclaration: checkTypeParameters,
69-
TSInterfaceDeclaration: checkTypeParameters,
70-
FunctionDeclaration: checkTypeParameters,
71-
TSCallSignature: checkTypeParameters,
72-
CallSignature: checkTypeParameters,
33+
TSTypeParameter(node) {
34+
const name = node.name;
35+
36+
if (name && !regex.test(name)) {
37+
const data = { name, rule };
38+
39+
context.report({
40+
node,
41+
messageId: "paramNotMatchRule",
42+
data,
43+
});
44+
}
45+
},
7346
};
7447
},
7548
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
},
2323
"dependencies": {
2424
"requireindex": "^1.2.0",
25-
"typescript-eslint-parser": "21.0.2"
25+
"typescript-eslint-parser": "git+https://github.com/armano2/typescript-eslint-parser.git#42f1801cdc9e26b271ab8ad7f8399669118ff34b"
2626
},
2727
"devDependencies": {
2828
"eslint": "^5.9.0",

tests/lib/rules/generic-type-naming.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/**
2+
* @fileoverview Enforces naming of generic type variables.
3+
* @author Roman Vasilev
4+
* @author Armano <https://github.com/armano2>
5+
*/
16
"use strict";
27

38
//------------------------------------------------------------------------------
@@ -23,6 +28,21 @@ ruleTester.run("generic-type-naming", rule, {
2328
{ code: "function get<T>() {}", options: [] },
2429
{ code: "interface GenericIdentityFn { <T>(arg: T): T }", options: [] },
2530
{ code: "class<x> { }", options: ["^x+$"] },
31+
{ code: "class<A> { }", options: ["^[A-Z]$"] },
32+
{
33+
code: "class<A> extends B<Test> implements Foo<Test> { }",
34+
options: ["^[A-Z]$"],
35+
},
36+
{
37+
code: `
38+
class<A> extends B<Test> implements Foo<Test> {
39+
test<Z> () {
40+
type Foo = Bar<Test>
41+
}
42+
}
43+
`,
44+
options: ["^[A-Z]$"],
45+
},
2646
{
2747
code: "class CounterContainer extends Container<Counter> { }",
2848
options: ["^T$"],
@@ -36,6 +56,8 @@ ruleTester.run("generic-type-naming", rule, {
3656
{
3757
messageId: "paramNotMatchRule",
3858
data: { name: "x", rule: "^[A-Z]+$" },
59+
line: 1,
60+
column: 7,
3961
},
4062
],
4163
},
@@ -46,6 +68,8 @@ ruleTester.run("generic-type-naming", rule, {
4668
{
4769
messageId: "paramNotMatchRule",
4870
data: { name: "x", rule: "^[A-Z]+$" },
71+
line: 1,
72+
column: 21,
4973
},
5074
],
5175
},
@@ -56,6 +80,8 @@ ruleTester.run("generic-type-naming", rule, {
5680
{
5781
messageId: "paramNotMatchRule",
5882
data: { name: "x", rule: "^[A-Z]+$" },
83+
line: 1,
84+
column: 8,
5985
},
6086
],
6187
},
@@ -66,6 +92,8 @@ ruleTester.run("generic-type-naming", rule, {
6692
{
6793
messageId: "paramNotMatchRule",
6894
data: { name: "x", rule: "^[A-Z]+$" },
95+
line: 1,
96+
column: 14,
6997
},
7098
],
7199
},
@@ -76,6 +104,74 @@ ruleTester.run("generic-type-naming", rule, {
76104
{
77105
messageId: "paramNotMatchRule",
78106
data: { name: "x", rule: "^[A-Z]+$" },
107+
line: 1,
108+
column: 32,
109+
},
110+
],
111+
},
112+
{
113+
code: `
114+
class<A> extends B<Test> implements Foo<Test> {
115+
test<Z> () {
116+
type Foo<T> = Bar<Test>
117+
}
118+
}
119+
`,
120+
options: ["^[A-Z][0-9]$"],
121+
errors: [
122+
{
123+
messageId: "paramNotMatchRule",
124+
data: { name: "A", rule: "^[A-Z][0-9]$" },
125+
line: 2,
126+
column: 7,
127+
},
128+
{
129+
messageId: "paramNotMatchRule",
130+
data: { name: "Z", rule: "^[A-Z][0-9]$" },
131+
line: 3,
132+
column: 10,
133+
},
134+
{
135+
messageId: "paramNotMatchRule",
136+
data: { name: "T", rule: "^[A-Z][0-9]$" },
137+
line: 4,
138+
column: 18,
139+
},
140+
],
141+
},
142+
{
143+
code: `
144+
abstract class<A, B> extends B<Test> implements Foo<Test> {
145+
test<Z> () {
146+
type Foo<T> = Bar<Test>
147+
}
148+
}
149+
`,
150+
options: ["^[A-Z][0-9]$"],
151+
errors: [
152+
{
153+
messageId: "paramNotMatchRule",
154+
data: { name: "A", rule: "^[A-Z][0-9]$" },
155+
line: 2,
156+
column: 16,
157+
},
158+
{
159+
messageId: "paramNotMatchRule",
160+
data: { name: "B", rule: "^[A-Z][0-9]$" },
161+
line: 2,
162+
column: 19,
163+
},
164+
{
165+
messageId: "paramNotMatchRule",
166+
data: { name: "Z", rule: "^[A-Z][0-9]$" },
167+
line: 3,
168+
column: 10,
169+
},
170+
{
171+
messageId: "paramNotMatchRule",
172+
data: { name: "T", rule: "^[A-Z][0-9]$" },
173+
line: 4,
174+
column: 18,
79175
},
80176
],
81177
},

yarn.lock

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2472,7 +2472,7 @@ require-uncached@^1.0.3:
24722472
caller-path "^0.1.0"
24732473
resolve-from "^1.0.0"
24742474

2475-
requireindex@~1.2.0:
2475+
requireindex@^1.2.0:
24762476
version "1.2.0"
24772477
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
24782478
integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
@@ -2976,15 +2976,6 @@ typedarray@^0.0.6:
29762976
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
29772977
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
29782978

2979-
typescript-eslint-parser@21.0.2:
2980-
version "21.0.2"
2981-
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-21.0.2.tgz#270af10e4724528677fbcf34ea495284bec3a894"
2982-
integrity sha512-u+pj4RVJBr4eTzj0n5npoXD/oRthvfUCjSKndhNI714MG0mQq2DJw5WP7qmonRNIFgmZuvdDOH3BHm9iOjIAfg==
2983-
dependencies:
2984-
eslint-scope "^4.0.0"
2985-
eslint-visitor-keys "^1.0.0"
2986-
typescript-estree "5.3.0"
2987-
29882979
typescript-eslint-parser@^16.0.0:
29892980
version "16.0.1"
29902981
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-16.0.1.tgz#b40681c7043b222b9772748b700a000b241c031b"
@@ -2993,6 +2984,14 @@ typescript-eslint-parser@^16.0.0:
29932984
lodash.unescape "4.0.1"
29942985
semver "5.5.0"
29952986

2987+
"typescript-eslint-parser@git+https://github.com/armano2/typescript-eslint-parser.git#42f1801cdc9e26b271ab8ad7f8399669118ff34b":
2988+
version "21.0.2"
2989+
resolved "git+https://github.com/armano2/typescript-eslint-parser.git#42f1801cdc9e26b271ab8ad7f8399669118ff34b"
2990+
dependencies:
2991+
eslint-scope "^4.0.0"
2992+
eslint-visitor-keys "^1.0.0"
2993+
typescript-estree "5.3.0"
2994+
29962995
typescript-estree@5.3.0:
29972996
version "5.3.0"
29982997
resolved "https://registry.yarnpkg.com/typescript-estree/-/typescript-estree-5.3.0.tgz#fb6c977b5e21073eb16cbdc0338a7f752da99ff5"

0 commit comments

Comments
 (0)