clutchski / coffeelint

Lint your CoffeeScript.
http://www.coffeelint.org
Other
1.17k stars 172 forks source link

`ensure_comprehensions` should warn about comprehensions of or within implicit object literals #624

Open rodovich opened 6 years ago

rodovich commented 6 years ago

()-less comprehensions and {}-less object literals can interact to form more ambiguous scenarios than are currently flagged by ensure_comprehensions.

Strings like this…

fish: f for f in ['albacore', 'bass', 'carp']

…can have different meanings depending where parentheses or braces are added:

# [ { fish: 'albacore' }, { fish: 'bass' }, { fish: 'carp' } ]
(fish: f) for f in ['albacore', 'bass', 'carp']
{fish: f} for f in ['albacore', 'bass', 'carp']

# { fish: [ 'albacore', 'bass', 'carp' ] }
fish: (f for f in ['albacore', 'bass', 'carp'])
{fish: f for f in ['albacore', 'bass', 'carp']}

This can arise in function arguments, function results, and nested object literals:

# should warn
setPuddleContents fish: f for f in ['albacore', 'bass', 'carp']
setPuddleContents(fish: f for f in ['albacore', 'bass', 'carp'])
setPuddleContents
  fish: f for f in ['albacore', 'bass', 'carp']

# unambiguous
(setPuddleContents fish: f) for f in ['albacore', 'bass', 'carp']
setPuddleContents(fish: f) for f in ['albacore', 'bass', 'carp']
setPuddleContents fish: (f for f in ['albacore', 'bass', 'carp'])
setPuddleContents {fish: f for f in ['albacore', 'bass', 'carp']}
setPuddleContents
  {fish: f} for f in ['albacore', 'bass', 'carp']
setPuddleContents
  fish: (f for f in ['albacore', 'bass', 'carp'])
# should warn
getPuddleContents = -> fish: f for f in ['albacore', 'bass', 'carp']
getPuddleContents = -> (fish: f for f in ['albacore', 'bass', 'carp'])

# unambiguous
(getPuddleContents = -> fish: f) for f in ['albacore', 'bass', 'carp']
getPuddleContents = -> ({fish: f} for f in ['albacore', 'bass', 'carp'])
getPuddleContents = ->
  {fish: f} for f in ['albacore', 'bass', 'carp']
getPuddleContents = -> fish: (f for f in ['albacore', 'bass', 'carp'])
getPuddleContents = -> {fish: f for f in ['albacore', 'bass', 'carp']}
# should warn
puddleContents: fish: f for f in ['albacore', 'bass', 'carp']

# unambiguous
{puddleContents: fish: f} for f in ['albacore', 'bass', 'carp']
puddleContents: {fish: f for f in ['albacore', 'bass', 'carp']}
puddleContents: fish: (f for f in ['albacore', 'bass', 'carp'])
puddleContents: ({fish: f} for f in ['albacore', 'bass', 'carp'])