use std::cell::RefCell;
use lsp_types::{FoldingRange, FoldingRangeKind, Url};
use crate::server::{common::ServerLanguageError, ServerLanguage};
impl ServerLanguage {
pub fn recolt_folding_range(
&mut self,
uri: &Url,
) -> Result<Vec<FoldingRange>, ServerLanguageError> {
let cached_file = self.get_cachable_file(&uri)?;
let mut folding_ranges: Vec<FoldingRange> = cached_file
.data
.as_ref()
.unwrap()
.symbol_cache
.get_preprocessor()
.regions
.iter()
.map(|region| FoldingRange {
start_line: region.range.start.line,
start_character: Some(region.range.start.pos),
end_line: region.range.end.line,
end_character: Some(region.range.end.pos),
kind: Some(FoldingRangeKind::Region),
collapsed_text: None,
})
.collect();
let symbol_provider = &self
.language_data
.get(&cached_file.shading_language)
.unwrap()
.symbol_provider;
let scopes =
symbol_provider.query_file_scopes(&RefCell::borrow(&cached_file.shader_module));
let mut folded_scopes: Vec<FoldingRange> = scopes
.iter()
.map(|s| FoldingRange {
start_line: s.start.line,
start_character: Some(s.start.pos),
end_line: s.end.line,
end_character: Some(s.end.pos),
kind: Some(FoldingRangeKind::Region),
collapsed_text: None,
})
.collect();
folding_ranges.append(&mut folded_scopes);
Ok(folding_ranges)
}
}