11 个版本

0.3.0 2024年4月24日
0.2.8 2024年1月4日
0.2.7 2023年10月10日
0.2.6 2023年9月29日
0.1.0 2023年9月7日

#131文本编辑器

Download history 518/week @ 2024-04-15 550/week @ 2024-04-22 345/week @ 2024-04-29 163/week @ 2024-05-06 127/week @ 2024-05-13 146/week @ 2024-05-20 85/week @ 2024-05-27 47/week @ 2024-06-03 257/week @ 2024-06-10 168/week @ 2024-06-17 73/week @ 2024-06-24 263/week @ 2024-07-01 66/week @ 2024-07-08 40/week @ 2024-07-15 146/week @ 2024-07-22 56/week @ 2024-07-29

每月下载量 382
用于 3 个crate(通过els

MIT/Apache

38KB
869

molc

molc 提供了一个用于测试语言服务器的模拟(虚构)语言客户端。

使用方法

您可以在 ELS 中看到 molc 的具体使用示例。

use lsp_types::{Url, Value};

use molc::{FakeClient, LangServer, RedirectableStdout};
use molc::oneline_range;

pub struct Server {
    stdout_redirect: Option<std::sync::mpsc::Sender<Value>>,
    ...
}

impl LangServer for Server {
    fn dispatch(&mut self, msg: impl Into<Value>) -> Result<(), Box<dyn std::error::Error>> {
        self.dispatch(msg)
    }
}

impl RedirectableStdout for Server {
    fn sender(&self) -> Option<&std::sync::mpsc::Sender<Value>> {
        self.stdout_redirect.as_ref()
    }
}

impl Server {
    fn bind_fake_client() -> FakeClient<Self> {
        // The server should send responses to this channel at least during testing.
        let (sender, receiver) = std::sync::mpsc::channel();
        DummyClient::new(
            Server::new(Some(sender)),
            receiver,
        )
    }

    fn init(&mut self, msg: &Value, id: i64) -> ELSResult<()> {
        self.send_log("initializing the language server")?;
        let result = InitializeResult {
            ...
        };
        self.init_services();
        self.send_stdout(&json!({
            "jsonrpc": "2.0",
            "id": id,
            "result": result,
        }))
    }

    ...
}

#[test]
fn test_references() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = Server::bind_fake_client();
    client.request_initialize()?;
    let uri = Url::from_file_path(Path::new(FILE_A).canonicalize()?).unwrap();
    client.notify_open(FILE_A)?;
    let locations = client.request_references(uri, 1, 4)?.unwrap();
    assert_eq!(locations.len(), 1);
    assert_eq!(&locations[0].range, &oneline_range(1, 4, 5));
    Ok(())
}

依赖项

~2.1–3.5MB
~90K SLoC