From e5f048266091d2f49ff30bfb3b537a84f5dec25b Mon Sep 17 00:00:00 2001 From: He1pa <56333845+He1pa@users.noreply.github.com> Date: Sun, 8 Oct 2023 18:52:38 +0800 Subject: [PATCH] bugfix: fix the cli args for startup of lsp (#740) * bugfix: fix the cli args for normal startup of lsp to be consistent with client of vscode Signed-off-by: He1pa <18012015693@163.com> * test: add invalid subcommand unit test Signed-off-by: He1pa <18012015693@163.com> * chore: fmt code Signed-off-by: He1pa <18012015693@163.com> --------- Signed-off-by: He1pa <18012015693@163.com> --- kclvm/tools/src/LSP/src/lib.rs | 1 + kclvm/tools/src/LSP/src/main.rs | 70 ++++++++++++++-------------- kclvm/tools/src/LSP/src/main_loop.rs | 11 +++++ kclvm/tools/src/LSP/src/tests.rs | 45 ++++++++++++++++++ kclvm/tools/src/LSP/src/util.rs | 2 +- 5 files changed, 93 insertions(+), 36 deletions(-) diff --git a/kclvm/tools/src/LSP/src/lib.rs b/kclvm/tools/src/LSP/src/lib.rs index 442724c6e..ce4779dff 100644 --- a/kclvm/tools/src/LSP/src/lib.rs +++ b/kclvm/tools/src/LSP/src/lib.rs @@ -1,4 +1,5 @@ mod analysis; +mod capabilities; mod completion; mod config; mod db; diff --git a/kclvm/tools/src/LSP/src/main.rs b/kclvm/tools/src/LSP/src/main.rs index 74c328799..168a2307e 100644 --- a/kclvm/tools/src/LSP/src/main.rs +++ b/kclvm/tools/src/LSP/src/main.rs @@ -1,5 +1,6 @@ +use crate::main_loop::main_loop; use config::Config; -use main_loop::main_loop; +use main_loop::app; mod analysis; mod capabilities; mod completion; @@ -17,14 +18,43 @@ mod request; mod state; mod to_lsp; mod util; -use clap::Command; mod formatting; #[cfg(test)] mod tests; +/// Main entry point for the `kcl-language-server` executable. +fn main() -> Result<(), anyhow::Error> { + let args: Vec = std::env::args().collect(); + let matches = app() + .arg_required_else_help(false) + .try_get_matches_from(args); + match matches { + Ok(arg_matches) => match arg_matches.subcommand() { + Some(("version", _)) => { + println!("{}", kclvm_version::get_version_info()); + Ok(()) + } + Some((subcommand, _)) => Err(anyhow::anyhow!("unknown subcommand: {}", subcommand)), + None => { + let status: Result = { + run_server().map_err(|e| anyhow::anyhow!("{}", e))?; + Ok(ExitStatus::Success) + }; + match status.unwrap() { + ExitStatus::Success => {} + ExitStatus::Error => std::process::exit(1), + }; + Ok(()) + } + }, + Err(e) => Err(e.into()), + } +} + +#[allow(dead_code)] /// Main entry point for the language server -pub fn run_server() -> anyhow::Result<()> { +fn run_server() -> anyhow::Result<()> { // Setup IO connections let (connection, io_threads) = lsp_server::Connection::stdio(); // Wait for a client to connect @@ -54,39 +84,9 @@ pub fn run_server() -> anyhow::Result<()> { Ok(()) } +#[allow(dead_code)] #[derive(Copy, Debug, Clone, PartialEq, Eq)] -pub enum ExitStatus { +enum ExitStatus { Success, Error, } - -/// Main entry point for the `kcl-language-server` executable. -fn main() -> Result<(), anyhow::Error> { - let args: Vec = std::env::args().collect(); - let matches = app().arg_required_else_help(true).get_matches_from(args); - match matches.subcommand() { - Some(("version", _)) => { - println!("{}", kclvm_version::get_version_info()); - Ok(()) - } - _ => { - let status: Result = { - run_server().map_err(|e| anyhow::anyhow!("{}", e))?; - Ok(ExitStatus::Success) - }; - match status.unwrap() { - ExitStatus::Success => {} - ExitStatus::Error => std::process::exit(1), - }; - Ok(()) - } - } -} - -/// Get the kcl language server CLI application. -pub fn app() -> Command { - Command::new("kcl-language-server") - .version(kclvm_version::VERSION) - .about("KCL language server CLI.") - .subcommand(Command::new("version").about("Show the KCL language server version")) -} diff --git a/kclvm/tools/src/LSP/src/main_loop.rs b/kclvm/tools/src/LSP/src/main_loop.rs index 3d2f9f4b3..4e2efddcb 100644 --- a/kclvm/tools/src/LSP/src/main_loop.rs +++ b/kclvm/tools/src/LSP/src/main_loop.rs @@ -1,8 +1,19 @@ use crate::config::Config; use crate::state::LanguageServerState; +use clap::Command; use lsp_server::Connection; +#[allow(dead_code)] /// Runs the main loop of the language server. This will receive requests and handle them. pub(crate) fn main_loop(connection: Connection, config: Config) -> anyhow::Result<()> { LanguageServerState::new(connection.sender, config).run(connection.receiver) } + +#[allow(dead_code)] +/// Get the kcl language server CLI application. +pub(crate) fn app() -> Command { + Command::new("kcl-language-server") + .version(kclvm_version::VERSION) + .about("KCL language server CLI.") + .subcommand(Command::new("version").about("Show the KCL language server version")) +} diff --git a/kclvm/tools/src/LSP/src/tests.rs b/kclvm/tools/src/LSP/src/tests.rs index 04afac3bb..c4646996a 100644 --- a/kclvm/tools/src/LSP/src/tests.rs +++ b/kclvm/tools/src/LSP/src/tests.rs @@ -1205,3 +1205,48 @@ fn konfig_hover_test_main() { _ => unreachable!("test error"), } } + +#[test] +fn lsp_version_test() { + let args = vec!["kcl-language-server".to_string(), "version".to_string()]; + let matches = crate::main_loop::app() + .arg_required_else_help(false) + .try_get_matches_from(args); + match matches { + Ok(arg_match) => match arg_match.subcommand() { + Some(("version", _)) => {} + _ => panic!("test failed"), + }, + Err(_) => panic!("test failed"), + } +} + +#[test] +fn lsp_run_test() { + let args = vec!["kcl-language-server".to_string()]; + let matches = crate::main_loop::app() + .arg_required_else_help(false) + .try_get_matches_from(args); + match matches { + Ok(arg_match) => match arg_match.subcommand() { + None => {} + _ => panic!("test failed"), + }, + Err(_) => panic!("test failed"), + } +} + +#[test] +fn lsp_invalid_subcommand_test() { + let args = vec!["kcl-language-server".to_string(), "invalid".to_string()]; + let matches = crate::main_loop::app() + .arg_required_else_help(false) + .try_get_matches_from(args); + match matches { + Ok(_) => panic!("test failed"), + Err(e) => match e.kind() { + clap::error::ErrorKind::InvalidSubcommand => {} + _ => panic!("test failed"), + }, + } +} diff --git a/kclvm/tools/src/LSP/src/util.rs b/kclvm/tools/src/LSP/src/util.rs index 425accb70..549f8f595 100644 --- a/kclvm/tools/src/LSP/src/util.rs +++ b/kclvm/tools/src/LSP/src/util.rs @@ -13,8 +13,8 @@ use kclvm_error::Position as KCLPos; use kclvm_parser::entry::get_dir_files; use kclvm_parser::{load_program, ParseSession}; use kclvm_sema::resolver::resolve_program_with_opts; +use kclvm_sema::resolver::scope::ProgramScope; use kclvm_sema::resolver::scope::Scope; -use kclvm_sema::resolver::{resolve_program, scope::ProgramScope}; use kclvm_utils::pkgpath::rm_external_pkg_name; use lsp_types::Url; use parking_lot::{RwLock, RwLockReadGuard};