タブを使用したインデントは、少なくとも3つのルール、おそらくそれ以上のルールによって報告された位置を壊すようです。
次のすべては、この.jshintrc
ファイルを使用してリントされました。
{
"strict": "global",
"unused": true
}
テストされたJSHintバージョンはv2.9.5です。
これらを個別の問題として再提出してほしい場合は、それも可能です。
このコードをリントする場合:
'use strict';
function foo() {
};
foo();
4行目6列目にエラーが報告されていますが、4行目には4文字しかありません。
このコードをリントする場合:
'use strict';
function foobar(
$foo
) {
return 'foo';
}
foobar();
4行目9列目にエラーが報告されていますが、4行目には7文字しかありません。
このコードをリントする場合:
'use strict';
function foobar() {
if (true) {
fun1();
}
}
foobar();
5行目13列目にエラーが報告されていますが、4行目には11文字しかありません。
報告されたキャラクターの位置は、問題の行の先頭にあるタブが増えるほど、さらに進んでいくようです。
生のファイルはここで見つけることができます: linter-jshint_GH416.zip
もともとはhttps://github.com/AtomLinter/linter-jshint/issues/416の調査中に発見されました。
影響を受けることがわかっているルール:
W009
W014
E015
W024
W027
W030
W032
W033
W040
W043
W069
W075
W098
W116
W119
W140
E041
報告ありがとうございます! この問題は、 lex.js
の1610行目から発生しています。
this.input = this.input.replace(/\t/g, state.tab);
これは、スタイル関連のリンティングルールがいくつ実装されているかについてはかなり基本的なようです。 これらはしばらくの間非推奨になっていますが、新しいメジャーバージョンに移行する準備はまだできていません。 そのため、当面は、その動作を維持するソリューションを設計する必要があります。
私の最初の考えは、この「実効オフセット」をcolumn
という名前のトークンオブジェクトの新しいプロパティとして追跡することです。 これは、これらのスタイル関連の警告に使用できます。 次に、 character
属性を再実装して、「真の」文字オフセットを記述できます。各コードポイント(タブまたはその他)は、カウントを正確に1ずつ増やします。この値は警告を発行するために使用されます。 Reporterプラグインは、タブ文字のレンダリング方法を制御し、それに応じて報告された「列」番号を解釈できます。
@Arcanemagus、それはあなたにとって良いことだと思いますか?
少なくとも表面的には、JSHintの内部に関する実際の知識がなくても、それは私には完璧に聞こえます😛。 理想的には、真の列数を取得するための何らかの方法が必要です(各コードポイントは1つの列として数えられます)。
半一般的なエラーを伴ういくつかの古いパーサーバグの回避策のためにこの警告が本質的に無視されたため、これはしばらくの間隠されていました。 ユーザーへの警告をより適切な方法で再実装したとき、誤ってユーザーを「非表示」にしていたのですが、最近修正して、これを再び表示できるようにしました。
W030
、 W033
、およびW009
も影響を受けるようです。 あなたの説明から、私は_すべての_ルールが影響を受けると思いますか?
私もこの問題を経験しており、エラーと警告の両方を再現することができます。 ルール/エラーの種類は重要ではないようです。
これは、jshintが「==」を「===」にする必要があることを警告しようとしている例です。 オレンジ色の下線の誤った位置に注意してください。
うまくいけば、これは問題についてのあなたの考えを確認します。
今日は少し掘り下げる時間がありましたindent
オプションを1
に設定すると、望ましい結果が得られると思います。
@Arcanemagus消費者のindent
オプションの価値を無効にすることはできますか? これが可能であれば、JSHint自体のデフォルト値を変更すると、そのコンシューマーにどのような影響があるかわからないため、むしろそうします。
うーん、現在、このプロジェクトはそのようなCLIインターフェイスを使用しています。 それを可能にするNode.jsAPIを使用するように書き直すことができます。
indent
の値を強制すると、消費者に表示される結果が変わりますか? そのパッケージの目標は、 jshint
自体を実行することで可能な限り近くなることですが、結果をエディターに統合することです。構成から値をオーバーライドできるコマンドライン引数を追加するのはどうですか?
そのようなものは、nginxの-g、sshの-o、gitの-cなどのツールで一般的です。
$ jshint -o "indent = 1" -o "-W034 = true" -o "globals.require = false" -o "globals.$ = null"
これがどのバージョンで導入されたか知っている人はいますか? 2.9.5?
少なくともその時は、一時的にダウングレードすることができます。 修理。
@jaredatch https://github.com/AtomLinter/linter-jshint/pull/386($#$ linter-jshint
のv3.1.0でリリース)に戻ると、JSHintのバグのあるポイントレポートのすべての回避策が削除されました。 このチェックの全体的なポイントは、リンターが無効なポイントを報告している場合にこのようなバグを見つけることです。これにより、リンターを使用して_everyone_について報告および修正できます。 (結局のところ、正確なデータを提供するためにリンターを信頼できない場合は、なぜそれを使用するのですか?)
このタブのバグが導入される前、およびこれらの回避策を最初に実行する原因となった主要なパーサーのバグの後に、「スイートスポット」が存在する可能性があります。
@Arcanemagus gotcha、洞察に本当に感謝します。 素晴らしい仕事を続けてください👍
linter-jshint
がこれらの無効なポイントをどのように報告するかについて、より良い/より有用なメッセージのアイデアがある場合は、問題を提出するか、そこにPRを送信してください😉。
すべてのソリューションが過去の性交に費やした5時間の性交を試してみてくださいその性交のJAVASCRIPTファイルその性交2017私がこの問題を抱えている理由アトムは私の性交の人生のクソの悩みの種です
そして、誰がTABSを使用して文字通りWTFをインデントしないのですか?なぜ、壊れたパッケージを何百万ものJSにリリースするのですか???????
誰が文字通りピリオドを使用しないのですか?なぜこの壊れた英語を何百万もの英語にリリースするのですか?
おー。 そして、大文字の文字は文の先頭にあります。 どこにでもあるわけではありません。
/トロール(すみません、自分自身を助けることができませんでした)
まあ、解決策は当分の間これを非アクティブ化することになると思います...
とにかく誰がリンターを必要としますか?
@jugglinmike https://github.com/jshint/jshint/issues/3151#issuecomment-312512856の質問に答えられますか?
これがトリガーされるさまざまなケースについて、20の固有の問題が発生しています。これを修正するにはしばらく時間がかかるようですが、ユーザーの結果が変わらないと仮定して、回避策を進めたいと思います。
この問題は私のレーダーから外れました。 申し訳ありません、@Arcanemagus。 残念ながら、私は今週末までこれに値する注意を払うことができないと思います。 それはあなたのために働きますか?
@jugglinmikeもちろん😉
私は既存の問題についていくつかのチェックを入れたので、ほとんどの場合、人々はここを指しているすでに開いている問題にフィルターされています。
@cobexer私はそのアイデアが好きです。なぜなら、私たちに前進する方法を与えることに加えて、それは
他の状況の人々に役立つかもしれません。 そうは言っても、私の知る限り、
そのような機能の要求は一度もありませんでした、そして私は気が進まない
良さそうだからといって、新しい機能にコミットします。 そして、
特にその機能をお勧めしません:「rc」ファイル間、インライン
構成、およびNode.js API、ユーザーは必要なときにすでにつまずきます
特定のオプションが有効になっている理由を理解するため。 構成用に別のベクトルを追加する
経営陣はこの問題を悪化させる傾向があります。
ここで最も実行可能な解決策は、私の以前の解決策に基づいていると思います提案。
ただし、 character
プロパティをパブリックAPI(Atom)と見なす必要があります
結局のところ、エディタープラグイン自体はその上に構築されています。 だからそれを変更する代わりに
プロパティと現在のセマンティクスを持つ新しいものを定義すると、私は思います
character
をそのままにして、要求されたデータを新しいデータに公開する必要があります
プロパティ名。
私は今週末、新機能の作業を開始しました。 での回帰を避けたい
すべてのコストがかかるため、プロジェクトのテストを拡張して、一貫して
予想される文字番号。 私がこれを始めたとき、私は欠陥を見つけました
最初に対処する必要があるテストスイート。 gh-3174はへの第一歩です
その目標。
これはすべて言うことです:これには時間がかかるようです。 @Arcanemagus私は知っています
あなたはこのバグの矢面に立たされています、そして私はあなたがこれを
JSHintが改善されるのを見る機会。 私もあなたが興味を持っているのが好きです
ユーザーに対して透過的でないソリューションを回避します。 要するに
用語、ユーザーにindent
オプションを1
に設定することを勧める運がありましたか?
それは理想的ではありませんが、そうすることで彼らの短期的な問題をある意味で解決するはずです
これにパッチを適用した後も、これは引き続き機能します。
@Arcanemagusあなたがこのバグの矢面に立たされていることを私は知っています、そして私はあなたがこれを
JSHintが改善されるのを見る機会。
AtomのほとんどのLinterプロバイダーで使用されている汎用ライブラリにチェックを追加した理由は、このようなバグがソースのlinterで検出され、報告/修正される可能性があるためです😉。 これは実際には以前に検出されたはずですが、 linter-jshint
にチェックインがあり、パーサーがほとんどのドキュメントで完全に失敗したときに、基本的にすべての無効なポイントエラーを_way_から隠し、それを報告する良い方法がありませんでしたユーザーまたは問題レポートの重複排除。 それらが理解されたので、私はそのチェックを削除しました、そしてここに私たちは😛です。
また、ユーザーに対して透過的でないソリューションを回避することに関心があることも気に入っています。
実際、この特定の問題に対する透過的な解決策は問題ありません。 indent
設定を1
に強制すると、表示される結果が、得られる結果と比較して変わるかどうかはわかりません。 jshint
自体を実行します。
短期的には、ユーザーにインデントオプションを1に設定することを勧める運がありましたか?
それは...私が実際にそれらの問題に投稿することを考えていなかった素晴らしいアイデアです。 私は問題のより多くのコメントでそれを言及することを忘れないでしょう!
そうです、.jshintrcで「indent」プロパティを1に設定することは、優れた回避策です。 私はそれについてもっと早く知っていたらいいのにと思います。 jshintはデフォルトでes6に設定されていないため、すでに.jshintrcを持っているので、これを追加するのは簡単です。 👍
それを聞いてうれしい、@ tustin2121!
更新:リグレッションを回避するために、JSHintテストスイートの強化に取り組んでいます。 その取り組みの最新のものはgh-3176です。
この問題に関する更新はありますか?
現在、このバグの影響を受けるルールは少なくとも40種類あるようです😛。
これに関する更新はありますが、このエラーが発生してから数か月が経ちます。
こんにちは@xcrap! コメントスレッドを確認したところ、誰も更新を投稿していないようです。 幸いなことに、JSHintはオープンソースプロジェクトであるため、ストレスが発生している場合は、問題の修正に役立てることができます。 手を貸してみませんか? 喜んでアドバイスさせていただきます。
@jugglinmike欲しい! 私はいつも小さなプロジェクトに挑戦していますが、私のjsスキルは非常に基本的で制限されています:)
私はこのバグに50ドルの報奨金を設定しました。他の人は、このリンクを介して報奨金を増やすことに貢献できます: https ://www.bountysource.com/issues/46533252-tab-indentation-breaks-multiple-rules
@tzvipmのフォークをローカルにプルし、jshintを再構築することで、他の誰かがこれに遭遇した場合の問題を修正することができました。
git clone https://github.com/tzvipm/jshint
git remote add upstream [email protected]:jshint/jshint.git
git fetch upstream
git stash
git merge upstream/master
git mergetool --tool=opendiff
npm run build
最も参考になるコメント
すべてのソリューションが過去の性交に費やした5時間の性交を試してみてくださいその性交のJAVASCRIPTファイルその性交2017私がこの問題を抱えている理由アトムは私の性交の人生のクソの悩みの種です
そして、誰がTABSを使用して文字通りWTFをインデントしないのですか?なぜ、壊れたパッケージを何百万ものJSにリリースするのですか???????