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
38pub 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}