8000 chore(type-utils): reuse newly added "is builtin symbol like" logic by arkapratimc · Pull Request #8287 · typescript-eslint/typescript-eslint · GitHub
[go: up one dir, main page]

Skip to content

chore(type-utils): reuse newly added "is builtin symbol like" logic #8287

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

Closed
wants to merge 3 commits into from

Conversation

arkapratimc
Copy link
Contributor
@arkapratimc arkapratimc commented Jan 22, 2024

fixes: #8234

PR Checklist

Overview

@typescript-eslint
Copy link
Contributor

Thanks for the PR, @arka1002!

typescript-eslint is a 100% community driven project, and we are incredibly grateful that you are contributing to that community.

The core maintainers work on this in their personal time, so please understand that it may not be possible for them to review your work immediately.

Thanks again!


🙏 Please, if you or your company is finding typescript-eslint valuable, help us sustain the project by sponsoring it transparently on https://opencollective.com/typescript-eslint.

Copy link
netlify bot commented Jan 22, 2024

Deploy Preview for typescript-eslint ready!

Name Link
🔨 Latest commit 7c96190
🔍 Latest deploy log https://app.netlify.com/sites/typescript-eslint/deploys/65ae788bf15b9f0008692838
😎 Deploy Preview https://deploy-preview-8287--typescript-eslint.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
Lighthouse
Lighthouse
1 paths audited
Performance: 99 (🟢 up 2 from production)
Accessibility: 100 (no change from production)
Best Practices: 92 (no change from production)
SEO: 98 (no change from production)
PWA: 80 (no change from production)
View the detailed breakdown and full score reports

To edit notification comments on pull requests, go to your Netlify site configuration.

* let I = (callback: Function) => {}
* ^ FunctionLike
*/
export function isFunctionLike(program: ts.Program, type: ts.Type): boolean {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typescript package already exports the function with same name isFunctionLike. Having two functions with the same name may cause confusion.

export function isFunctionLike(program: ts.Program, type: ts.Type): boolean {
return (
isBuiltinSymbolLike(program, type, 'Function') ||
isBuiltinSymbolLike(program, type, 'FunctionConstructor')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original rule didn't check for symbols with name FunctionConstructor. Should we add tests that contain symbols with name FunctionConstructor? But that is probably not within the scope of this pr. IMO we shouldn't change the rule logic in this pr

Copy link
Contributor Author
@arkapratimc arkapratimc Jan 22, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just want to ask a small question -

This rule is checking FunctionConstructor right ? Like, in this case, the escapedName of the symbol is 'FunctionConstructor'.

code: "const fn = new Function('a', 'b', 'return a + b');",
errors: [
{
messageId: 'noFunctionConstructor',
line: 1,
column: 12,
},
],

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right Function here has FunctionConstructor type. I missed this because in the source code of rule both symbol name and callee identifier's name are compared to FUNCTION_CONSTRUCTOR

Then +1 on renaming isFunctionLike... Not sure what's the best name for it. Maybe isFunctionTypeLike or something like this?

Also we should consider that #8094 most likely will introduce changes to isBuiltinSymbolLike.
As per #8094 (comment):
isBuiltinSymbolLike(program, type, 'Function') || isBuiltinSymbolLike(program, type, 'FunctionConstructor') recursively visits all subtypes twice, we can optimize to not do the same job twice. #8094 does the following:

isBuiltinSymbolLike(
  services.program,
  calleeType,
  name => name === 'PromiseConstructor' || name === 'Promise'
)

Perhaps we can wait until #8094 is merged and then do the same

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, sure.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But that is probably not within the scope of this pr. IMO we shouldn't change the rule logic in this pr

Yeah this is just a refactor (chore). If you want to change how it works that'd be a separate issue.

👍 I'll mark this as blocked on #8094. Thanks :)

Copy link
Member
@JoshuaKGoldberg JoshuaKGoldberg Apr 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#8094 is closed - so we can now pretend it doesn't exist*. cc @arka1002, I'm un-blocking this PR. Sorry for the long wait!

*(though if you end up taking in code from it, we'll need a Co-authored-by: Timothy Moore <mtimothy984@gmail.com> in the PR description)

Comment on lines 82 to 85
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
if (symbol && symbol.escapedName === FUNCTION_CONSTRUCTOR) {
const declarations = symbol.getDeclarations() ?? [];
for (const declaration of declarations) {
const sourceFile = declaration.getSourceFile();
if (services.program.isSourceFileDefaultLibrary(sourceFile)) {
return true;
}
}
return isFunctionLike(services.program, type);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isFunctionLike internally already checks that the type has a symbol, and that symbol is named Function, so the condition above is redundant.

@@ -1,3 +1,4 @@
import { isFunctionLike } from '@typescript-eslint/type-utils';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@typescript-eslint/type-utils shouldn't be imported directly. This function should probably be imported from src/utils, as other rules do

// this is done for convenience - saves migrating all of the old rules
export * from '@typescript-eslint/type-utils';

@JoshuaKGoldberg JoshuaKGoldberg added the blocked by another PR PRs which are ready to go but waiting on another PR label Jan 24, 2024
@JoshuaKGoldberg JoshuaKGoldberg added awaiting response Issues waiting for a reply from the OP or another party and removed blocked by another PR PRs which are ready to go but waiting on another PR labels Apr 23, 2024
@JoshuaKGoldberg
Copy link
Member

👋 ping @arka1002, just checking in - is this PR still something you have the time and energy for?

@arkapratimc
Copy link
Contributor Author

Closing it 👍

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jun 3, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
awaiting response Issues waiting for a reply from the OP or another party
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Repo: reuse newly added "is builtin symbol like" logic from type-utils
3 participants
0