use crate::compiler::{CompilationResult, CompilationStage};
use typescript_ir::{Program, TypedProgram, optimize_full};
use typescript_types::TsError;
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub enum OptimizationLevel {
None,
Basic,
Medium,
High,
}
#[derive(Debug, Clone)]
pub struct Optimizer {
current_stage: CompilationStage,
optimization_level: OptimizationLevel,
}
impl Optimizer {
pub fn new() -> Self {
Self { current_stage: CompilationStage::Optimization, optimization_level: OptimizationLevel::High }
}
pub fn with_level(level: OptimizationLevel) -> Self {
Self { current_stage: CompilationStage::Optimization, optimization_level: level }
}
pub fn optimize(&mut self, ir: &Program) -> CompilationResult<Program> {
self.current_stage = CompilationStage::Optimization;
let optimized_ir = optimize_full(ir);
CompilationResult::Success(optimized_ir)
}
pub fn current_stage(&self) -> CompilationStage {
self.current_stage
}
pub fn optimization_level(&self) -> OptimizationLevel {
self.optimization_level
}
pub fn set_optimization_level(&mut self, level: OptimizationLevel) {
self.optimization_level = level;
}
pub fn reset(&mut self) {
self.current_stage = CompilationStage::Optimization;
self.optimization_level = OptimizationLevel::High;
}
}
impl Default for Optimizer {
fn default() -> Self {
Self::new()
}
}