Tampaknya lekukan menggunakan tab merusak posisi yang dilaporkan oleh setidaknya 3 aturan, kemungkinan lebih.
Semua yang berikut ini dilapisi menggunakan file .jshintrc
ini:
{
"strict": "global",
"unused": true
}
Versi JSHint yang diuji adalah v2.9.5.
Jika Anda ingin saya mengarsipkan ulang ini sebagai masalah terpisah, saya juga dapat melakukannya.
Jika Anda linting kode ini:
'use strict';
function foo() {
};
foo();
Ada kesalahan yang dilaporkan pada baris 4, kolom 6, tetapi baris 4 hanya memiliki 4 karakter di dalamnya.
Jika Anda linting kode ini:
'use strict';
function foobar(
$foo
) {
return 'foo';
}
foobar();
Ada kesalahan yang dilaporkan pada baris 4, kolom 9, tetapi baris 4 hanya memiliki 7 karakter di dalamnya.
Jika Anda linting kode ini:
'use strict';
function foobar() {
if (true) {
fun1();
}
}
foobar();
Ada kesalahan yang dilaporkan pada baris 5, kolom 13, tetapi baris 4 hanya memiliki 11 karakter di dalamnya.
Posisi karakter yang dilaporkan tampaknya semakin jauh semakin banyak tab yang ada di awal baris yang dimaksud.
File mentah dapat ditemukan di sini: linter-jshint_GH416.zip
Awalnya ditemukan saat menyelidiki https://github.com/AtomLinter/linter-jshint/issues/416.
Aturan yang diketahui terpengaruh:
W009
W014
E015
W024
W027
W030
W032
W033
W040
W043
W069
W075
W098
W116
W119
W140
E041
Terima kasih atas laporannya! Masalahnya berasal dari baris 1610 dari lex.js
:
this.input = this.input.replace(/\t/g, state.tab);
Ini tampaknya cukup mendasar untuk berapa banyak aturan linting terkait gaya yang diterapkan. Itu sudah tidak digunakan lagi untuk beberapa waktu sekarang, tetapi kami masih belum siap untuk beralih ke versi utama yang baru. Jadi sementara itu, kita perlu merancang solusi yang mempertahankan perilaku itu.
Pikiran awal saya adalah melacak "offset efektif" ini sebagai properti baru dari objek token bernama column
. Ini dapat digunakan untuk peringatan terkait gaya tersebut. Kemudian, atribut character
dapat diimplementasikan kembali untuk menggambarkan karakter offset "benar", di mana setiap titik kode (tab atau lainnya) menambah hitungan tepat 1. Nilai ini akan digunakan untuk mengeluarkan peringatan. Plugin reporter kemudian akan mengontrol bagaimana mereka merender karakter tab, dan mereka dapat menginterpretasikan nomor "kolom" yang dilaporkan sesuai dengan itu.
Apakah itu terdengar bagus untukmu, @Arcanemagus?
Kedengarannya sempurna bagi saya, setidaknya di permukaan tanpa pengetahuan nyata tentang internal JSHint . Idealnya saya hanya perlu beberapa metode untuk mendapatkan jumlah kolom yang sebenarnya (di mana setiap titik kode dihitung sebagai satu kolom).
Ini disembunyikan untuk sementara waktu karena peringatan ini pada dasarnya diabaikan karena solusi untuk beberapa bug parser lama dengan kesalahan semi-umum. Ketika saya menerapkan kembali peringatan kepada pengguna dengan cara yang jauh lebih baik, saya secara tidak sengaja _menyembunyikan_ mereka, dan baru-baru ini memperbaikinya sehingga membuatnya terlihat lagi.
Sepertinya W030
, W033
, dan W009
juga terpengaruh. Dari uraian Anda, saya berasumsi _all_ rules terpengaruh?
Saya juga mengalami masalah ini dan saya dapat mereplikasi kesalahan dan peringatan. Jenis aturan/kesalahan sepertinya tidak masalah.
Berikut ini contoh jshint yang mencoba memperingatkan saya '==' saya seharusnya '==='. Perhatikan lokasi yang salah dari garis bawah oranye:
Semoga ini mengkonfirmasi pemikiran Anda tentang masalah ini.
Saya punya waktu untuk melakukan penggalian hari ini, dan saya yakin menyetel opsi indent
ke 1
akan menghasilkan hasil yang diinginkan.
@Arcanemagus Apakah Anda dapat mengesampingkan nilai opsi indent
untuk konsumen Anda? Jika ini memungkinkan, saya lebih suka melakukannya, karena saya tidak yakin bagaimana mengubah nilai default di JSHint itu sendiri dapat mempengaruhi konsumennya.
Hmmm, saat ini proyek ini menggunakan antarmuka CLI sepertinya. Dimungkinkan untuk menulis ulang untuk menggunakan Node.js API yang memungkinkan hal itu.
indent
akan mengubah hasil yang dilihat konsumen? Tujuan dari paket itu adalah sedekat mungkin dengan menjalankan jshint
sendiri, tetapi mendapatkan hasil yang terintegrasi dalam editor.Bagaimana dengan menambahkan argumen baris perintah yang memungkinkan untuk menimpa nilai dari konfigurasi?
Sesuatu seperti itu umum di alat-alat seperti -g di nginx, -o di ssh, -c di git dan banyak lagi saya kira.
$ jshint -o "indent = 1" -o "-W034 = true" -o "globals.require = false" -o "globals.$ = null"
Adakah yang tahu versi apa ini diperkenalkan? 2.9.5?
Setidaknya kita bisa downgrade untuk sementara sebagai temp. memperbaiki.
@jaredatch Kembali di https://github.com/AtomLinter/linter-jshint/pull/386 (dirilis di v3.1.0 dari linter-jshint
) semua solusi untuk pelaporan titik kereta JSHint telah dihapus. Inti dari pemeriksaan itu adalah untuk menemukan bug seperti ini di mana linter melaporkan poin yang tidak valid sehingga dapat dilaporkan dan diperbaiki untuk _semua orang_ menggunakan linter. (Lagi pula, jika Anda tidak dapat mempercayai linter untuk memberi Anda data yang akurat, mengapa menggunakannya?)
Ada _mungkin_ "titik manis" sebelum bug tab ini diperkenalkan dan setelah bug parser utama yang menyebabkan solusi tersebut diterapkan di tempat pertama.
@Arcanemagus gotcha, sangat menghargai wawasannya. Teruslah berkarya 👍
Jika Anda memiliki ide pesan yang lebih baik / lebih berguna tentang bagaimana linter-jshint
melaporkan poin yang tidak valid ini, silakan ajukan masalah / kirimkan PR di sana .
TOLONG SEMUA SOLUSI ANDA SUCK IVE MENGHABISKAN 5 JAM MASA LALU MENCOBA MENJAGA FILE JAVASCRIPT SIALAN 2017 MENGAPA SAYA MEMILIKI MASALAH INI ATOM ADALAH BANNE DARI HIDUP SAYA PERBAIKI DIRI ANDA IDE BODOH
DAN SIAPA YANG TIDAK MENGGUNAKAN TABS UNTUK INDENT SECARA harafiah WTF MENGAPA ANDA AKAN MERASAKAN PAKET RUSAK KE JUTAAN LINT JS???????
Siapa yang tidak menggunakan titik secara harfiah dengan mengapa Anda merilis bahasa Inggris yang rusak ini ke jutaan bahasa Inggris?
Oh. Dan karakter huruf besar diletakkan di awal kalimat. Tidak di mana-mana.
/Troll (maaf, tidak bisa menahan diri)
Yah, saya kira solusinya akan menonaktifkan ini untuk saat ini ...
Siapa yang butuh linter?
@jugglinmike Bisakah Anda menjawab pertanyaan di https://github.com/jshint/jshint/issues/3151#issuecomment -312512856?
Saya memiliki 20 masalah unik yang terbuka untuk kasus berbeda yang dipicu, karena sepertinya memperbaiki ini di sini akan memakan waktu cukup lama. Saya ingin melanjutkan dengan solusi, dengan asumsi itu tidak akan mengubah hasil untuk pengguna.
Masalah ini luput dari radar saya; Saya minta maaf tentang itu, @Arcanemagus. Sayangnya, saya tidak berpikir saya akan bisa memberikan perhatian yang layak sampai akhir pekan ini. Apakah itu akan berhasil untuk Anda?
@jugglinmike Tentu saja
Saya melakukan beberapa pemeriksaan untuk masalah yang ada, jadi sebagian besar orang difilter ke masalah yang sudah terbuka yang menunjuk ke sini.
@cobexer Saya suka ide itu karena selain memberi kami jalan ke depan, itu
mungkin berguna untuk orang-orang dalam konteks lain. Yang mengatakan, sepengetahuan saya di sana
belum pernah ada permintaan untuk fungsi semacam itu, dan saya enggan untuk
berkomitmen untuk fitur baru hanya karena tampaknya bagus. Dan ada alasan untuk
mencegah fitur itu secara khusus: antara file "rc", in-line
konfigurasi, dan API Node.js, pengguna sudah tersandung saat mereka mau
untuk memahami mengapa opsi yang diberikan diaktifkan. Menambahkan vektor lain untuk konfigurasi
manajemen akan cenderung memperburuk masalah ini.
Saya pikir solusi yang paling layak di sini didasarkan pada saya sebelumnyaproposal .
Namun, kita harus mempertimbangkan properti character
sebagai API publik--Atom
Plugin editor itu sendiri dibangun di atasnya. Jadi alih-alih memodifikasi itu
properti dan mendefinisikan yang baru yang memiliki semantik saat ini, saya pikir
kita harus membiarkan character
apa adanya dan mengekspos data yang diminta pada yang baru
Nama properti.
Saya mulai mengerjakan fitur baru akhir pekan ini. Saya ingin menghindari regresi di
semua biaya, jadi kami perlu memperpanjang pengujian proyek untuk secara konsisten menegaskan
nomor karakter yang diharapkan. Ketika saya mulai melakukan ini, saya menemukan kekurangan dalam
test suite yang perlu ditangani terlebih dahulu. gh-3174 adalah langkah pertama menuju
tujuan itu.
Semua ini untuk mengatakan: sepertinya ini mungkin memakan waktu. @Arcanemagus saya tahu
Anda menanggung beban bug ini, dan saya menghargai Anda menganggap ini sebagai
kesempatan untuk melihat JSHint ditingkatkan. Saya juga suka Anda tertarik
menghindari solusi apa pun yang tidak transparan bagi pengguna Anda. Singkatnya
istilah, apakah Anda beruntung merekomendasikan pengguna menyetel opsi indent
ke 1
?
Ini tidak ideal, tetapi melakukannya harus menyelesaikan masalah jangka pendek mereka dengan cara
yang akan terus berfungsi bahkan setelah kami memperbaikinya.
@Arcanemagus Saya tahu Anda menanggung beban bug ini, dan saya menghargai Anda menganggap ini sebagai
kesempatan untuk melihat JSHint ditingkatkan.
Seluruh alasan saya menambahkan tanda centang ke perpustakaan umum yang digunakan oleh sebagian besar penyedia Linter untuk Atom adalah agar bug seperti ini dapat ditangkap di linter sumber dan dilaporkan/diperbaiki . Ini sebenarnya akan ditangkap sebelumnya, tetapi ada cek di linter-jshint
yang pada dasarnya menyembunyikan semua kesalahan titik yang tidak valid dari _way_ kembali ketika parser benar-benar gagal pada sebagian besar dokumen dan kami tidak memiliki cara yang baik untuk melaporkannya kepada pengguna atau untuk menghilangkan duplikasi laporan masalah. Sekarang setelah mengetahuinya, saya menghapus cek itu dan di sinilah kita .
Saya juga suka Anda tertarik untuk menghindari solusi apa pun yang tidak transparan bagi pengguna Anda.
Sebenarnya, solusi transparan untuk masalah khusus ini akan baik-baik saja, saya hanya tidak tahu apakah memaksa pengaturan indent
ke 1
akan mengubah hasil yang mereka lihat dibandingkan dengan apa yang akan mereka dapatkan dari menjalankan jshint
sendiri.
Dalam jangka pendek, apakah Anda beruntung merekomendasikan pengguna mengatur opsi indentasi ke 1?
Itu... ide bagus yang sebenarnya tidak terpikirkan oleh saya untuk diposting di edisi-edisi tersebut. Saya akan pastikan untuk menyebutkan bahwa di lebih banyak mengomentari masalah!
Oh, ya, menyetel properti 'indent' ke 1 di .jshintrc adalah solusi yang sangat baik. Saya berharap saya tahu tentang itu lebih cepat. Saya sudah memiliki .jshintrc karena jshint tidak default ke es6, jadi ini mudah untuk ditambahkan. 👍
Senang mendengarnya, @tustin2121!
Pembaruan: Saya masih bekerja untuk menopang rangkaian uji JSHint untuk menghindari regresi. Yang terbaru dalam upaya itu adalah gh-3176.
Setiap pembaruan tentang masalah ini?
Sepertinya kita setidaknya 40 aturan berbeda yang terpengaruh oleh bug ini sekarang .
Setiap pembaruan tentang ini, sudah beberapa bulan sejak saya mengalami kesalahan ini, membuat saya gila :)
Hai @xcrap! Saya baru saja memeriksa utas komentar, dan sepertinya tidak ada yang memposting pembaruan apa pun. Kabar baiknya adalah bahwa JSHint adalah proyek open source, jadi Anda dapat membantu memperbaiki masalah jika itu membuat Anda stres! Apakah Anda ingin mengulurkan tangan? Saya akan dengan senang hati menasihati Anda.
@jugglinmike saya berharap! Saya selalu mencoba dalam proyek kecil tetapi keterampilan js saya sangat mendasar dan terbatas :)
Saya memberikan hadiah $50 pada bug ini, orang lain dapat berkontribusi untuk meningkatkan hadiah melalui tautan ini: https://www.bountysource.com/issues/46533252-tab-indentation-breaks-multiple-rules
Menarik garpu @tzvipm secara lokal dan membangun kembali jshint berfungsi untuk memperbaiki masalah bagi saya jika ada orang lain yang menemukan ini:
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
Komentar yang paling membantu
TOLONG SEMUA SOLUSI ANDA SUCK IVE MENGHABISKAN 5 JAM MASA LALU MENCOBA MENJAGA FILE JAVASCRIPT SIALAN 2017 MENGAPA SAYA MEMILIKI MASALAH INI ATOM ADALAH BANNE DARI HIDUP SAYA PERBAIKI DIRI ANDA IDE BODOH
DAN SIAPA YANG TIDAK MENGGUNAKAN TABS UNTUK INDENT SECARA harafiah WTF MENGAPA ANDA AKAN MERASAKAN PAKET RUSAK KE JUTAAN LINT JS???????