Jshint: Lekukan tab melanggar banyak aturan

Dibuat pada 23 Jun 2017  ·  29Komentar  ·  Sumber: jshint/jshint

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.

W032

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.

W098

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.

W117

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
  • Banyak lainnya...
Needs Discussion

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???????

Semua 29 komentar

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:
erroneoustargeting

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.

  • Apakah memaksakan nilai 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.
  • Apakah JSHint API memiliki metode tersembunyi untuk mengambil konfigurasi file, atau apakah itu perlu diimplementasikan? Dokumentasi saat ini tidak menunjukkan fungsi seperti itu.

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?
image

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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat