Alur kerja editor

Ionide, formatter Fantomas, dan penekanan peringatan terlingkup lewat #nowarn serta #warnon.

Daftar isi

Alur kerja editor untuk F# bertumpu pada tiga perkakas yang saling melengkapi: ekstensi Ionide yang menghubungkan VS Code dengan compiler dan F# Interactive, formatter Fantomas yang menyamakan gaya penulisan kode, serta direktif peringatan #nowarn dan #warnon yang mengatur peringatan compiler per bagian berkas. Topik ini membahas ketiganya secara berurutan, dengan demo pemformatan dan penekanan peringatan yang dijalankan dari baris perintah sehingga hasilnya dapat direproduksi di mana saja.

Ekstensi Ionide untuk VS Code#

Ionide adalah kumpulan ekstensi VS Code yang membawa pengalaman mengembangkan F# ke editor, meliputi penyorotan sintaks, pelengkapan yang berbasis tipe, tampilan struktur proyek, serta jendela F# Interactive untuk mengeksekusi potongan kode tanpa keluar dari editor. Ekstensi utamanya bernama Ionide.Ionide-fsharp dan dipasang melalui panel ekstensi atau baris perintah berikut.

bash
# tidak-dijalankan: perintah ini memerlukan VS Code yang terpasang di mesin pembaca
# memasang ekstensi Ionide dari baris perintah
code --install-extension Ionide.Ionide-fsharp

Perintah tersebut dijalankan pada mesin dengan VS Code yang terpasang, sedangkan lingkungan kerja untuk tulisan ini tidak menyediakan antarmuka grafis sehingga tidak dieksekusi di sini. Setelah terpasang, Ionide mengenali proyek dari berkas fsproj yang dibuka pada folder kerja, menampilkan pesan compiler secara langsung di editor, dan menyediakan perintah kirim-ke-FSI untuk mengeksekusi skrip fsx baris demi baris. Lingkungan bahasa yang digunakan Ionide berasal dari .NET SDK yang sama dengan yang digunakan dotnet CLI, sehingga versi F# di editor dan di terminal otomatis sinkron.

Pemformatan dengan Fantomas#

Fantomas adalah formatter F# yang mengatur ulang spasi, indentasi, dan pemenggalan baris sesuai konvensi yang dapat dikonfigurasi. Formatter dipasang sebagai dotnet tool global, dan berkas yang diformat tidak diubah secara semantik, hanya tata letaknya. Perintah berikut memasangnya dan menampilkan versi yang digunakan pada lingkungan penulisan ini.

bash
# memasang Fantomas sebagai dotnet tool global
# keluaran perintah ini berisi progres unduhan dan versi, sehingga tidak ditempelkan
dotnet tool install -g fantomas

Pemasangan satu kali ini mengunduh paket dan menempatkan perintah fantomas pada PATH, dan keluarannya bergantung pada kondisi pemasangan sehingga tidak ditempelkan di sini. Versi yang digunakan dapat diperiksa dengan perintah berikut.

bash
# menampilkan versi Fantomas yang terpasang
fantomas --version
text Keluaran
Fantomas v8.1.1+2136021f6

Versi pada mesin pembaca dapat berbeda tergantung waktu pemasangan, dan perilaku pemformatan antar versi mayor dapat berubah sehingga versi yang digunakan sebaiknya disepakati dalam tim. Berkas berantakan.fsx berikut adalah contoh kode yang sah menurut compiler tetapi tata letaknya tidak konsisten.

fsharp berantakan.fsx
// tidak-dijalankan: berkas ini hanya menjalani pemformatan melalui blok bash berikutnya
// demo Fantomas: spasi dan indentasi berikut belum konsisten
let suhuKeFahrenheit(c:float)=c*9.0/5.0+32.0
let ringkas xs =
  xs |> List.sum |> fun t -> t / float (List.length xs)
printfn "%F" (suhuKeFahrenheit 25.0)
printfn "%F" (ringkas [70;80;90])

Blok bash berikut menyalin berkas itu menjadi demo-format.fsx, memformat salinannya, lalu menampilkan isinya. Pemformatan diterapkan pada salinan untuk menjaga berkas aslinya tetap utuh sebagai bahan latihan pemformatan ulang.

bash
# menyalin berkas, memformat salinannya, lalu menampilkan hasilnya
cp berantakan.fsx demo-format.fsx
fantomas demo-format.fsx
cat demo-format.fsx
text Keluaran
+ demo-format.fsx was formatted.
// tidak-dijalankan: berkas ini hanya menjalani pemformatan melalui blok bash berikutnya
// demo Fantomas: spasi dan indentasi berikut belum konsisten
let suhuKeFahrenheit (c: float) = c * 9.0 / 5.0 + 32.0

let ringkas xs =
    xs |> List.sum |> fun t -> t / float (List.length xs)

printfn "%F" (suhuKeFahrenheit 25.0)
printfn "%F" (ringkas [ 70; 80; 90 ])

Baris + demo-format.fsx was formatted. melaporkan bahwa berkas mengalami perubahan, sedangkan tanda + menandakan versi baru dituliskan ke berkas. Perubahan yang terjadi bersifat tata letak semata, yaitu spasi di sekitar tanda titik dua dan operator, indentasi empat spasi yang seragam, serta baris kosong pemisah antar definisi. Dalam tim, Fantomas dijalankan sebelum commit agar perbedaan gaya tidak pernah masuk ke code review.

