|
4 | 4 | */ |
5 | 5 | "use strict"; |
6 | 6 |
|
| 7 | +//------------------------------------------------------------------------------ |
| 8 | +// Helpers |
| 9 | +//------------------------------------------------------------------------------ |
| 10 | + |
| 11 | +const TYPE_NODES = new Set([ |
| 12 | + "TSTypeReference", |
| 13 | + "TSInterfaceHeritage", |
| 14 | + "TSClassImplements", |
| 15 | + "TSTypeQuery", |
| 16 | + "TSQualifiedName", |
| 17 | +]); |
| 18 | + |
7 | 19 | //------------------------------------------------------------------------------ |
8 | 20 | // Rule Definition |
9 | 21 | //------------------------------------------------------------------------------ |
10 | 22 |
|
11 | 23 | /** @type {import('../types').Rule.RuleModule} */ |
12 | 24 | module.exports = { |
13 | 25 | meta: { |
| 26 | + dialects: ["javascript", "typescript"], |
| 27 | + language: "javascript", |
14 | 28 | type: "suggestion", |
15 | 29 |
|
16 | 30 | docs: { |
@@ -100,20 +114,39 @@ module.exports = { |
100 | 114 | return Object.hasOwn(restrictedGlobalMessages, name); |
101 | 115 | } |
102 | 116 |
|
| 117 | + /** |
| 118 | + * Check if the given reference occurs within a TypeScript type context. |
| 119 | + * @param {Reference} reference The variable reference to check. |
| 120 | + * @returns {boolean} Whether the reference is in a type context. |
| 121 | + * @private |
| 122 | + */ |
| 123 | + function isInTypeContext(reference) { |
| 124 | + const parent = reference.identifier.parent; |
| 125 | + |
| 126 | + return TYPE_NODES.has(parent.type); |
| 127 | + } |
| 128 | + |
103 | 129 | return { |
104 | 130 | Program(node) { |
105 | 131 | const scope = sourceCode.getScope(node); |
106 | 132 |
|
107 | 133 | // Report variables declared elsewhere (ex: variables defined as "global" by eslint) |
108 | 134 | scope.variables.forEach(variable => { |
109 | 135 | if (!variable.defs.length && isRestricted(variable.name)) { |
110 | | - variable.references.forEach(reportReference); |
| 136 | + variable.references.forEach(reference => { |
| 137 | + if (!isInTypeContext(reference)) { |
| 138 | + reportReference(reference); |
| 139 | + } |
| 140 | + }); |
111 | 141 | } |
112 | 142 | }); |
113 | 143 |
|
114 | 144 | // Report variables not declared at all |
115 | 145 | scope.through.forEach(reference => { |
116 | | - if (isRestricted(reference.identifier.name)) { |
| 146 | + if ( |
| 147 | + isRestricted(reference.identifier.name) && |
| 148 | + !isInTypeContext(reference) |
| 149 | + ) { |
117 | 150 | reportReference(reference); |
118 | 151 | } |
119 | 152 | }); |
|
0 commit comments