sway_lsp/
lib.rs

1#![recursion_limit = "256"]
2
3pub mod capabilities;
4pub mod config;
5pub mod core;
6pub mod error;
7pub mod server_state;
8pub mod handlers {
9    pub mod notification;
10    pub mod request;
11}
12pub mod lsp_ext;
13pub mod server;
14mod traverse;
15pub mod utils;
16
17use lsp_types::{
18    CodeActionProviderCapability, CodeLensOptions, CompletionOptions, ExecuteCommandOptions,
19    HoverProviderCapability, OneOf, RenameOptions, SemanticTokensLegend, SemanticTokensOptions,
20    ServerCapabilities, TextDocumentSyncCapability, TextDocumentSyncKind, WorkDoneProgressOptions,
21    WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities,
22};
23use server_state::ServerState;
24use tower_lsp::{LspService, Server};
25
26pub async fn start() {
27    let (service, socket) = LspService::build(ServerState::new)
28        .custom_method("sway/show_ast", ServerState::show_ast)
29        .custom_method("sway/visualize", ServerState::visualize)
30        .custom_method("sway/on_enter", ServerState::on_enter)
31        .custom_method("sway/metrics", ServerState::metrics)
32        .finish();
33    Server::new(tokio::io::stdin(), tokio::io::stdout(), socket)
34        .serve(service)
35        .await;
36}
37
38/// Returns the capabilities of the server to the client,
39/// indicating its support for various language server protocol features.
40pub fn server_capabilities() -> ServerCapabilities {
41    ServerCapabilities {
42        code_action_provider: Some(CodeActionProviderCapability::Simple(true)),
43        code_lens_provider: Some(CodeLensOptions {
44            resolve_provider: Some(false),
45        }),
46        completion_provider: Some(CompletionOptions {
47            trigger_characters: Some(vec![".".to_string()]),
48            ..Default::default()
49        }),
50        definition_provider: Some(OneOf::Left(true)),
51        document_formatting_provider: Some(OneOf::Left(true)),
52        document_highlight_provider: Some(OneOf::Left(true)),
53        document_symbol_provider: Some(OneOf::Left(true)),
54        execute_command_provider: Some(ExecuteCommandOptions {
55            commands: vec![],
56            ..Default::default()
57        }),
58        hover_provider: Some(HoverProviderCapability::Simple(true)),
59        inlay_hint_provider: Some(OneOf::Left(true)),
60        rename_provider: Some(OneOf::Right(RenameOptions {
61            prepare_provider: Some(true),
62            work_done_progress_options: WorkDoneProgressOptions {
63                work_done_progress: Some(true),
64            },
65        })),
66        references_provider: Some(OneOf::Left(true)),
67        semantic_tokens_provider: Some(
68            SemanticTokensOptions {
69                legend: SemanticTokensLegend {
70                    token_types: capabilities::semantic_tokens::SUPPORTED_TYPES.to_vec(),
71                    token_modifiers: capabilities::semantic_tokens::SUPPORTED_MODIFIERS.to_vec(),
72                },
73                range: Some(true),
74                ..Default::default()
75            }
76            .into(),
77        ),
78        text_document_sync: Some(TextDocumentSyncCapability::Kind(
79            TextDocumentSyncKind::INCREMENTAL,
80        )),
81        workspace: Some(WorkspaceServerCapabilities {
82            workspace_folders: Some(WorkspaceFoldersServerCapabilities {
83                supported: Some(true),
84                change_notifications: Some(OneOf::Left(true)),
85            }),
86            ..Default::default()
87        }),
88        ..ServerCapabilities::default()
89    }
90}