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
[camelcase] false positive when parsing object pattern with a default value, and using a non-default parser. #13021
Comments
@bradzacher Thanks for the report. I was able to verify this. |
We should probably check some other rules, too. Also, what's expected AST for each of these cases: ({ a });
({ a } = {});
import { a } from 'foo';
export { a }; Referentially equal identifier nodes, or not referentially equal identifier nodes (i.e. two different nodes), or the parser can choose either. |
IMO there should never be referentially equal identifier nodes - every AST node should always be a brand new object, regardless of similarities to other nodes in the AST. If you share nodes, then it means you have to be weary of mutating the nodes in case you put incorrect data in the AST (as is what's happening with the Allowing the parser to choose either just creates a headache for consumers, as they don't know what will happen if they mutate the object. I believe that's the direction they're going to go toward in the acorn issue. |
I think it's reasonable to always have different objects. But I'm not sure what the spec for ImportSpecifier actually says:
Sounds like it should be the same object ("an Identifier node representing foo")? Though, "equivalent" usually doesn't mean "same". Does typescript-eslint parser create two nodes in this case? |
yes, it does.
babel also creates two separate nodes:
|
Then, I misread the estree spec while working on #12831 so we should probably fix that as well. Tests didn't catch it because acorn creates just 1 node. I was sure it's the same node because there is no something like |
Actually, #12831 seems to work well by chance. The name of the function It is, however, difficult to think about and cover both variations with same code. |
This commit includes a large refactoring. Previously, the `Identifier` node listener handled all cases by checking parent node types. But because the `Identifier` node has so broad meanings, it's confusing about what kind of nodes it's handling. Now it uses variables and references of `eslint-scope`. And it checks properties, re-exported identifiers, and labels by detailed esqueries. The property check newly supports class fields and private identifiers. This fixes #13021 as well.
This commit includes a large refactoring. Previously, the `Identifier` node listener handled all cases by checking parent node types. But because the `Identifier` node has so broad meanings, it's confusing about what kind of nodes it's handling. Now it uses variables and references of `eslint-scope`. And it checks properties, re-exported identifiers, and labels by detailed esqueries. The property check newly supports class fields and private identifiers. This fixes #13021 as well.
…#14591) * update package.json (temporary) * update ast-utils - `getFunctionNameWithKind(node)` ... supports class fields and private identifier. And now it uses property names rather than function names if named function expressions are methods because the property name is exposed. - `getFunctionHeadLoc(node)` ... supports class fields. And now returns the range of property names instead of the arrow locations if arrow functions are at method places. - `isSameReference(l,r)` ... supports `PrivateIdentifier`. * update camelcase This commit includes a large refactoring. Previously, the `Identifier` node listener handled all cases by checking parent node types. But because the `Identifier` node has so broad meanings, it's confusing about what kind of nodes it's handling. Now it uses variables and references of `eslint-scope`. And it checks properties, re-exported identifiers, and labels by detailed esqueries. The property check newly supports class fields and private identifiers. This fixes #13021 as well. * update accessor-pairs (test-only) * update class-methods-use-this * update computed-property-spacing * update dot-location (test-only) * update dot-notation (test-only) * update func-names Function expressions at field initializers have inferred names. Therefore the `as-needed` option should not report anonymous functions at field initializers. * update getter-return (test-only) * update grouped-accessor-pairs (test-only) * update indent * update keyword-spacing * update lines-between-class-members (test-only) * update no-dupe-class-members * update no-extra-semi * update no-invalid-this * update no-multi-assign * update no-proto (test-only) * update no-prototype-builtins (test-only) * update no-restricted-properties (test-only) * update no-self-assign * update no-self-compare (test-only) * update no-setter-return * update no-shadow (test-only) * update no-this-before-super (test-only) * update no-throw-literal (test-only) * update no-undef-init * update no-underscore-dangle * update no-unexpected-multiline (test-only) * update no-unreachable * update no-useless-call (test-only) * update no-useless-computed-key * update no-eval * update operator-assignment (test-only) * update operator-linebreak * update padded-blocks (test-only) * update prefer-exponentiation-operator * update prefer-numeric-literals (test-only) * update prefer-object-spread (test-only) * update prefer-promise-reject-errors (test-only) * update prefer-regex-literals (test-only) * update prefer-spread (test-only) * update quotes * update radix (test-only) * update require-atomic-updates (test-only) * update require-unicode-regexp (test-only) * update semi-spacing * update semi-style * update semi * update space-infix-ops * update strict (test-only) * add more tests to no-unexpected-multiline * fix some tests for 7345747 * fix no-invalid-this * fix no-eval * Update eslint-scope * Upgrade Espree * Fix eslint-scope references to parser test * Fix: id-denylist * Update comments * Fix: id-match * Fix: id-length * Update: id-denylist for class fields * Update: id-length * Update: id-denylist code and docs * Docs: id-denylist * Update: id-match Co-authored-by: Nicholas C. Zakas <nicholas@humanwhocodes.com>
Tell us about your environment
What parser (default, Babel-ESLint, etc.) are you using?
default, typescript-eslint
Please show your full configuration:
Configuration
What did you do? Please include the actual source code causing the issue, as well as the command that you used to run ESLint.
Context: typescript-eslint/typescript-eslint#1686
A user of typescript-eslint received a linting error with the following code, even though it should be covered by the options above.
This error occurs when parsing with typescript-eslint, and not with the default parser.
Thinking this was a bug in the typescript-eslint parser, I did some digging, and it turns out that the acorn reuses the AST node in two places (i.e. the two
a_b
Identifiers are referentially equal).acornjs/acorn#928
This causes the parent references to be set incorrectly, as the node's parent will be that of whichever node was traversed last.
Logging this here because:
The text was updated successfully, but these errors were encountered: