mod generator;
mod script_code;
mod source_map;
mod style_code;
mod template_code;
pub use generator::*;
pub use script_code::*;
pub use source_map::*;
pub use style_code::*;
pub use template_code::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum VirtualLanguage {
Template,
Script,
ScriptSetup,
Style,
}
impl VirtualLanguage {
pub fn extension(&self) -> &'static str {
match self {
VirtualLanguage::Template => "ts",
VirtualLanguage::Script => "ts",
VirtualLanguage::ScriptSetup => "ts",
VirtualLanguage::Style => "css",
}
}
pub fn language_id(&self) -> &'static str {
match self {
VirtualLanguage::Template => "typescript",
VirtualLanguage::Script => "typescript",
VirtualLanguage::ScriptSetup => "typescript",
VirtualLanguage::Style => "css",
}
}
}
#[derive(Debug, Clone)]
pub struct VirtualDocument {
pub uri: String,
pub content: String,
pub language: VirtualLanguage,
pub source_map: SourceMap,
}
impl VirtualDocument {
pub fn new(uri: String, content: String, language: VirtualLanguage) -> Self {
Self {
uri,
content,
language,
source_map: SourceMap::new(),
}
}
pub fn with_mappings(
uri: String,
content: String,
language: VirtualLanguage,
mappings: Vec<SourceMapping>,
) -> Self {
Self {
uri,
content,
language,
source_map: SourceMap::from_mappings(mappings),
}
}
}
#[derive(Debug, Default)]
pub struct VirtualDocuments {
pub template: Option<VirtualDocument>,
pub script: Option<VirtualDocument>,
pub script_setup: Option<VirtualDocument>,
pub styles: Vec<VirtualDocument>,
}
impl VirtualDocuments {
pub fn new() -> Self {
Self::default()
}
pub fn all(&self) -> Vec<&VirtualDocument> {
let mut docs = Vec::new();
if let Some(ref t) = self.template {
docs.push(t);
}
if let Some(ref s) = self.script {
docs.push(s);
}
if let Some(ref ss) = self.script_setup {
docs.push(ss);
}
for style in &self.styles {
docs.push(style);
}
docs
}
pub fn find_by_source_offset(&self, offset: u32) -> Option<(&VirtualDocument, u32)> {
for doc in self.all() {
if let Some(gen_offset) = doc.source_map.to_generated(offset) {
return Some((doc, gen_offset));
}
}
None
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct SourceRange {
pub start: u32,
pub end: u32,
}
impl SourceRange {
pub fn new(start: u32, end: u32) -> Self {
Self { start, end }
}
pub fn contains(&self, offset: u32) -> bool {
offset >= self.start && offset < self.end
}
pub fn len(&self) -> u32 {
self.end - self.start
}
pub fn is_empty(&self) -> bool {
self.start >= self.end
}
}
impl From<vize_relief::SourceLocation> for SourceRange {
fn from(loc: vize_relief::SourceLocation) -> Self {
Self {
start: loc.start.offset,
end: loc.end.offset,
}
}
}
impl From<&vize_relief::SourceLocation> for SourceRange {
fn from(loc: &vize_relief::SourceLocation) -> Self {
Self {
start: loc.start.offset,
end: loc.end.offset,
}
}
}