Как найти случаи критического изменения CoffeeScript 1.9.0 в моем коде?

TL;DR: Есть ли способ определить нарушения нового поведения CoffeeScript 1.9.0 для именования параметров @foo? Теперь использование голой переменной foo в функции является незаконным и не вызывает предупреждения/ошибки.

В версии 1.9.0 CoffeeScript указано:

Изменена стратегия генерации имен внутренних переменных компилятора. Обратите внимание, что это означает, что @example параметры функции больше не доступны в качестве голых example переменных в теле функции.

Это означает

class Animal
  constructor: (@name) ->
    console.log name

.. потерпит неудачу, молча. То есть приведенное выше не будет печатать имя нового животного.

Новое правильное решение:

class Animal
  constructor: (@name) ->
    console.log @name

CoffeeLint этого не улавливает. Есть ли какой-нибудь известный трюк для обнаружения теперь незаконного использования голого параметра? Может быть, отличный скрипт, работающий на сгенерированном javascript?

Вот 2 ссылки по этому поводу:


person backspaces    schedule 21.03.2015    source источник


Ответы (2)


Проще всего было бы использовать более старую версию coffee.

Если это невозможно, вы можете скомпилировать каждый исходный файл и запустить его через eslint проверку на no-undef правило. Вы можете сделать это с помощью следующего скрипта bash:

#!/bin/bash

FILES=$@

# https://nodejs.org/api/globals.html
# Object.keys(global).concat(['__dirname', '__filename']).join(',')
DEFINED_GLOBALS='ArrayBuffer,Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,DataView,global,process,GLOBAL,root,Buffer,setTimeout,setInterval,clearTimeout,clearInterval,setImmediate,clearImmediate,console,module,require,__dirname,__filename'

function compile() {
  ./node_modules/.bin/coffee --print $1
}

function lint() {
  # checks only for undefined variables except DEFINED_GLOBALS
  ./node_modules/.bin/eslint\
    --stdin --no-color\
    --global $DEFINED_GLOBALS\
    --reset --rule 'no-undef: [true]'
}

function main() {
  for file in $FILES; do
    local problems=`compile $file | lint`
    if [[ $problems ]]; then
      echo -e "=== $file\n$problems\n\n"
    fi
  done
}

main

Сохраните это как check.sh и запустите что-нибудь в следующих строках:

chmod u+x ./check.sh
npm install coffee-script eslint
find . -name "*.coffee" | xargs ./check.sh
person Aleksei Zabrodskii    schedule 24.03.2015
comment
Это отличная идея, в основном поймать, где могут возникнуть ошибки. Я не использовал это, вместо этого я написал сценарий bash, чтобы найти все места, где методы используют стиль @param, а затем нашел 4 места, где я использовал param bare. Но если я найду дополнительные проблемы, я попробую вашу идею. Спасибо! - person backspaces; 24.03.2015
comment
Просто хочу сказать, что я перешел с CoffeeScript на es6/jspm. Типа нравится. - person backspaces; 30.08.2015

Я сделал мод компилятора CoffeeScript, который console.errorпросматривает каждый случай, когда вам не хватает @: https://github.com/lydell/coffee-script/tree/1.8-at-params-warn

Чтобы установить его:

npm install lydell/coffee-script#1.8-at-params-warn

Чтобы проверить файл на наличие отсутствующих @, запустите, например:

./node_modules/.bin/coffee -p file-to-check.coffee >/dev/null

Приведенный выше код зарегистрирует путь к файлу, номер строки, номер столбца и имя переменной для каждой переменной, для которой требуется @.

person lydell    schedule 30.08.2015