Seperti yang telah Anda lihat di topik Fitur Bahasa Terprogram, dimungkinkan untuk mengimplementasikan Fitur Bahasa dengan langsung menggunakan 9 API. Ekstensi Server Bahasa, bagaimanapun, menyediakan cara alternatif untuk mengimplementasikan dukungan bahasa tersebut Show
Topik ini
Mengapa Server Bahasa?Server Bahasa adalah jenis khusus dari ekstensi Kode Visual Studio yang memberdayakan pengalaman pengeditan untuk banyak bahasa pemrograman. Dengan Server Bahasa, Anda dapat mengimplementasikan pelengkapan otomatis, pemeriksaan kesalahan (diagnostik), lompat ke definisi, dan banyak fitur bahasa lainnya yang didukung dalam Kode VS Namun, saat mengimplementasikan dukungan untuk fitur bahasa di VS Code, kami menemukan tiga masalah umum Pertama, Server Bahasa biasanya diimplementasikan dalam bahasa pemrograman asli mereka, dan itu menghadirkan tantangan dalam mengintegrasikannya dengan VS Code, yang memiliki Node. waktu proses js Selain itu, fitur bahasa dapat menjadi intensif sumber daya. Misalnya, untuk memvalidasi file dengan benar, Language Server perlu mengurai sejumlah besar file, membangun Pohon Sintaks Abstrak untuknya, dan melakukan analisis program statis. Operasi tersebut dapat menyebabkan penggunaan CPU dan memori yang signifikan dan kami perlu memastikan bahwa kinerja VS Code tetap tidak terpengaruh Terakhir, mengintegrasikan beberapa alat bahasa dengan banyak editor kode dapat melibatkan upaya yang signifikan. Dari perspektif alat bahasa, mereka perlu beradaptasi dengan editor kode dengan API yang berbeda. Dari sudut pandang editor kode, mereka tidak dapat mengharapkan API seragam dari perkakas bahasa. Hal ini membuat implementasi dukungan bahasa untuk 1 bahasa di 2 editor kode karya 3Untuk mengatasi masalah tersebut, Microsoft menetapkan Protokol Server Bahasa, yang menstandarkan komunikasi antara perkakas bahasa dan editor kode. Dengan cara ini, Server Bahasa dapat diimplementasikan dalam bahasa apa pun dan dijalankan dalam prosesnya sendiri untuk menghindari biaya kinerja, karena mereka berkomunikasi dengan editor kode melalui Protokol Server Bahasa. Selain itu, alat bahasa yang sesuai dengan LSP dapat diintegrasikan dengan beberapa editor kode yang sesuai dengan LSP, dan editor kode yang sesuai dengan LSP dapat dengan mudah mengambil beberapa alat bahasa yang sesuai dengan LSP. LSP adalah kemenangan bagi penyedia perkakas bahasa dan vendor editor kode Dalam panduan ini, kita akan
Menerapkan Server BahasaRingkasanDalam VS Code, server bahasa memiliki dua bagian
Seperti yang dinyatakan secara singkat di atas, ada dua manfaat menjalankan Server Bahasa dalam proses terpisah
Berikut adalah ilustrasi VS Code yang menjalankan dua ekstensi Server Bahasa. Klien Bahasa HTML dan Klien Bahasa PHP adalah ekstensi Kode VS normal yang ditulis dalam TypeScript. Masing-masing menginstansiasi Server Bahasa yang sesuai dan berkomunikasi dengan mereka melalui LSP. Meskipun Server Bahasa PHP ditulis dalam PHP, ia masih dapat berkomunikasi dengan Klien Bahasa PHP melalui LSP Panduan ini akan mengajari Anda cara membangun Klien / Server Bahasa menggunakan Node SDK kami. Dokumen yang tersisa mengasumsikan bahwa Anda sudah familiar dengan VS Code Extension API Sampel LSP - Server Bahasa sederhana untuk file teks biasaMari buat ekstensi Server Bahasa sederhana yang mengimplementasikan pelengkapan otomatis dan diagnostik untuk file teks biasa. Kami juga akan membahas sinkronisasi konfigurasi antara Klien / Server Jika Anda lebih suka langsung masuk ke kode
Kloning repositori Microsoft/vscode-extension-samples dan buka sampelnya
Di atas menginstal semua dependensi dan membuka ruang kerja lsp-sample yang berisi kode klien dan server. Berikut adalah gambaran kasar dari struktur lsp-sample
Menjelaskan 'Klien Bahasa'Pertama mari kita lihat _4, yang menjelaskan kemampuan Klien Bahasa. Ada dua bagian yang menarikPertama, lihat bagiannya _Bagian ini menyumbangkan 5 pengaturan ke VS Code. Contoh ini akan menjelaskan bagaimana pengaturan ini dikirim ke server bahasa saat startup dan setiap perubahan pengaturan
Kode sumber Klien Bahasa aktual dan 1 yang sesuai ada di folder 2. Bagian yang menarik dalam file 3 adalah ia mereferensikan API host ekstensi 4 melalui bidang 5 dan menambahkan dependensi ke pustaka 6
Seperti yang disebutkan, klien diimplementasikan sebagai ekstensi Kode VS normal, dan memiliki akses ke semua API ruang nama Kode VS Di bawah ini adalah konten dari ekstensi yang sesuai. ts, yang merupakan entri dari ekstensi lsp-sample
Menjelaskan 'Server Bahasa'
Dalam contoh, server juga diimplementasikan dalam TypeScript dan dieksekusi menggunakan Node. js. Karena VS Code sudah dikirimkan dengan Node. js runtime, tidak perlu menyediakan sendiri, kecuali jika Anda memiliki persyaratan khusus untuk runtime Kode sumber untuk Server Bahasa ada di 8. Bagian yang menarik di file ________13______1 server adalah
Ini menarik _0 perpustakaanDi bawah ini adalah implementasi server yang menggunakan pengelola dokumen teks yang disediakan yang menyinkronkan dokumen teks dengan selalu mengirimkan delta inkremental dari VS Code ke server
Menambahkan Validasi SederhanaUntuk menambahkan validasi dokumen ke server, kami menambahkan pendengar ke pengelola dokumen teks yang dipanggil setiap kali konten dokumen teks berubah. Terserah server untuk memutuskan kapan waktu terbaik untuk memvalidasi dokumen. Dalam implementasi contoh, server memvalidasi dokumen teks biasa dan menandai semua kemunculan kata yang menggunakan HURUF BESAR SEMUA. Cuplikan kode yang sesuai terlihat seperti ini
Tip dan Trik Diagnostik
Untuk menjalankan Server Bahasa, lakukan langkah-langkah berikut
Instance Extension Development Host kemudian akan terlihat seperti ini Debugging baik Klien dan ServerMen-debug kode klien semudah men-debug ekstensi normal. Setel breakpoint dalam kode klien dan debug ekstensi dengan menekan F5 . Karena server dimulai oleh 2 yang berjalan di ekstensi (klien), kita perlu melampirkan debugger ke server yang sedang berjalan. Untuk melakukannya, alihkan ke tampilan Jalankan dan Debug dan pilih konfigurasi peluncuran Lampirkan ke Server dan tekan F5 . Ini akan melampirkan debugger ke server. Dukungan Pencatatan untuk Server BahasaJika Anda menggunakan 6 untuk mengimplementasikan klien, Anda dapat menentukan pengaturan 4 yang menginstruksikan Klien untuk mencatat komunikasi antara Klien/Server Bahasa ke saluran 5 Klien BahasaUntuk lsp-sample, Anda dapat mengatur pengaturan ini. 6. Sekarang menuju ke saluran "Contoh Server Bahasa". Anda harus melihat logMenggunakan Pengaturan Konfigurasi di ServerSaat menulis bagian klien dari ekstensi, kami telah menentukan pengaturan untuk mengontrol jumlah maksimum masalah yang dilaporkan. Kami juga menulis kode di sisi server untuk membaca pengaturan ini dari klien 0Satu-satunya hal yang perlu kita lakukan sekarang adalah mendengarkan perubahan konfigurasi di sisi server dan jika pengaturan berubah, validasi ulang dokumen teks yang terbuka. Agar dapat menggunakan kembali logika validasi penanganan peristiwa perubahan dokumen, kami mengekstrak kode menjadi fungsi 7 dan memodifikasi kode untuk menghormati variabel 8 _1Penanganan perubahan konfigurasi dilakukan dengan menambahkan notification handler untuk perubahan konfigurasi pada koneksi. Kode yang sesuai terlihat seperti ini _2Memulai kembali klien dan mengubah pengaturan ke laporan maksimum 1 masalah menghasilkan validasi berikut Menambahkan fitur bahasa tambahanFitur menarik pertama yang biasanya diterapkan oleh server bahasa adalah validasi dokumen. Dalam hal ini, bahkan linter dianggap sebagai server bahasa dan dalam VS Code linter biasanya diimplementasikan sebagai server bahasa (lihat contoh eslint dan jshint). Tetapi ada lebih banyak lagi ke server bahasa. Mereka dapat memberikan penyelesaian kode, Temukan Semua Referensi, atau Buka Definisi. Kode contoh di bawah menambahkan penyelesaian kode ke server. Ini mengusulkan dua kata 'TypeScript' dan 'JavaScript' _3Bidang _9 digunakan untuk secara unik mengidentifikasi item penyelesaian dalam penangan penyelesaian. Properti data transparan untuk protokol. Karena protokol penerusan pesan yang mendasari berbasis JSON, bidang data hanya boleh menyimpan data yang dapat diserialisasi ke dan dari JSONYang kurang hanyalah memberi tahu VS Code bahwa server mendukung permintaan penyelesaian kode. Untuk melakukannya, tandai kemampuan yang sesuai di penangan inisialisasi _4Tangkapan layar di bawah menunjukkan kode lengkap yang berjalan pada file teks biasa Menguji Server BahasaUntuk membuat Server Bahasa berkualitas tinggi, kita perlu membuat rangkaian pengujian yang bagus yang mencakup fungsinya. Ada dua cara umum untuk menguji Server Bahasa
Dimungkinkan untuk melakukan Tes Unit dalam kerangka pengujian pilihan Anda. Di sini kami menjelaskan cara melakukan pengujian End-to-End untuk Ekstensi Server Bahasa Buka 1, dan Anda dapat menemukan target pengujian 2 5Jika Anda menjalankan target debug ini, itu akan meluncurkan instance Kode VS dengan 3 sebagai ruang kerja aktif. Kode VS kemudian akan melanjutkan untuk menjalankan semua tes di 4. Sebagai tip debugging, Anda dapat mengatur breakpoint dalam file TypeScript di 4 dan mereka akan terkenaMari kita lihat file 6 _6Dalam pengujian ini, kami
Mari selami lebih dalam fungsi 8. Ini didefinisikan dalam _9 _7Di bagian aktivasi, kami
Setelah persiapan, kita dapat menjalankan Perintah Kode VS yang sesuai dengan setiap fitur bahasa, dan menegaskan hasil yang dikembalikan Ada satu tes lagi yang mencakup fitur diagnostik yang baru saja kami implementasikan. Lihat di _2Topik LanjutanSejauh ini, panduan ini tertutup
Ada beberapa topik lebih lanjut yang tidak dapat kami masukkan ke dalam panduan ini. Kami akan menyertakan tautan ke sumber daya ini untuk mempelajari lebih lanjut pengembangan Server Bahasa Fitur Server Bahasa tambahanFitur bahasa berikut saat ini didukung di server bahasa bersama dengan penyelesaian kode
Topik Fitur Bahasa Terprogram menjelaskan setiap fitur bahasa di atas dan memberikan panduan tentang cara mengimplementasikannya baik melalui protokol server bahasa atau dengan menggunakan API ekstensibilitas langsung dari ekstensi Anda Sinkronisasi Dokumen Teks TambahanContoh ini menggunakan pengelola dokumen teks sederhana yang disediakan oleh modul 0 untuk menyinkronkan dokumen antara VS Code dan server bahasaIni memiliki dua kelemahan
Oleh karena itu protokol mendukung sinkronisasi dokumen tambahan juga Untuk memanfaatkan sinkronisasi dokumen inkremental, server perlu menginstal tiga penangan notifikasi
Di bawah ini adalah cuplikan kode yang mengilustrasikan cara mengaitkan penangan notifikasi ini pada koneksi dan cara mengembalikan kemampuan yang tepat saat menginisialisasi _8Menggunakan VS Code API secara langsung untuk mengimplementasikan Fitur BahasaMeskipun Server Bahasa memiliki banyak manfaat, mereka bukan satu-satunya pilihan untuk memperluas kemampuan pengeditan Kode VS. Jika Anda ingin menambahkan beberapa fitur bahasa sederhana untuk jenis dokumen, pertimbangkan untuk menggunakan 4 sebagai opsiIni adalah _5 menggunakan 6 untuk menambahkan beberapa cuplikan sebagai pelengkap untuk file teks biasaLebih banyak sampel yang menggambarkan penggunaan VS Code API dapat ditemukan di https. //github. com/microsoft/vscode-extension-samples Error Tolerant Parser untuk Server BahasaSering kali, kode di editor tidak lengkap dan salah secara sintaksis, tetapi pengembang masih mengharapkan pelengkapan otomatis dan fitur bahasa lainnya berfungsi. Oleh karena itu, pengurai toleran kesalahan diperlukan untuk Server Bahasa. Parser menghasilkan AST yang bermakna dari kode yang sebagian lengkap, dan Server Bahasa menyediakan fitur bahasa berdasarkan AST Saat kami meningkatkan dukungan PHP di VS Code, kami menyadari bahwa parser resmi PHP tidak toleran terhadap kesalahan dan tidak dapat digunakan kembali secara langsung di Server Bahasa. Oleh karena itu, kami mengerjakan Microsoft/tolerant-php-parser dan meninggalkan catatan mendetail yang dapat membantu penulis Server Bahasa yang perlu mengimplementasikan parser yang toleran terhadap kesalahan Pertanyaan umumKetika saya mencoba melampirkan ke server, saya mendapatkan "tidak dapat terhubung ke proses runtime (timeout setelah 5000 ms)"?Anda akan melihat kesalahan batas waktu ini jika server tidak berjalan saat Anda mencoba memasang debugger. Klien memulai server bahasa jadi pastikan Anda telah memulai klien untuk menjalankan server. Anda mungkin juga perlu menonaktifkan breakpoint klien Anda jika mereka mengganggu memulai server |