use crate::jsonrpc::Result;
use lsp_types_max::{
SemanticTokens, SemanticTokensDeltaParams, SemanticTokensEdit, SemanticTokensFullDeltaResult,
};
pub async fn semantic_tokens_full_delta(
params: SemanticTokensDeltaParams,
) -> Result<Option<SemanticTokensFullDeltaResult>> {
let _uri = ¶ms.text_document.uri;
let _previous_result_id = ¶ms.previous_result_id;
let empty = SemanticTokens {
result_id: None,
data: vec![],
};
let edits = compute_semantic_tokens_edits(&empty, &empty);
if edits.is_empty() {
Ok(Some(SemanticTokensFullDeltaResult::Tokens(
SemanticTokens {
result_id: None,
data: vec![],
},
)))
} else {
Ok(Some(SemanticTokensFullDeltaResult::TokensDelta(
lsp_types_max::SemanticTokensDelta {
result_id: None,
edits,
},
)))
}
}
pub fn compute_semantic_tokens_edits(
previous: &SemanticTokens,
current: &SemanticTokens,
) -> Vec<SemanticTokensEdit> {
let prev_data = &previous.data;
let curr_data = ¤t.data;
let mut i = 0;
let prev_len = prev_data.len();
let curr_len = curr_data.len();
let min_len = std::cmp::min(prev_len, curr_len);
while i < min_len && prev_data[i] == curr_data[i] {
i += 1;
}
if i == prev_len && prev_len == curr_len {
return Vec::new();
}
let mut j = 0;
while j < (min_len - i) && prev_data[prev_len - 1 - j] == curr_data[curr_len - 1 - j] {
j += 1;
}
vec![SemanticTokensEdit {
start: i as u32,
delete_count: (prev_len - i - j) as u32,
data: Some(curr_data[i..(curr_len - j)].to_vec()),
}]
}