deno_lint icon indicating copy to clipboard operation
deno_lint copied to clipboard

rule suggestion: use arrow syntax for non-top-level functions

Open ry opened this issue 4 years ago • 6 comments

There's a lot of code like this in Deno:

Deno.test("foo", function () { /* ... */ });

It would be nice to have a rule to suggest to use arrow syntax for the anonymous function here.

However, for top-level functions, the function syntax should be used.

ry avatar Jun 04 '20 11:06 ry

This looks like a more strict version of prefer-arrow-callback where all anonymous functions are considered, not just callbacks. A good name would probably be prefer-arrow-anonymous

lucacasonato avatar Jun 04 '20 14:06 lucacasonato

I think the original ESLint rule prefer-arrow-callback does what you want with no extra strict settings:

https://eslint.org/demo#eyJ0ZXh0IjoiY29uc3QgRGVubyA9IHt9O1xuXG5mdW5jdGlvbiBiYXIoKXt9XG5iYXIoKVxuXG5EZW5vLnRlc3QoXCJmb29cIiwgZnVuY3Rpb24gKCkgeyAvKiAuLi4gKi8gfSk7Iiwib3B0aW9ucyI6eyJwYXJzZXJPcHRpb25zIjp7ImVjbWFWZXJzaW9uIjoxMSwic291cmNlVHlwZSI6InNjcmlwdCIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6eyJjb25zdHJ1Y3Rvci1zdXBlciI6MiwiZm9yLWRpcmVjdGlvbiI6MiwiZ2V0dGVyLXJldHVybiI6Miwibm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvciI6Miwibm8tY2FzZS1kZWNsYXJhdGlvbnMiOjIsIm5vLWNsYXNzLWFzc2lnbiI6Miwibm8tY29tcGFyZS1uZWctemVybyI6Miwibm8tY29uZC1hc3NpZ24iOjIsIm5vLWNvbnN0LWFzc2lnbiI6Miwibm8tY29uc3RhbnQtY29uZGl0aW9uIjoyLCJuby1jb250cm9sLXJlZ2V4IjoyLCJuby1kZWJ1Z2dlciI6Miwibm8tZGVsZXRlLXZhciI6Miwibm8tZHVwZS1hcmdzIjoyLCJuby1kdXBlLWNsYXNzLW1lbWJlcnMiOjIsIm5vLWR1cGUtZWxzZS1pZiI6Miwibm8tZHVwZS1rZXlzIjoyLCJuby1kdXBsaWNhdGUtY2FzZSI6Miwibm8tZW1wdHkiOjIsIm5vLWVtcHR5LWNoYXJhY3Rlci1jbGFzcyI6Miwibm8tZW1wdHktcGF0dGVybiI6Miwibm8tZXgtYXNzaWduIjoyLCJuby1leHRyYS1ib29sZWFuLWNhc3QiOjIsIm5vLWV4dHJhLXNlbWkiOjIsIm5vLWZhbGx0aHJvdWdoIjoyLCJuby1mdW5jLWFzc2lnbiI6Miwibm8tZ2xvYmFsLWFzc2lnbiI6Miwibm8taW1wb3J0LWFzc2lnbiI6Miwibm8taW5uZXItZGVjbGFyYXRpb25zIjoyLCJuby1pbnZhbGlkLXJlZ2V4cCI6Miwibm8taXJyZWd1bGFyLXdoaXRlc3BhY2UiOjIsIm5vLW1pc2xlYWRpbmctY2hhcmFjdGVyLWNsYXNzIjoyLCJuby1taXhlZC1zcGFjZXMtYW5kLXRhYnMiOjIsIm5vLW5ldy1zeW1ib2wiOjIsIm5vLW9iai1jYWxscyI6Miwibm8tb2N0YWwiOjIsIm5vLXByb3RvdHlwZS1idWlsdGlucyI6Miwibm8tcmVkZWNsYXJlIjoyLCJuby1yZWdleC1zcGFjZXMiOjIsIm5vLXNlbGYtYXNzaWduIjoyLCJuby1zZXR0ZXItcmV0dXJuIjoyLCJuby1zaGFkb3ctcmVzdHJpY3RlZC1uYW1lcyI6Miwibm8tc3BhcnNlLWFycmF5cyI6Miwibm8tdGhpcy1iZWZvcmUtc3VwZXIiOjIsIm5vLXVuZGVmIjoyLCJuby11bmV4cGVjdGVkLW11bHRpbGluZSI6Miwibm8tdW5yZWFjaGFibGUiOjIsIm5vLXVuc2FmZS1maW5hbGx5IjoyLCJuby11bnNhZmUtbmVnYXRpb24iOjIsIm5vLXVudXNlZC1sYWJlbHMiOjIsIm5vLXVudXNlZC12YXJzIjoyLCJuby11c2VsZXNzLWNhdGNoIjoyLCJuby11c2VsZXNzLWVzY2FwZSI6Miwibm8td2l0aCI6MiwicmVxdWlyZS15aWVsZCI6MiwidXNlLWlzbmFuIjoyLCJ2YWxpZC10eXBlb2YiOjIsInByZWZlci1hcnJvdy1jYWxsYmFjayI6Mn0sImVudiI6e319fQ==

David-Else avatar Jun 05 '20 20:06 David-Else

@David-Else That doesn't enforce the rule However, for top-level functions, the function syntax should be used. though, right?

lucacasonato avatar Jun 05 '20 20:06 lucacasonato

Looking at it again, you are right, it is not enforcing the use of top-level function syntax, just allowing it.

David-Else avatar Jun 05 '20 20:06 David-Else

Thinking about this more, this should probably be two seperate rules. ESLint's prefer-arrow-callback and additionally a no-top-level-arrow which forbidds the use of arrow syntax to declare top level functions.

lucacasonato avatar Jun 05 '20 20:06 lucacasonato

@David-Else That doesn't enforce the rule However, for top-level functions, the function syntax should be used. though, right?

You can use no-restricted-syntax as a temporary workaround to mimic no-top-level-arrow:

{
    "no-restricted-syntax": ["error", {
        "selector": "Program > VariableDeclaration > VariableDeclarator[init.type=ArrowFunctionExpression]",
        "message": "Top-level arrow function is not allowed"
    }]
}

(Playground link)

eternalphane avatar Apr 04 '23 05:04 eternalphane