use crate::{
ContentHash,
Ident,
SourceKey,
database::{
DynPartition,
PartitionKey,
},
protocol::lsp::Position,
};
pub struct TextDocumentPosition;
impl PartitionKey for TextDocumentPosition {
const KEY: Ident = Ident::new("laburnum::text_document_position_index");
}
impl DynPartition for TextDocumentPosition {
type DynSortKey = TextDocumentPositionSortKey;
type RecordConstraint = dyn TextDocumentPositionRecord;
}
impl<R: TextDocumentPositionRecord + crate::record::Record>
crate::database::DynPartitionRecord<TextDocumentPosition> for R
{
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u8)]
pub enum PositionKind {
Unknown = 0,
Ident = 1,
Symbol = 2,
Reference = 3,
}
#[derive(Debug, Clone)]
pub enum TextDocumentPositionSortKey {
Position {
source_key: SourceKey,
line: u32,
character: u32,
kind: PositionKind,
},
All,
FilePrefix {
source_key: SourceKey,
},
}
impl std::fmt::Display for TextDocumentPositionSortKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
| TextDocumentPositionSortKey::Position {
source_key,
line,
character,
kind,
} => {
write!(
f,
"{}|{:010}|{:010}|{}",
source_key, line, character, *kind as u8
)
},
| TextDocumentPositionSortKey::All => Ok(()),
| TextDocumentPositionSortKey::FilePrefix { source_key } => {
write!(f, "{}", source_key)
},
}
}
}
pub trait TextDocumentPositionRecord: Send + Sync + std::fmt::Debug {
fn source_key(&self) -> SourceKey;
fn position(&self) -> Position;
fn kind(&self) -> PositionKind;
fn symbol_hash(&self) -> ContentHash;
fn symbol_ident(&self) -> Ident;
}