Skip to content

Commit ea2f208

Browse files
committed
add custom request gutter for intellij
1 parent da9007f commit ea2f208

File tree

4 files changed

+130
-0
lines changed

4 files changed

+130
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
use lsp_types::{Range, request::Request};
2+
use serde::{Deserialize, Serialize};
3+
4+
#[derive(Debug)]
5+
pub enum EmmyGutterRequest {}
6+
7+
impl Request for EmmyGutterRequest {
8+
type Params = EmmyGutterParams;
9+
type Result = Option<Vec<GutterInfo>>;
10+
const METHOD: &'static str = "emmy/gutter";
11+
}
12+
13+
#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
14+
pub struct EmmyGutterParams {
15+
pub uri: String,
16+
}
17+
18+
// /**
19+
// * Gutter information returned from LSP
20+
// */
21+
// data class GutterInfo(
22+
// val range: Range,
23+
// val kind: GutterKind,
24+
// val detail: String?
25+
// )
26+
27+
#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
28+
pub struct GutterInfo {
29+
pub range: Range,
30+
pub kind: GutterKind,
31+
pub detail: Option<String>,
32+
}
33+
34+
#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
35+
#[serde(into = "u8", try_from = "u8")]
36+
pub enum GutterKind {
37+
Class = 0,
38+
Enum = 1,
39+
Alias = 2,
40+
Method = 3,
41+
Module = 4,
42+
}
43+
44+
impl From<GutterKind> for u8 {
45+
fn from(kind: GutterKind) -> Self {
46+
kind as u8
47+
}
48+
}
49+
50+
impl From<u8> for GutterKind {
51+
fn from(value: u8) -> Self {
52+
match value {
53+
0 => GutterKind::Class,
54+
1 => GutterKind::Enum,
55+
2 => GutterKind::Alias,
56+
3 => GutterKind::Method,
57+
4 => GutterKind::Module,
58+
_ => GutterKind::Class, // default case
59+
}
60+
}
61+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
mod emmy_gutter_request;
2+
3+
use std::str::FromStr;
4+
5+
use crate::{
6+
context::ServerContextSnapshot,
7+
handlers::emmy_gutter::emmy_gutter_request::{EmmyGutterParams, GutterInfo},
8+
};
9+
pub use emmy_gutter_request::*;
10+
use emmylua_code_analysis::SemanticModel;
11+
use emmylua_parser::{LuaAstNode, LuaDocTag};
12+
use lsp_types::Uri;
13+
use tokio_util::sync::CancellationToken;
14+
15+
pub async fn on_emmy_gutter_handler(
16+
context: ServerContextSnapshot,
17+
params: EmmyGutterParams,
18+
_: CancellationToken,
19+
) -> Option<Vec<GutterInfo>> {
20+
let uri = Uri::from_str(&params.uri).ok()?;
21+
let analysis = context.analysis().read().await;
22+
let file_id = analysis.get_file_id(&uri)?;
23+
let semantic_model = analysis.compilation.get_semantic_model(file_id)?;
24+
25+
build_gutter_infos(&semantic_model)
26+
}
27+
28+
fn build_gutter_infos(semantic_model: &SemanticModel) -> Option<Vec<GutterInfo>> {
29+
let root = semantic_model.get_root().clone();
30+
let document = semantic_model.get_document();
31+
let mut gutters = Vec::new();
32+
for tag in root.descendants::<LuaDocTag>() {
33+
match tag {
34+
LuaDocTag::Alias(alias) => {
35+
let range = alias.get_range();
36+
let lsp_range = document.to_lsp_range(range)?;
37+
gutters.push(GutterInfo {
38+
range: lsp_range,
39+
kind: GutterKind::Alias,
40+
detail: Some("type alias".to_string()),
41+
});
42+
}
43+
LuaDocTag::Class(class) => {
44+
let range = class.get_range();
45+
let lsp_range = document.to_lsp_range(range)?;
46+
gutters.push(GutterInfo {
47+
range: lsp_range,
48+
kind: GutterKind::Class,
49+
detail: Some("class".to_string()),
50+
});
51+
}
52+
LuaDocTag::Enum(enm) => {
53+
let range = enm.get_range();
54+
let lsp_range = document.to_lsp_range(range)?;
55+
gutters.push(GutterInfo {
56+
range: lsp_range,
57+
kind: GutterKind::Enum,
58+
detail: Some("enum".to_string()),
59+
});
60+
}
61+
_ => {}
62+
}
63+
}
64+
65+
Some(gutters)
66+
}

crates/emmylua_ls/src/handlers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ mod document_selection_range;
1515
mod document_symbol;
1616
mod document_type_format;
1717
mod emmy_annotator;
18+
mod emmy_gutter;
1819
mod fold_range;
1920
mod hover;
2021
mod implementation;

crates/emmylua_ls/src/handlers/request_handler.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::{
1919
handlers::{
2020
diagnostic::{on_pull_document_diagnostic, on_pull_workspace_diagnostic},
2121
document_type_format::on_type_formatting_handler,
22+
emmy_gutter::{EmmyGutterRequest, on_emmy_gutter_handler},
2223
},
2324
};
2425

@@ -94,6 +95,7 @@ pub async fn on_request_handler(
9495
DocumentLinkRequest => on_document_link_handler,
9596
DocumentLinkResolve => on_document_link_resolve_handler,
9697
EmmyAnnotatorRequest => on_emmy_annotator_handler,
98+
EmmyGutterRequest => on_emmy_gutter_handler,
9799
SelectionRangeRequest => on_document_selection_range_handle,
98100
Completion => on_completion_handler,
99101
ResolveCompletionItem => on_completion_resolve_handler,

0 commit comments

Comments
 (0)