use crate::ast::DecompileDialect;
use crate::hir::{HirModule, HirProtoRef, ProtoLineRange, ProtoSignature};
use strum_macros::{Display, EnumString, IntoStaticStr};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GeneratedChunk {
pub dialect: DecompileDialect,
pub source: String,
pub warnings: Vec<String>,
}
impl Default for GeneratedChunk {
fn default() -> Self {
Self {
dialect: DecompileDialect::Lua51,
source: String::new(),
warnings: Vec::new(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct GenerateOptions {
pub mode: GenerateMode,
pub indent_width: usize,
pub max_line_length: usize,
pub quote_style: QuoteStyle,
pub table_style: TableStyle,
pub conservative_output: bool,
pub comment: bool,
}
impl Default for GenerateOptions {
fn default() -> Self {
Self {
mode: GenerateMode::Strict,
indent_width: 4,
max_line_length: 100,
quote_style: QuoteStyle::MinEscape,
table_style: TableStyle::Balanced,
conservative_output: true,
comment: true,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GenerateCommentMetadata {
pub chunk: GenerateChunkCommentMetadata,
pub functions: Vec<GenerateFunctionCommentMetadata>,
}
impl GenerateCommentMetadata {
pub(crate) fn from_hir(hir: &HirModule, encoding: &str) -> Self {
let entry_source = hir
.protos
.get(hir.entry.index())
.and_then(|proto| proto.source.clone());
Self {
chunk: GenerateChunkCommentMetadata {
file_name: entry_source,
encoding: encoding.to_owned(),
},
functions: hir
.protos
.iter()
.map(|proto| GenerateFunctionCommentMetadata {
function: proto.id,
source: proto.source.clone(),
line_range: proto.line_range,
signature: proto.signature,
local_count: proto.locals.len(),
upvalue_count: proto.upvalues.len(),
})
.collect(),
}
}
pub fn function(&self, function: HirProtoRef) -> Option<&GenerateFunctionCommentMetadata> {
self.functions.get(function.index())
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GenerateChunkCommentMetadata {
pub file_name: Option<String>,
pub encoding: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GenerateFunctionCommentMetadata {
pub function: HirProtoRef,
pub source: Option<String>,
pub line_range: ProtoLineRange,
pub signature: ProtoSignature,
pub local_count: usize,
pub upvalue_count: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Display, EnumString, IntoStaticStr)]
#[strum(serialize_all = "kebab-case")]
pub enum GenerateMode {
#[default]
Strict,
Permissive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Display, EnumString, IntoStaticStr)]
#[strum(serialize_all = "kebab-case")]
pub enum QuoteStyle {
PreferDouble,
PreferSingle,
#[default]
MinEscape,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Display, EnumString, IntoStaticStr)]
#[strum(serialize_all = "kebab-case")]
pub enum TableStyle {
Compact,
#[default]
Balanced,
Expanded,
}