coffeelint
Version:
Lint your CoffeeScript
37 lines (30 loc) • 1.21 kB
text/coffeescript
isCode = (node) -> node.constructor.name is 'Code'
isFatArrowCode = (node) -> isCode(node) and node.bound
isThis = (node) ->
node.constructor.name is 'Value' and node.base.value is 'this'
any = (arr, test) -> arr.reduce ((res, elt) -> res or test elt), false
needsFatArrow = (node) ->
isCode(node) and (
any(node.params, (param) -> param.contains(isThis)?) or
node.body.contains(isThis)? or
node.body.contains((child) ->
isFatArrowCode(child) and needsFatArrow(child))?
)
module.exports = class NoUnnecessaryFatArrows
rule:
name: 'no_unnecessary_fat_arrows'
level: 'warn'
message: 'Unnecessary fat arrow'
description: """
Disallows defining functions with fat arrows when `this`
is not used within the function.
"""
lintAST: (node, astApi) ->
node, astApi
undefined
lintNode: (node, astApi) ->
if (isFatArrowCode node) and (not needsFatArrow node)
error = astApi.createError
lineNumber: node.locationData.first_line + 1
.push error
node.eachChild (child) => child, astApi