Skip to content

Commit

Permalink
feat(es/codegen): Add ability to set indentation string via rust api (#…
Browse files Browse the repository at this point in the history
…7494)

**Description:**

This adds the ability to set the indentation string of JsWriter via the Rust API. The motivation behind this change is to allow people to use other indentations in the emit output like tabs or two spaces via the Rust API.
  • Loading branch information
dsherret committed Jun 7, 2023
1 parent 61dc611 commit a343e7c
Showing 1 changed file with 32 additions and 4 deletions.
36 changes: 32 additions & 4 deletions crates/swc_ecma_codegen/src/text_writer/basic_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ use super::{Result, WriteJs};
/// https://github.com/Microsoft/TypeScript/blob/45eaf42006/src/compiler/utilities.ts#L2548
pub struct JsWriter<'a, W: Write> {
indent: usize,
indent_str: &'static str,
line_start: bool,
line_count: usize,
line_pos: usize,
Expand All @@ -33,6 +34,7 @@ impl<'a, W: Write> JsWriter<'a, W> {
) -> Self {
JsWriter {
indent: Default::default(),
indent_str: " ",
line_start: true,
line_count: 0,
line_pos: Default::default(),
Expand All @@ -44,15 +46,18 @@ impl<'a, W: Write> JsWriter<'a, W> {
}
}

/// Sets the indentation string. Defaults to four spaces.
pub fn set_indent_str(&mut self, indent_str: &'static str) {
self.indent_str = indent_str;
}

#[inline]
fn write_indent_string(&mut self) -> Result {
const INDENT: &str = " ";

for _ in 0..self.indent {
self.raw_write(INDENT)?;
self.raw_write(self.indent_str)?;
}
if self.srcmap.is_some() {
self.line_pos += INDENT.len() * self.indent;
self.line_pos += self.indent_str.len() * self.indent;
}

Ok(())
Expand Down Expand Up @@ -324,3 +329,26 @@ fn compute_line_starts(s: &str) -> LineStart {
byte_pos: line_start,
}
}

#[cfg(test)]
mod test {
use std::sync::Arc;

use swc_common::SourceMap;

use super::JsWriter;
use crate::text_writer::WriteJs;

#[test]
fn changes_indent_str() {
let source_map = Arc::new(SourceMap::default());
let mut output = Vec::new();
let mut writer = JsWriter::new(source_map, "\n", &mut output, None);
writer.set_indent_str("\t");
writer.increase_indent().unwrap();
writer.write_indent_string().unwrap();
writer.increase_indent().unwrap();
writer.write_indent_string().unwrap();
assert_eq!(output, "\t\t\t".as_bytes());
}
}

1 comment on commit a343e7c

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: a343e7c Previous: abd62bc Ratio
es/full/bugs-1 307517 ns/iter (± 12010) 302238 ns/iter (± 8097) 1.02
es/full/minify/libraries/antd 1436499639 ns/iter (± 9945830) 1468405283 ns/iter (± 12541374) 0.98
es/full/minify/libraries/d3 300145105 ns/iter (± 2794739) 305526431 ns/iter (± 3829339) 0.98
es/full/minify/libraries/echarts 1167928228 ns/iter (± 4008794) 1199607844 ns/iter (± 11863609) 0.97
es/full/minify/libraries/jquery 93776952 ns/iter (± 178820) 96048543 ns/iter (± 258278) 0.98
es/full/minify/libraries/lodash 107358776 ns/iter (± 176389) 109188484 ns/iter (± 342571) 0.98
es/full/minify/libraries/moment 54633577 ns/iter (± 61719) 55919206 ns/iter (± 193527) 0.98
es/full/minify/libraries/react 19776216 ns/iter (± 42911) 20154134 ns/iter (± 47688) 0.98
es/full/minify/libraries/terser 241356670 ns/iter (± 602872) 248126924 ns/iter (± 1598990) 0.97
es/full/minify/libraries/three 414782355 ns/iter (± 1144075) 423145001 ns/iter (± 2488718) 0.98
es/full/minify/libraries/typescript 2907748643 ns/iter (± 13409397) 2967218932 ns/iter (± 14822010) 0.98
es/full/minify/libraries/victory 626459372 ns/iter (± 2154385) 633379234 ns/iter (± 5786548) 0.99
es/full/minify/libraries/vue 135902601 ns/iter (± 334912) 138503967 ns/iter (± 561807) 0.98
es/full/codegen/es3 37305 ns/iter (± 96) 35384 ns/iter (± 116) 1.05
es/full/codegen/es5 37378 ns/iter (± 92) 35466 ns/iter (± 108) 1.05
es/full/codegen/es2015 37348 ns/iter (± 334) 35416 ns/iter (± 159) 1.05
es/full/codegen/es2016 37354 ns/iter (± 28) 35636 ns/iter (± 112) 1.05
es/full/codegen/es2017 37382 ns/iter (± 80) 35570 ns/iter (± 162) 1.05
es/full/codegen/es2018 37305 ns/iter (± 69) 35570 ns/iter (± 167) 1.05
es/full/codegen/es2019 37297 ns/iter (± 100) 35316 ns/iter (± 61) 1.06
es/full/codegen/es2020 37256 ns/iter (± 139) 35322 ns/iter (± 138) 1.05
es/full/all/es3 180003549 ns/iter (± 605776) 184182353 ns/iter (± 361042) 0.98
es/full/all/es5 169325715 ns/iter (± 521171) 172913981 ns/iter (± 1113317) 0.98
es/full/all/es2015 126767932 ns/iter (± 676862) 129648524 ns/iter (± 574745) 0.98
es/full/all/es2016 126053622 ns/iter (± 400146) 128656125 ns/iter (± 808065) 0.98
es/full/all/es2017 124867493 ns/iter (± 515448) 127942158 ns/iter (± 457440) 0.98
es/full/all/es2018 122670143 ns/iter (± 426152) 126314171 ns/iter (± 585944) 0.97
es/full/all/es2019 122883958 ns/iter (± 377299) 125792129 ns/iter (± 366176) 0.98
es/full/all/es2020 117235633 ns/iter (± 458021) 119854420 ns/iter (± 754497) 0.98
es/full/parser 514483 ns/iter (± 4926) 524775 ns/iter (± 7668) 0.98
es/full/base/fixer 18934 ns/iter (± 186) 18203 ns/iter (± 173) 1.04
es/full/base/resolver_and_hygiene 90316 ns/iter (± 149) 93170 ns/iter (± 272) 0.97
serialization of serde 326 ns/iter (± 0) 317 ns/iter (± 0) 1.03
css/minify/libraries/bootstrap 30644147 ns/iter (± 81690) 31425253 ns/iter (± 213532) 0.98
css/visitor/compare/clone 2008798 ns/iter (± 11356) 1905318 ns/iter (± 14057) 1.05
css/visitor/compare/visit_mut_span 2160244 ns/iter (± 27565) 2018039 ns/iter (± 7001) 1.07
css/visitor/compare/visit_mut_span_panic 2288402 ns/iter (± 20108) 2085050 ns/iter (± 7326) 1.10
css/visitor/compare/fold_span 2945349 ns/iter (± 16689) 2781616 ns/iter (± 15143) 1.06
css/visitor/compare/fold_span_panic 3140768 ns/iter (± 14761) 3003702 ns/iter (± 24896) 1.05
css/lexer/bootstrap_5_1_3 4841503 ns/iter (± 2300) 4767618 ns/iter (± 2723) 1.02
css/lexer/foundation_6_7_4 4075117 ns/iter (± 3488) 4018453 ns/iter (± 6942) 1.01
css/lexer/tailwind_3_1_1 763258 ns/iter (± 717) 759223 ns/iter (± 285) 1.01
css/parser/bootstrap_5_1_3 20560586 ns/iter (± 15212) 20424140 ns/iter (± 45834) 1.01
css/parser/foundation_6_7_4 16587880 ns/iter (± 19496) 16429677 ns/iter (± 37180) 1.01
css/parser/tailwind_3_1_1 3211422 ns/iter (± 2290) 3175367 ns/iter (± 4001) 1.01
es/codegen/colors 738470 ns/iter (± 398775) 731851 ns/iter (± 398151) 1.01
es/codegen/large 3146600 ns/iter (± 1654010) 3139884 ns/iter (± 1661270) 1.00
es/codegen/with-parser/colors 49400 ns/iter (± 253) 48224 ns/iter (± 219) 1.02
es/codegen/with-parser/large 512342 ns/iter (± 1121) 510047 ns/iter (± 625) 1.00
es/minify/libraries/antd 1277003618 ns/iter (± 11790084) 1281091118 ns/iter (± 14235964) 1.00
es/minify/libraries/d3 260184253 ns/iter (± 425273) 262491683 ns/iter (± 1083405) 0.99
es/minify/libraries/echarts 1005610218 ns/iter (± 2129521) 1024590712 ns/iter (± 6256375) 0.98
es/minify/libraries/jquery 82603953 ns/iter (± 102364) 82467727 ns/iter (± 211118) 1.00
es/minify/libraries/lodash 97539815 ns/iter (± 258539) 97654679 ns/iter (± 222784) 1.00
es/minify/libraries/moment 48285467 ns/iter (± 54789) 48342948 ns/iter (± 100705) 1.00
es/minify/libraries/react 17796430 ns/iter (± 30861) 17764788 ns/iter (± 43283) 1.00
es/minify/libraries/terser 208930618 ns/iter (± 1435777) 210131855 ns/iter (± 813822) 0.99
es/minify/libraries/three 351434667 ns/iter (± 681865) 353854685 ns/iter (± 2739777) 0.99
es/minify/libraries/typescript 2505026681 ns/iter (± 8880143) 2526922700 ns/iter (± 9465837) 0.99
es/minify/libraries/victory 523403048 ns/iter (± 1912731) 532083478 ns/iter (± 2450025) 0.98
es/minify/libraries/vue 121623778 ns/iter (± 258326) 122644409 ns/iter (± 670338) 0.99
es/visitor/compare/clone 2066220 ns/iter (± 16038) 2062383 ns/iter (± 4757) 1.00
es/visitor/compare/visit_mut_span 2403772 ns/iter (± 2942) 2403596 ns/iter (± 7754) 1.00
es/visitor/compare/visit_mut_span_panic 2441674 ns/iter (± 3008) 2450083 ns/iter (± 9301) 1.00
es/visitor/compare/fold_span 3496728 ns/iter (± 8411) 3486590 ns/iter (± 6194) 1.00
es/visitor/compare/fold_span_panic 3639398 ns/iter (± 5891) 3615621 ns/iter (± 7901) 1.01
es/lexer/colors 12967 ns/iter (± 47) 13108 ns/iter (± 88) 0.99
es/lexer/angular 6177117 ns/iter (± 5563) 6146464 ns/iter (± 6520) 1.00
es/lexer/backbone 802059 ns/iter (± 624) 803176 ns/iter (± 164) 1.00
es/lexer/jquery 4562834 ns/iter (± 2019) 4544887 ns/iter (± 13167) 1.00
es/lexer/jquery mobile 6985425 ns/iter (± 7502) 6985274 ns/iter (± 15466) 1.00
es/lexer/mootools 3583225 ns/iter (± 3759) 3568618 ns/iter (± 1006) 1.00
es/lexer/underscore 667792 ns/iter (± 1426) 673521 ns/iter (± 891) 0.99
es/lexer/three 21222641 ns/iter (± 27624) 21238552 ns/iter (± 52017) 1.00
es/lexer/yui 4053493 ns/iter (± 20613) 4040308 ns/iter (± 5346) 1.00
es/parser/colors 29003 ns/iter (± 156) 29396 ns/iter (± 30) 0.99
es/parser/angular 14249845 ns/iter (± 46234) 14513286 ns/iter (± 64379) 0.98
es/parser/backbone 2115272 ns/iter (± 10900) 2151631 ns/iter (± 11181) 0.98
es/parser/jquery 11527858 ns/iter (± 54491) 11792217 ns/iter (± 75929) 0.98
es/parser/jquery mobile 17621720 ns/iter (± 141117) 17863373 ns/iter (± 75299) 0.99
es/parser/mootools 8851616 ns/iter (± 20244) 8981537 ns/iter (± 20370) 0.99
es/parser/underscore 1836578 ns/iter (± 8919) 1862987 ns/iter (± 9645) 0.99
es/parser/three 49063877 ns/iter (± 185698) 49871070 ns/iter (± 518505) 0.98
es/parser/yui 8868799 ns/iter (± 44434) 9016118 ns/iter (± 35621) 0.98
es/preset-env/usage/builtin_type 147013 ns/iter (± 32833) 146085 ns/iter (± 31832) 1.01
es/preset-env/usage/property 20223 ns/iter (± 44) 20277 ns/iter (± 68) 1.00
es/resolver/typescript 93542740 ns/iter (± 885627) 94445272 ns/iter (± 855319) 0.99
es/fixer/typescript 65291495 ns/iter (± 393628) 67770333 ns/iter (± 586058) 0.96
es/hygiene/typescript 140190615 ns/iter (± 900341) 143843791 ns/iter (± 1150161) 0.97
es/resolver_with_hygiene/typescript 300768000 ns/iter (± 1531493) 305384592 ns/iter (± 1970091) 0.98
es/visitor/base-perf/module_clone 62752 ns/iter (± 233) 63352 ns/iter (± 236) 0.99
es/visitor/base-perf/fold_empty 65348 ns/iter (± 245) 65676 ns/iter (± 345) 1.00
es/visitor/base-perf/fold_noop_impl_all 66183 ns/iter (± 396) 65553 ns/iter (± 287) 1.01
es/visitor/base-perf/fold_noop_impl_vec 66661 ns/iter (± 541) 66433 ns/iter (± 237) 1.00
es/visitor/base-perf/boxing_boxed_clone 58 ns/iter (± 0) 55 ns/iter (± 0) 1.05
es/visitor/base-perf/boxing_unboxed_clone 41 ns/iter (± 0) 40 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_boxed 112 ns/iter (± 0) 112 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed 79 ns/iter (± 0) 80 ns/iter (± 0) 0.99
es/visitor/base-perf/visit_empty 0 ns/iter (± 0) 0 ns/iter (± 0) NaN
es/visitor/base-perf/visit_contains_this 2641 ns/iter (± 13) 2656 ns/iter (± 21) 0.99
es/base/parallel/resolver/typescript 4652285108 ns/iter (± 234676212) 4640960270 ns/iter (± 275637197) 1.00
es/base/parallel/hygiene/typescript 1566994933 ns/iter (± 24759662) 1589343834 ns/iter (± 8326421) 0.99
misc/visitors/time-complexity/time 5 109 ns/iter (± 0) 110 ns/iter (± 2) 0.99
misc/visitors/time-complexity/time 10 295 ns/iter (± 0) 295 ns/iter (± 12) 1
misc/visitors/time-complexity/time 15 668 ns/iter (± 10) 567 ns/iter (± 35) 1.18
misc/visitors/time-complexity/time 20 1241 ns/iter (± 57) 1091 ns/iter (± 0) 1.14
misc/visitors/time-complexity/time 40 4036 ns/iter (± 218) 4013 ns/iter (± 7) 1.01
misc/visitors/time-complexity/time 60 8483 ns/iter (± 22) 8479 ns/iter (± 14) 1.00
es/full-target/es2016 238514 ns/iter (± 1486) 240335 ns/iter (± 708) 0.99
es/full-target/es2017 220217 ns/iter (± 577) 226150 ns/iter (± 768) 0.97
es/full-target/es2018 208929 ns/iter (± 558) 214363 ns/iter (± 3363) 0.97
es2020_nullish_coalescing 71562 ns/iter (± 450) 71756 ns/iter (± 500) 1.00
es2020_optional_chaining 102165 ns/iter (± 307) 100205 ns/iter (± 583) 1.02
es2022_class_properties 120819 ns/iter (± 296) 121208 ns/iter (± 224) 1.00
es2018_object_rest_spread 74983 ns/iter (± 191) 76562 ns/iter (± 243) 0.98
es2019_optional_catch_binding 64840 ns/iter (± 315) 64712 ns/iter (± 160) 1.00
es2017_async_to_generator 65036 ns/iter (± 188) 64268 ns/iter (± 236) 1.01
es2016_exponentiation 69868 ns/iter (± 571) 70514 ns/iter (± 273) 0.99
es2015_arrow 72107 ns/iter (± 250) 73360 ns/iter (± 279) 0.98
es2015_block_scoped_fn 69565 ns/iter (± 152) 70512 ns/iter (± 191) 0.99
es2015_block_scoping 129797 ns/iter (± 508) 135737 ns/iter (± 372) 0.96

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.