Conditionally compile JS feature code

This commit is contained in:
Wilson Lin 2020-07-21 17:59:56 +10:00
parent b967e338ca
commit 6f3e1254de
2 changed files with 31 additions and 17 deletions

View File

@ -8,8 +8,11 @@ use crate::proc::MatchMode::*;
use crate::proc::range::ProcessorRange;
use memchr::memchr;
use crate::gen::codepoints::{WHITESPACE, Lookup};
#[cfg(feature = "js-esbuild")]
use std::sync::{Arc, Mutex};
#[cfg(feature = "js-esbuild")]
use esbuild_rs::TransformResult;
#[cfg(feature = "js-esbuild")]
use crossbeam::sync::WaitGroup;
pub mod checkpoint;
@ -42,6 +45,7 @@ pub enum MatchAction {
MatchOnly,
}
#[cfg(feature = "js-esbuild")]
pub struct JsMinSection {
pub src_range: ProcessorRange,
pub result: TransformResult,
@ -304,28 +308,32 @@ impl<'d> Processor<'d> {
self._shift(count);
}
#[cfg(feature = "js-esbuild")]
pub fn new_script_section(&self) -> (WaitGroup, Arc<Mutex<Vec<JsMinSection>>>) {
(self.script_wg.clone(), self.script_results.clone())
}
pub fn finish(self) -> usize {
debug_assert!(self.at_end());
self.script_wg.wait();
let mut results = Arc::try_unwrap(self.script_results)
.unwrap_or_else(|_| panic!("failed to acquire script results"))
.into_inner()
.unwrap();
if !results.is_empty() {
results.sort_unstable_by_key(|r| r.src_range.start);
let mut write_start = results[0].src_range.start;
for (i, res) in results.iter().enumerate() {
let min_code = res.result.js.trim();
if min_code.len() < res.src_range.len() {
let write_end = write_start + min_code.len();
self.code[write_start..write_end].copy_from_slice(min_code.as_bytes());
let next_start = results.get(i + 1).map_or(self.write_next, |r| r.src_range.start);
self.code.copy_within(res.src_range.end..next_start, write_end);
write_start = write_end + (next_start - res.src_range.end);
#[cfg(feature = "js-esbuild")]
{
self.script_wg.wait();
let mut results = Arc::try_unwrap(self.script_results)
.unwrap_or_else(|_| panic!("failed to acquire script results"))
.into_inner()
.unwrap();
if !results.is_empty() {
results.sort_unstable_by_key(|r| r.src_range.start);
let mut write_start = results[0].src_range.start;
for (i, res) in results.iter().enumerate() {
let min_code = res.result.js.trim();
if min_code.len() < res.src_range.len() {
let write_end = write_start + min_code.len();
self.code[write_start..write_end].copy_from_slice(min_code.as_bytes());
let next_start = results.get(i + 1).map_or(self.write_next, |r| r.src_range.start);
self.code.copy_within(res.src_range.end..next_start, write_end);
write_start = write_end + (next_start - res.src_range.end);
};
};
};
};

View File

@ -1,14 +1,20 @@
use crate::err::ProcessingResult;
use crate::proc::MatchAction::*;
use crate::proc::MatchMode::*;
use crate::proc::{Processor, JsMinSection};
use crate::proc::Processor;
#[cfg(feature = "js-esbuild")]
use crate::proc::JsMinSection;
use crate::cfg::Cfg;
#[cfg(feature = "js-esbuild")]
use crate::proc::checkpoint::Checkpoint;
#[cfg(feature = "js-esbuild")]
use esbuild_rs::{TransformOptionsBuilder, TransformOptions};
#[cfg(feature = "js-esbuild")]
use std::sync::Arc;
#[cfg(feature = "js-esbuild")]
use lazy_static::lazy_static;
#[cfg(feature = "js-esbuild")]
lazy_static! {
static ref TRANSFORM_OPTIONS: Arc<TransformOptions> = {
let mut builder = TransformOptionsBuilder::new();