Skip to content

Commit 99441ce

Browse files
committed
progress
1 parent 4ab0f01 commit 99441ce

1 file changed

Lines changed: 23 additions & 26 deletions

File tree

crates/pgls_lsp/src/handlers/semantic_tokens.rs

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,61 @@
11
use crate::{adapters, diagnostics::LspError, session::Session};
2+
use pgls_text_size::TextRange;
23
use pgls_workspace::features::semantic_tokens::SemanticTokensParams;
34
use tower_lsp::lsp_types::{self, SemanticToken, SemanticTokens, SemanticTokensRangeResult};
45

56
/// Handles a full semantic tokens request.
6-
/// Returns all semantic tokens for the entire document.
77
#[tracing::instrument(level = "debug", skip(session), err)]
88
pub fn semantic_tokens_full(
99
session: &Session,
1010
params: lsp_types::SemanticTokensParams,
1111
) -> Result<Option<lsp_types::SemanticTokensResult>, LspError> {
1212
let url = &params.text_document.uri;
13-
let path = session.file_path(url)?;
14-
let doc = session.document(url)?;
15-
let encoding = adapters::negotiated_encoding(session.client_capabilities().unwrap());
16-
17-
let workspace_result = session
18-
.workspace
19-
.get_semantic_tokens(SemanticTokensParams { path, range: None })?;
20-
21-
let lsp_tokens = encode_tokens(&workspace_result.tokens, &doc.line_index, encoding)?;
22-
23-
Ok(Some(lsp_types::SemanticTokensResult::Tokens(
24-
SemanticTokens {
25-
result_id: None,
26-
data: lsp_tokens,
27-
},
28-
)))
13+
let tokens = get_semantic_tokens(session, url, None)?;
14+
Ok(Some(lsp_types::SemanticTokensResult::Tokens(tokens)))
2915
}
3016

3117
/// Handles a range semantic tokens request.
32-
/// Returns semantic tokens for the specified range only.
3318
#[tracing::instrument(level = "debug", skip(session), err)]
3419
pub fn semantic_tokens_range(
3520
session: &Session,
3621
params: lsp_types::SemanticTokensRangeParams,
3722
) -> Result<Option<SemanticTokensRangeResult>, LspError> {
3823
let url = &params.text_document.uri;
24+
let tokens = get_semantic_tokens(session, url, Some(params.range))?;
25+
Ok(Some(SemanticTokensRangeResult::Tokens(tokens)))
26+
}
27+
28+
/// Common implementation for semantic tokens requests.
29+
fn get_semantic_tokens(
30+
session: &Session,
31+
url: &lsp_types::Url,
32+
range: Option<lsp_types::Range>,
33+
) -> Result<SemanticTokens, LspError> {
3934
let path = session.file_path(url)?;
4035
let doc = session.document(url)?;
4136
let encoding = adapters::negotiated_encoding(session.client_capabilities().unwrap());
4237

43-
// Convert LSP range to TextRange
44-
let start_offset =
45-
adapters::from_lsp::offset(&doc.line_index, params.range.start, encoding)?;
46-
let end_offset = adapters::from_lsp::offset(&doc.line_index, params.range.end, encoding)?;
47-
let range = pgls_text_size::TextRange::new(start_offset, end_offset);
38+
let text_range = range
39+
.map(|r| -> Result<TextRange, LspError> {
40+
let start = adapters::from_lsp::offset(&doc.line_index, r.start, encoding)?;
41+
let end = adapters::from_lsp::offset(&doc.line_index, r.end, encoding)?;
42+
Ok(TextRange::new(start, end))
43+
})
44+
.transpose()?;
4845

4946
let workspace_result = session
5047
.workspace
5148
.get_semantic_tokens(SemanticTokensParams {
5249
path,
53-
range: Some(range),
50+
range: text_range,
5451
})?;
5552

5653
let lsp_tokens = encode_tokens(&workspace_result.tokens, &doc.line_index, encoding)?;
5754

58-
Ok(Some(SemanticTokensRangeResult::Tokens(SemanticTokens {
55+
Ok(SemanticTokens {
5956
result_id: None,
6057
data: lsp_tokens,
61-
})))
58+
})
6259
}
6360

6461
/// Encodes workspace semantic tokens into the LSP delta-encoded format.

0 commit comments

Comments
 (0)