-
-
Notifications
You must be signed in to change notification settings - Fork 482
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bug(semantic): references on MemberExpression
not recorded
#4446
Comments
enums are special const foo = 2;
const b = 2;
enum Foo {
outer = foo, // foo == 2
a = 1, // 1
b = a, // b == Foo.a == 1 | shadows const b
c = b, // c == Foo.b == Foo.c == 1
} you can read a little about some edge cases at typescript-eslint/typescript-eslint#325 typescript enum behaves like a object and block at the same time, code above compiles to: const foo = 2;
const b = 2;
var Foo;
(function (Foo) {
Foo[Foo["outer"] = 2] = "outer";
Foo[Foo["a"] = 1] = "a";
Foo[Foo["b"] = 1] = "b";
Foo[Foo["c"] = 1] = "c";
})(Foo || (Foo = {})); from no unused vars persepctive we should not care if enum values are read or not. MemberExpression can't be easily referenced, as you would need way more data about structures. eg. // file1.ts
export enum Foo {
test = 1,
unused = 2 // ??
}
// file2.ts
import { Foo } from 'file1.ts'
Foo.test |
I agree with @armano2 that the property of a But the issue of what is a symbol is trickier. In one sense const A = 123;
enum X {
A = 1,
B = A, // refers to `A = 1`
}
enum X {
C = A, // refers to `A = 1`
} If we're treating @armano2 How does I think we probably do need it to be a symbol to make this kind of thing tractable: const A = 123;
enum X {
A = 1,
B = A, // refers to `A = 1`
}
enum X {
C = A, // refers to `A = 1`
D = (() => {
enum Y {
Q = A, // refers to `A = 1`
}
return Y.Q;
})(),
} We don't seem to be getting this quite right at present: Oxc playground |
we are ignoring this case, and we are "marking" all identifiers in enum's as already in use |
I agree that |
> Re-creation of #4427 due to rebasing issues. Original attempt: #642 ----- Third time's the charm? Each time I attempt this rule, I find a bunch of bugs in `Semantic`, and I expect this attempt to be no different. Expect sidecar issues+PRs stemming from this PR here. ## Not Supported These are cases supported in the original eslint rule, but that I'm intentionally deciding not to support - export comments in scripts ```js /* exported a */ var a; ``` - global comments ```js /* global a */ var a; ``` ## Behavior Changes These are intentional deviations from the original rule's behavior: - logical re-assignments are not considered usages ```js // passes in eslint/no-unused-vars, fails in this implementation let a = 0; a ||= 1; let b = 0; b &&= 2; let c = undefined; c ??= [] ``` ## Known Limitations - Lint rules do not have babel or tsconfig information, meaning we can't determine if `React` imports are being used or not. The relevant tsconfig settings here are `jsx`, `jsxPragma`, and `jsxFragmentName`. To accommodate this, all imports to symbols named `React` or `h` are ignored in JSX files. - References to symbols used in JSDoc `{@link}` tags are not created, so symbols that are only used in doc comments will be reported as unused. See: #4443 - `.vue` files are skipped completely, since variables can be used in templates in ways we cannot detect > note: `.d.ts` files are skipped as well. ## Todo - [x] Skip unused TS enum members on used enums - [x] Skip unused parameters followed by used variables in object/array spreads - [x] Re-assignments to array/object spreads do not respect `destructuredArrayIgnorePattern` (related to: #4435) - [x] #4493 - [x] References inside a nested scope are not considered usages (#4447) - [x] Port over typescript-eslint test cases _(wip, they've been copied and I'm slowly enabling them)_ - [x] Handle constructor properties ```ts class Foo { constructor(public a) {} // `a` should be allowed } ``` - [x] Read references in sequence expressions (that are not in the last position) should not count as a usage ```js let a = 0; let b = (a++, 0); console.log(b) ``` > Honestly, is anyone even writing code like this? - [x] function overload signatures should not be reported - [x] Named functions returned from other functions get incorrectly reported as unused (found by @camc314) ```js function foo() { return function bar() { } } Foo()() ``` - [x] false positive for TS modules within ambient modules ```ts declare global { // incorrectly marked as unused namespace jest { } } ``` ## Blockers - #4436 - #4437 - #4446 - #4447 - #4494 - #4495 ## Non-Blocking Issues - #4443 - #4475 (prevents checks on exported symbols from namespaces)
The text was updated successfully, but these errors were encountered: