1use jsona_util::environment::Environment;
2use lsp_async_stub::Server;
3use lsp_types::{notification, request};
4use std::sync::Arc;
5use world::{World, WorldState};
6
7mod diagnostics;
8mod handlers;
9
10pub mod config;
11pub mod lsp_ext;
12pub mod query;
13pub mod world;
14
15pub const NAME: &str = "JSONA Language Server";
16
17#[must_use]
18pub fn create_server<E: Environment>() -> Server<World<E>> {
19 Server::new()
20 .on_request::<request::Initialize, _>(handlers::initialize)
21 .on_request::<request::FoldingRangeRequest, _>(handlers::folding_ranges)
22 .on_request::<request::SelectionRangeRequest, _>(handlers::selection_ranges)
23 .on_request::<request::DocumentSymbolRequest, _>(handlers::document_symbols)
24 .on_request::<request::Completion, _>(handlers::completion)
25 .on_request::<request::HoverRequest, _>(handlers::hover)
26 .on_request::<request::Formatting, _>(handlers::format)
27 .on_notification::<notification::Initialized, _>(handlers::initialized)
28 .on_notification::<notification::DidOpenTextDocument, _>(handlers::document_open)
29 .on_notification::<notification::DidChangeTextDocument, _>(handlers::document_change)
30 .on_notification::<notification::DidSaveTextDocument, _>(handlers::document_save)
31 .on_notification::<notification::DidCloseTextDocument, _>(handlers::document_close)
32 .on_notification::<notification::DidChangeConfiguration, _>(handlers::configuration_change)
33 .on_notification::<notification::DidChangeWorkspaceFolders, _>(handlers::workspace_change)
34 .on_request::<lsp_ext::request::ListSchemasRequest, _>(handlers::list_schemas)
35 .on_request::<lsp_ext::request::AssociatedSchemaRequest, _>(handlers::associated_schema)
36 .build()
37}
38
39pub fn create_world<E: Environment>(env: E) -> World<E> {
40 Arc::new(WorldState::new(env))
41}