Pemeriksaan format sebagai gerbang commit#

Menjalankan formatter secara manual bergantung pada kedisiplinan, sehingga pemeriksaan format lebih baik dijadikan gerbang otomatis. Opsi --check tidak mengubah berkas apa pun, melainkan hanya melaporkan berkas yang tata letaknya belum sesuai dan mengembalikan kode keluar bukan nol. Perintah pada berkas yang berantakan dan pada salinan yang sudah diformat memperlihatkan kedua sisi perilaku itu.

bash
# memeriksa berkas yang belum diformat, tanpa mengubahnya
fantomas --check berantakan.fsx
# memeriksa salinan yang sudah diformat oleh Fantomas
cp berantakan.fsx demo-format.fsx
fantomas demo-format.fsx > /dev/null
fantomas --check demo-format.fsx
text Keluaran
! berantakan.fsx needs formatting.

Run fantomas berantakan.fsx to format it.

Berkas yang perlu diformat dilaporkan dengan tanda ! beserta perintah perbaikannya, dan kode keluar prosesnya adalah 99. Salinan yang sudah diformat tidak mencetak apa pun dan kode keluarnya 0, sehingga alur continuous integration cukup membaca kode keluar tanpa mengurai teksnya. Dengan pola ini, permintaan penggabungan yang berisi kode yang belum terformat ditolak otomatis, dan formatter tidak pernah berubah menjadi sumber perdebatan gaya di tinjauan kode.

Peringatan terlingkup dengan #nowarn dan #warnon#

Sejak F# 10, direktif #nowarn dan #warnon dapat digunakan berpasangan untuk menyenyapkan sebuah peringatan hanya pada rentang baris tertentu, bukan seluruh sisa berkas. Perilaku lama #nowarn yang berlaku sampai akhir berkas masih ada, tetapi pasangan baru ini menutup celahnya: peringatan lain di bawahnya tetap tampil. Berkas pertama menampilkan peringatan FS0025, yaitu pencocokan pola yang tidak melengkapi seluruh kemungkinan nilai.

fsharp peringatan.fsx
// tidak-dijalankan: skrip ini dieksekusi melalui blok bash berikutnya dengan jalur berkas disamarkan
// peringatan FS0025 muncul karena pola tidak lengkap
let klasifikasi n =
    match n with
    | 1 -> "satu"
    | 2 -> "dua"

printfn "%s" (klasifikasi 2)
bash
# menjalankan skrip, menyamakan jalur berkas pada pesan peringatan
dotnet fsi peringatan.fsx 2>&1 | sed -E 's#/.*/peringatan.fsx#peringatan.fsx#'
text Keluaran
peringatan.fsx(4,11): warning FS0025: Incomplete pattern matches on this expression. For example, the value '0' may indicate a case not covered by the pattern(s).

dua

Peringatan muncul pada baris 4 yang memuat match, tetapi program tetap berjalan dan mencetak dua. Jalur berkas pada pesan disamarkan oleh sed karena memuat folder kerja yang berbeda antar mesin. Peringatan semacam ini memang perlu disenyapkan bila kelengkapan pola sudah ditangani di tempat lain, tetapi menyenyapkannya untuk seluruh berkas ikut menyembunyikan peringatan serupa yang benar-benar perlu.

fsharp peringatan-terlingkup.fsx
// tidak-dijalankan: skrip ini dieksekusi melalui blok bash berikutnya dengan jalur berkas disamarkan
// #nowarn menyenyapkan FS0025, #warnon menghidupkannya kembali di titik yang ditentukan
#nowarn 25
let kelasTersembunyi n =
    match n with
    | 1 -> "satu"
    | 2 -> "dua"

#warnon 25
let kelasTersorot n =
    match n with
    | 1 -> "satu"
    | 2 -> "dua"

printfn "%s dan %s" (kelasTersembunyi 2) (kelasTersorot 2)
bash
# menjalankan skrip, menyamakan jalur berkas pada pesan peringatan
dotnet fsi peringatan-terlingkup.fsx 2>&1 | sed -E 's#/.*/peringatan-terlingkup.fsx#peringatan-terlingkup.fsx#'
text Keluaran
peringatan-terlingkup.fsx(11,11): warning FS0025: Incomplete pattern matches on this expression. For example, the value '0' may indicate a case not covered by the pattern(s).

dua dan dua

Dua fungsi di berkas itu sama-sama memiliki pola yang tidak lengkap, tetapi hanya peringatan dari kelasTersorot yang tampil, pada baris 11 setelah #warnon 25. Rentang #nowarn 25 berlaku dari baris direktifnya sampai #warnon 25 ditemui, dan setelah titik itu peringatan bernomor 25 kembali dihidupkan. Efeknya, peredaman peringatan menjadi terdokumentasi di dalam berkas dan tidak menelan peringatan lain yang lahir setelahnya.

Ringkasan#

  • Ionide menghubungkan VS Code dengan compiler dan F# Interactive sehingga pesan tipe dan proyek fsproj tampil langsung di editor.
  • Fantomas memformat tata letak kode tanpa mengubah semantik, dijalankan sebagai dotnet tool, dan opsi --check menjadikannya gerbang otomatis sebelum commit.
  • Pasangan #nowarn dan #warnon dari F# 10 menyenyapkan peringatan per rentang baris, sehingga peredaman terdokumentasi dan tidak menelan peringatan lain.

Referensi#