Jshint: Pemutusan garis ternary

Dibuat pada 5 Jul 2015  ·  19Komentar  ·  Sumber: jshint/jshint

var a = (tern)
    ? b
    : c;

Kode ini menghasilkan peringatan: Bad line breaking before '?'.

Kontrol aliran jshint adalah:

Pertama tangkap "?" token dan kemudian meneruskannya ke fungsi ekspresi

  infix("?", function(left, that) {
    increaseComplexityCount();
    that.left = left;
    that.right = expression(10);
    advance(":");
    that["else"] = expression(10);
    return that;
  }, 30);

Ekspresi fungsi berisi logika ini di dekat awalnya

    var isDangerous =
      state.option.asi &&
      state.tokens.prev.line !== startLine(state.tokens.curr) &&
      _.contains(["]", ")"], state.tokens.prev.id) &&
      _.contains(["[", "("], state.tokens.curr.id);

    if (isDangerous)
      warning("W014", state.tokens.curr, state.tokens.curr.id);

Tampaknya kode JSHint salah menangkap jeda baris antara ")" dan "?" dalam logika ASI-nya. ASI tidak boleh berlaku dalam kasus ini. Memecah ternary menjadi beberapa baris membuat kode lebih mudah dibaca. Contoh:

var a = (tern1 > 0)
        ? b
        : (tern2 > x)
            ? c
            : d,
    e = 1;
Needs Discussion P1

Komentar yang paling membantu

@prettydiff
ini melewati jshint

/* jshint laxbreak: true */
var a = (tern)
    ? b
    : c;

Jadi, aktifkan saja opsi itu untuk tidak mendapatkan peringatan.

laxbreak akan dihapus dalam waktu dekat. ini adalah masalah yang diangkat untuk menghapusnya - #1867

Semua 19 komentar

mengapa Anda masih menggunakan JSHint, dan bukan hanya JSLint yang jauh lebih baik?

@kaizer200 JSHint adalah alat yang jauh lebih sering digunakan. Tujuan saya adalah untuk mencapai kesesuaian dengan pengaturan default keduanya sedekat mungkin. Dengan cara ini saya dapat secara akurat mewakili keinginan pengguna untuk menyesuaikan diri dengan salah satu alat dengan penyesuaian sesedikit mungkin.

Saya pikir ini diinginkan, karena ada tes ini:

code = [ 'var a = b ', '? c : d;' ];
TestRun(test)
  .addError(2, "Bad line breaking before '?'.")
  .test(code, { es3: true });

( tests/unit/options.js , baris 1583)

Fakta bahwa ada ujian tidak berarti itu diinginkan. Ini lebih banyak wilayah jscs

@caitp Apakah Anda memperbaiki ini?

Ini tidak dinonaktifkan oleh laxbreak? Saya tahu ini sudah usang, tetapi itu tidak akan dihapus sampai v3

Tidak ada peta jalan nyata untuk v3, aman untuk menyingkirkan ini --- itu tidak akan merusak bangunan siapa pun

@caitp Untuk token yang sama, JSHint juga harus mengizinkan jeda baris sebelum &&, ||, ... secara default.

Ada peta jalan, saya dan @jugglinmike telah mendiskusikannya. Semuanya ada di tonggak v3.

Itu tidak akan merusak bangunan orang, tetapi itu akan menghentikan peringatan yang diandalkan orang, ketika tidak ada peringatan dan sangat sedikit dokumentasi bahwa opsi telah dihapus (dan tidak ada versi utama yang membuat orang melihat daftar perubahan dan memperhatikan bahwa mereka harus menggunakan jscs )

Tidak ada yang secara realistis mengandalkan ini, dan tonggak sejarah bukanlah peta jalan. Tonggak sejarah v3 telah ada selama berabad-abad, tidak ada tenggat waktu dan tidak ada tekanan. Ada log perubahan untuk semua rilis, bukan hanya yang utama, dan peringatan palsu lainnya telah dihapus. Tidak ada argumen yang meyakinkan untuk mempertahankan ini tanpa batas, ini adalah wilayah jscs

Pencapaian v3 telah ada sejak lama

Kami baru-baru ini membersihkannya dan membuatnya menjadi daftar yang lebih pendek dan dapat dicapai.

Ada beberapa PR yang menunggunya.

Ada log perubahan untuk semua rilis, bukan hanya yang utama, dan peringatan palsu lainnya telah dihapus. Tidak ada argumen yang meyakinkan untuk mempertahankan ini tanpa batas, ini adalah wilayah jscs

Saya setuju, itu hanya ketika. Saya hanya tidak setuju dengan _both_ classing tidak memperingatkan tentang aturan usang sebagai perubahan yang melanggar, jadi tidak menggabungkan sampai v3 dan pada saat yang sama, menghapus aturan usang. Jika jshint ingin sangat berhati-hati, berhati-hatilah. Jika ingin menghapus aturan, tabrak versi utama atau peringatkan orang.

Sangat mudah untuk melewatkan bahwa opsi telah ditinggalkan jika Anda mengatur jshint beberapa waktu lalu - apakah kita ingin pengalaman yang didapat orang adalah bagi mereka untuk meningkatkan bug dan kemudian diberi tahu bahwa itu sudah usang? atau membuatnya jelas?

Tidak ada yang secara realistis mengandalkan ini

Saya dulu mengandalkan jshint untuk semacam pengecekan gaya sampai saya mengetahui tentang jscs dan beralih ke sana. Saya yakin masih banyak orang.

Tidak ada yang secara realistis mengandalkan ini

Mencari di GitHub... https://github.com/search?l=json&q=%22laxbreak%22%3A+false&ref=searchresults&type=Code&utf8=%E2%9C%93

@prettydiff
ini melewati jshint

/* jshint laxbreak: true */
var a = (tern)
    ? b
    : c;

Jadi, aktifkan saja opsi itu untuk tidak mendapatkan peringatan.

laxbreak akan dihapus dalam waktu dekat. ini adalah masalah yang diangkat untuk menghapusnya - #1867

keberatan untuk menutup ini sebagai duplikat dari #1867 ?

Pilihan saya adalah menjadikannya bug baru dan memperbaikinya dengan benar. Tidak ada versi utama yang diperlukan di sini

@lukeapage Jika laxbreak dihapus di v3.0 apakah contoh kode ini akan menghasilkan peringatan di v3.0 dan apa perkiraan garis waktu pada rilis v3.0?

Jika laxbreak dihapus di v3.0 apakah contoh kode ini akan menghasilkan peringatan di v3.0

Rencananya adalah untuk menghapus opsi laxbreak dan tidak lagi memperingatkan dalam kasus laxbreak.
Penggunaan opsi dapat menghasilkan peringatan bahwa opsi tersebut tidak digunakan lagi dan dapat dihapus.

apa perkiraan garis waktu pada rilis v3.0

Saya tidak yakin, ada pr untuk meninjau/menyelesaikan dan memperbaiki banyak bug. Saya ragu itu akan terjadi di bulan depan.

Cait adalah kontributor jangka panjang dan kontributor/pemilik lain mungkin memutuskan untuk setuju dengannya dan menghapus peringatan di rilis berikutnya, di mana Anda akan berhenti melihat peringatan dan kemudian di v3 Anda akan mulai diperingatkan bahwa opsi laxbreak sudah usang (jika Anda memutuskan untuk mulai menggunakannya sekarang).

@lukeapage Dengan itu Anda sekarang dapat menutup bug ini (dari sudut pandang saya).

Apakah halaman ini membantu?
0 / 5 - 0 peringkat