pub mod code_action;
pub mod code_lens;
pub mod completion;
pub mod definition;
pub mod diagnostics;
pub mod hover;
pub mod references;
pub mod rename;
pub mod semantic_tokens;
pub mod type_service;
pub mod workspace_symbols;
pub use code_action::CodeActionService;
pub use code_lens::CodeLensService;
pub use completion::{trigger_characters, CompletionService, TRIGGER_CHARACTERS};
pub use definition::{BindingKind, BindingLocation, DefinitionService};
pub use diagnostics::{sources, DiagnosticBuilder, DiagnosticService, Severity};
pub use hover::{HoverBuilder, HoverService};
pub use references::ReferencesService;
pub use rename::RenameService;
pub use semantic_tokens::{SemanticTokensService, TokenModifier, TokenType};
pub use type_service::TypeService;
pub use workspace_symbols::WorkspaceSymbolsService;
use tower_lsp::lsp_types::Url;
use crate::server::ServerState;
use crate::virtual_code::{find_block_at_offset, BlockType, VirtualDocuments};
pub struct IdeContext<'a> {
pub state: &'a ServerState,
pub uri: &'a Url,
pub content: String,
pub offset: usize,
pub block_type: Option<BlockType>,
pub virtual_docs: Option<dashmap::mapref::one::Ref<'a, Url, VirtualDocuments>>,
}
impl<'a> IdeContext<'a> {
pub fn new(state: &'a ServerState, uri: &'a Url, offset: usize) -> Option<Self> {
let doc = state.documents.get(uri)?;
let content = doc.text();
let options = vize_atelier_sfc::SfcParseOptions {
filename: uri.path().to_string(),
..Default::default()
};
let block_type = if let Ok(descriptor) = vize_atelier_sfc::parse_sfc(&content, options) {
find_block_at_offset(&descriptor, offset)
} else {
None
};
let virtual_docs = state.get_virtual_docs(uri);
Some(Self {
state,
uri,
content,
offset,
block_type,
virtual_docs,
})
}
#[inline]
pub fn is_in_template(&self) -> bool {
matches!(self.block_type, Some(BlockType::Template))
}
#[inline]
pub fn is_in_script(&self) -> bool {
matches!(
self.block_type,
Some(BlockType::Script) | Some(BlockType::ScriptSetup)
)
}
#[inline]
pub fn is_in_style(&self) -> bool {
matches!(self.block_type, Some(BlockType::Style(_)))
}
}