1000ch / linter-textlint

A plugin for Atom Linter providing an interface to textlint.
https://atom.io/packages/linter-textlint
33 stars 13 forks source link

linterの「Lint As You Type」オプションを利用しているとエラーが出る #27

Open nyoro712 opened 8 years ago

nyoro712 commented 8 years ago

以下の環境で利用しています。

lint自体は正常に行われるのですが、ファイルを更新するたびにエラーダイアログが表示されます。 エラーメッセージは次の通りです。

Error: Column start (31) greater than line length (0)
    at rangeFromLineNumber (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\atom-linter\lib\index.js:179:11)
    at D:/PortableApplications/Atom/.atom/packages/linter-textlint/lib/index.js:116:20
    at Array.map (native)
    at D:/PortableApplications/Atom/.atom/packages/linter-textlint/lib/index.js:112:25
    at tryCatcher (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:510:31)
    at Promise._settlePromise (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:567:18)
    at Promise._settlePromise0 (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:612:10)
    at Promise._settlePromises (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:691:18)
    at Promise._fulfill (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:636:18)
    at PromiseArray._resolve (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise_array.js:125:19)
    at PromiseArray._promiseFulfilled (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise_array.js:143:14)
    at Promise._settlePromise (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:572:26)
    at Promise._settlePromise0 (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:612:10)
    at Promise._settlePromises (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\promise.js:691:18)
    at Async._drainQueue (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\async.js:138:16)
    at Async._drainQueues (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\async.js:148:10)
    at Async.drainQueues (D:\PortableApplications\Atom\.atom\packages\linter-textlint\node_modules\bluebird\js\release\async.js:17:14)

なお、保存されたファイルを初めて読み込んだ時にはエラーは出ず、そこから何か変更を加えるたびにエラーが出るという感じです。 また、linterの Lint As You Type オプションを無効にするとエラーは出なくなります。

nyoro712 commented 8 years ago

書き忘れていましたが、OSは Windows 7 Professional Service Pack 1 (64bit) です。

azu commented 7 years ago

OS: OSX Yosemite 10.10.5と El Capitan Atom 1.10.2 でも同じ問題がおきてました。

1000ch commented 7 years ago

うーん。macOS Sierra + Atom 1.10.2 ですが、再現できません…

nyoro712 commented 7 years ago

エラーは常に出るわけではなく、出る時と出ない時があるようです。 この1か月使ってみて気付いたのですが、どうやらtextlintで警告が出た行を触るとlinter-textlintのエラーが出るみたいです。

というわけで試してみました。

環境は次の通りです。

テスト用に、次の3行のテキストを「test.txt」としてファイルに保存します。

この行にはtextlintによる警告は出ない。
この行にはtextlintにより警告が発せられる。この行に何かしようとするとエラーになるようだ。
この行にはtextlintによる警告は出ない。

このファイルを Atom で開くと、lintが行われ、次のような警告が出ます。

textlint Error preset-japanese/no-doubled-joshi 一文に二回以上利用されている助詞 "と" がみつかりました。at line 2 col 38

この状態から、テキストをいろいろ編集してみると、次のような結果になりました。

nyoro712 commented 7 years ago

本日 Atom 1.11.1 が出たので、

の環境でも上記を試してみましたが、やはり同様の結果でした。

azu commented 7 years ago

https://github.com/azu/linter-atom-issue-27 で再現できました。

git clone https://github.com/azu/linter-atom-issue-27 issue
cd issue 
npm i
atom .

で 2行目の先頭で backspace を押すと例外が出る感じでした。

10 -29-2016 21-39-33

ルールによって不正なカラム位置が返されてるのかもしれないです。 (textlint自体はline, columnがはみ出ているかのチェックをしてないはずなので)

azu commented 7 years ago

http://denpa-shinbun.com/entry/textlint-rule も同じ話っぽい。 ルールが異常値出したときにtextlint側で丸めるのか、Atom plugin側で丸めるのかというのはありそう。 (個人的には両方かなという感じはしてます)

1000ch commented 7 years ago

ルールが異常値出したときにtextlint側で丸めるのか、Atom plugin側で丸めるのかというのはありそう。 (個人的には両方かなという感じはしてます)

両方が良いですね。linter-textlint 側も対処します...

azu commented 7 years ago

ルールが異常値を出すのはあり得えますが、この場合Lint As You Typeじゃなくても起きるはずなんですよね。 なので、Linterのチェックも怪しい感じがしてきますね。 textlintは非同期で処理するので、チェック瞬間の行数とチェック後の行数は異なることはありそうなので、その辺補正されてないと存在しない行へのエラレポートになってしまいそう。