Metals menghadirkan pengalaman penyuntingan kelas IDE untuk kode Scala melalui Language Server Protocol, sedangkan scalafmt menata format kode menurut aturan yang disepakati oleh satu tim. Topik ini membahas konsep server bahasa, fitur penyuntingan utama Metals, berkas konfigurasi yang menyertainya, serta demonstrasi pemformatan scalafmt dari terminal. Setelah topik ini dibaca, pekerjaan menyunting kode Scala dan menjaga konsistensi formatnya memiliki dasar yang jelas.
Metals dan Language Server Protocol#
Metals adalah server bahasa (language server) untuk Scala, yaitu program terpisah yang menganalisis kode sumber dan menyajikan hasil analisisnya kepada editor. Analisis itu disalurkan melalui Language Server Protocol (LSP), yakni protokol standar yang memisahkan logika pemahaman bahasa dari program editor. Berkat pemisahan tersebut, satu server bahasa melayani banyak editor sekaligus, sehingga dukungan Scala tidak perlu ditulis ulang untuk setiap editor. Editor yang mendukung LSP seperti VS Code, Vim, Emacs, Neovim, dan Sublime Text dapat menggunakan Metals dengan menambahkan plugin Metals milik editor masing-masing.
Saat penyuntingan berlangsung, editor mengirim posisi kursor dan isi berkas kepada Metals, kemudian Metals menjawab dengan data seperti daftar pelengkapan atau lokasi definisi sebuah simbol. Pemahaman Metals atas proyek diperoleh dari build tool yang digunakan proyek tersebut, misalnya Scala CLI, sbt, Maven, atau Gradle, melalui proses import yang berjalan setelah proyek dibuka. Setelah impor selesai, Metals mengenal dependensi, konfigurasi kompiler, dan seluruh berkas sumber proyek.
Pemasangan Metals pada VS Code dilakukan melalui ekstensinya, seperti pada perintah berikut yang memerlukan editor yang sudah terpasang di komputer.
# tidak-dijalankan
code --install-extension scalameta.metalsSetelah ekstensi terpasang dan proyek dibuka, ekstensi meminta Metals melakukan impor build, lalu fitur penyuntingan siap digunakan. Plugin Metals untuk editor lain menawarkan langkah yang senada, yaitu memasang plugin, membuka proyek, dan menunggu impor selesai.
Fitur penyuntingan utama Metals#
Empat fitur Metals yang paling sering digunakan sehari-hari adalah pelengkapan kode, go to definition, saran import, dan worksheet. Pelengkapan kode (completions) menampilkan kandidat anggota yang sah pada posisi kursor, misalnya daftar metode milik sebuah objek beserta tanda tangannya, sehingga nama dan parameter tidak perlu dihafal.
Perintah go to definition melompat dari penggunaan sebuah simbol ke tempat simbol itu dideklarasikan, baik pada berkas proyek maupun pada dependensi yang menyertakan kode sumbernya. Saran import (import suggestions) muncul ketika sebuah nama belum terdefinisi, dan Metals menawarkan paket yang memuat nama tersebut untuk ditambahkan ke daftar import. Kedua fitur ini bekerja berdasarkan data yang diperoleh Metals dari proses impor build, sehingga kualitas hasilnya bergantung pada proyek yang sudah berhasil diimpor.
Worksheet adalah berkas berekstensi .worksheet.sc yang dievaluasi setiap kali berkas disimpan, dan hasil tiap ekspresi ditampilkan di samping barisnya. Bentuk ini cocok untuk eksperimen kecil karena tidak memerlukan metode @main maupun perintah run terpisah. Isi sebuah worksheet cukup berupa urutan ekspresi seperti berikut.
val harga = 12000
val jumlah = 3
harga * jumlahKetika berkas seperti itu disimpan di editor yang terhubung dengan Metals, editor menampilkan 36000 sebagai hasil ekspresi terakhir di samping barisnya. Worksheet menempati peran yang mirip REPL, tetapi hasilnya tetap tersimpan sebagai bagian dari berkas dan dapat disunting kembali.
Berkas konfigurasi Metals#
Konfigurasi Metals berada di luar kode proyek dan mengatur perilaku servernya. Berkas .metals.properties pada akar workspace menyimpan properti server dalam format berkas properti Java, misalnya metals.java-home untuk menunjuk lokasi JDK yang digunakan Metals. Pada proyek Scala CLI, hasil build disimpan pada folder .scala-build, dan folder .metals menyimpan data kerja Metals itu sendiri.
Ketiga lokasi itu berisi data turunan yang dapat dibuat ulang dari kode sumber, sehingga lazim dikecualikan dari repository. Berkas .metals.properties adalah pengecualian yang wajar apabila tim ingin berbagi pengaturan server yang sama, misalnya lokasi JDK, karena berkas itu memang ditulis oleh manusia. Mengenal ketiganya mempercepat pencarian sumber sebuah pengaturan atau masalah build.
Scalafmt dan berkas .scalafmt.conf#
Scalafmt adalah formatter untuk kode Scala yang menulis ulang spasi, indentasi, dan pemenggalan baris tanpa mengubah makna program. Keluarannya deterministik, artinya kode yang sama dengan konfigurasi yang sama selalu menghasilkan teks yang persis sama, sehingga perbedaan selera format tidak lagi muncul pada code review. Aturan pemformatan dinyatakan pada berkas .scalafmt.conf di akar proyek, dan berkas itu ikut tersimpan dalam repository sehingga seluruh anggota tim menggunakan aturan yang sama.
version = "3.11.5"
runner.dialect = scala3
indent.main = 4
maxColumn = 60Entri version menetapkan versi scalafmt yang digunakan dan wajib ada pada berkas konfigurasi. Entri runner.dialect = scala3 memberi tahu scalafmt bahwa kode menggunakan sintaks Scala 3, sedangkan indent.main = 4 menetapkan lebar indentasi utama empat spasi. Entri maxColumn = 60 menetapkan batas panjang baris sebanyak 60 karakter, dan baris yang melebihi batas itu dipenggal pada posisi yang wajar. Metals memanfaatkan scalafmt untuk perintah format dokumen di editor, sehingga aturan pada berkas ini berlaku baik dari terminal maupun dari editor.
Mencoba scalafmt dari terminal#
Scala CLI menyertakan perintah scala-cli fmt yang menjalankan scalafmt atas berkas yang diberikan, sehingga pemformatan dapat dicoba tanpa memasang alat tambahan. Berkas berikut sengaja ditulis tanpa aturan format untuk menunjukkan efek konfigurasi sebelumnya.
object StatistikKata{
def jumlahKata(teks:String):Int=
teks.trim.split("\\s+").filter(_.nonEmpty).length
}
@main def cekStatistikKata():Unit={println(StatistikKata.jumlahKata("belajar format kode Scala"))}# salin berkas, format salinannya, lalu tampilkan hasilnya
cp a.scala kerja.scala && scala-cli fmt kerja.scala 2>/dev/null && cat kerja.scalaobject StatistikKata {
def jumlahKata(teks: String): Int =
teks.trim.split("\\s+").filter(_.nonEmpty).length
}
@main def cekStatistikKata(): Unit = {
println(
StatistikKata.jumlahKata("belajar format kode Scala")
)
}Keluaran menunjukkan dua efek aturan konfigurasi. Definisi jumlahKata berada empat spasi dari tepi kiri karena indent.main = 4, dan pemanggilan println yang semula ditulis pada satu baris panjang dipenggal menjadi beberapa baris karena melebihi maxColumn = 60. Perintah dijalankan atas salinan bernama kerja.scala agar berkas a.scala tetap dalam bentuk aslinya sebagai pembanding.
Ringkasan#
- Metals adalah server bahasa Scala berbasis LSP yang melayani editor apa pun yang mendukung protokol tersebut, dengan fitur pelengkapan kode, go to definition, saran import, dan worksheet.
- Metals memahami proyek melalui build tool dan menyimpan pengaturannya pada
.metals.properties, sedangkan Scala CLI menyimpan hasil build pada folder.scala-build. - Scalafmt menata format menurut berkas
.scalafmt.conf, danscala-cli fmtmenjalankannya dari terminal atas berkas atau salinannya. - Keluaran scalafmt bersifat deterministik, sehingga satu berkas konfigurasi cukup untuk menjaga format seragam di seluruh tim.
Referensi#
- Metals — Scalameta — Dokumentasi resmi Metals, server bahasa Scala berbasis LSP.
- Editors — Metals — Daftar editor yang didukung Metals beserta petunjuk pemasangan pluginnya.
- Scalafmt — Scalameta — Dokumentasi resmi scalafmt, formatter kode Scala.
- Configuration — Scalafmt
— Daftar opsi konfigurasi scalafmt seperti
version,runner.dialect,indent.main, danmaxColumn.