Skip to content

Commit

Permalink
feat(css/compat): Add Compiler (#6626)
Browse files Browse the repository at this point in the history
**Description:**

Visitor patterns are inherently slow, so I decided to merge all compatibility passes into a single pass.
  • Loading branch information
kdy1 committed Dec 12, 2022
1 parent f6cd0dc commit b3bbd74
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/swc_css_compat/Cargo.toml
Expand Up @@ -13,6 +13,7 @@ version = "0.16.0"
bench = false

[dependencies]
bitflags = "1.3.2"
once_cell = "1.10.0"
serde = {version = "1.0.118", features = ["derive"]}
serde_json = "1.0.61"
Expand Down
1 change: 1 addition & 0 deletions crates/swc_css_compat/src/compiler/custom_media.rs
@@ -0,0 +1 @@

26 changes: 26 additions & 0 deletions crates/swc_css_compat/src/compiler/mod.rs
@@ -0,0 +1,26 @@
use swc_css_visit::VisitMut;

use crate::feature::Features;

mod custom_media;

/// Compiles a modern CSS file to a CSS file which works with old browsers.
#[derive(Debug)]
pub struct Compiler {
#[allow(unused)]
c: Config,
}

#[derive(Debug)]
pub struct Config {
/// The list of features to **process**.
pub process: Features,
}

impl Compiler {
pub fn new(config: Config) -> Self {
Self { c: config }
}
}

impl VisitMut for Compiler {}
7 changes: 7 additions & 0 deletions crates/swc_css_compat/src/feature.rs
@@ -0,0 +1,7 @@
use bitflags::bitflags;

bitflags! {
pub struct Features: u64 {
const NESTING = 0b00000001;
}
}
2 changes: 2 additions & 0 deletions crates/swc_css_compat/src/lib.rs
@@ -1,4 +1,6 @@
#![feature(box_patterns)]
#![allow(clippy::vec_box)]

pub mod compiler;
pub mod feature;
pub mod nesting;

1 comment on commit b3bbd74

@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: b3bbd74 Previous: bfdafdb Ratio
es/full/bugs-1 299883 ns/iter (± 8573) 296685 ns/iter (± 5865) 1.01
es/full/minify/libraries/antd 1819955102 ns/iter (± 20511009) 1668612733 ns/iter (± 16330412) 1.09
es/full/minify/libraries/d3 358522455 ns/iter (± 5926281) 346073590 ns/iter (± 2829400) 1.04
es/full/minify/libraries/echarts 1515171525 ns/iter (± 8471711) 1432114688 ns/iter (± 9216658) 1.06
es/full/minify/libraries/jquery 93828458 ns/iter (± 1164932) 94020670 ns/iter (± 902366) 1.00
es/full/minify/libraries/lodash 112467306 ns/iter (± 831152) 111407488 ns/iter (± 541717) 1.01
es/full/minify/libraries/moment 54522524 ns/iter (± 413130) 54946161 ns/iter (± 313020) 0.99
es/full/minify/libraries/react 20071931 ns/iter (± 147990) 20023902 ns/iter (± 110720) 1.00
es/full/minify/libraries/terser 271513982 ns/iter (± 5628389) 273702238 ns/iter (± 2027721) 0.99
es/full/minify/libraries/three 504027906 ns/iter (± 9496307) 498033086 ns/iter (± 3558852) 1.01
es/full/minify/libraries/typescript 3425518348 ns/iter (± 26773510) 3195941230 ns/iter (± 19103537) 1.07
es/full/minify/libraries/victory 777161836 ns/iter (± 19087161) 722749412 ns/iter (± 12656051) 1.08
es/full/minify/libraries/vue 138715879 ns/iter (± 1405719) 140260622 ns/iter (± 1263341) 0.99
es/full/codegen/es3 27538 ns/iter (± 51) 27595 ns/iter (± 67) 1.00
es/full/codegen/es5 27551 ns/iter (± 55) 27628 ns/iter (± 85) 1.00
es/full/codegen/es2015 27604 ns/iter (± 47) 27534 ns/iter (± 51) 1.00
es/full/codegen/es2016 27518 ns/iter (± 55) 27552 ns/iter (± 67) 1.00
es/full/codegen/es2017 27686 ns/iter (± 58) 27541 ns/iter (± 21) 1.01
es/full/codegen/es2018 27613 ns/iter (± 45) 27591 ns/iter (± 73) 1.00
es/full/codegen/es2019 27550 ns/iter (± 35) 27576 ns/iter (± 45) 1.00
es/full/codegen/es2020 27548 ns/iter (± 35) 27542 ns/iter (± 78) 1.00
es/full/all/es3 169120801 ns/iter (± 2820302) 168265749 ns/iter (± 2487126) 1.01
es/full/all/es5 160251999 ns/iter (± 3703286) 159587418 ns/iter (± 2393697) 1.00
es/full/all/es2015 122872257 ns/iter (± 1186092) 121125379 ns/iter (± 668699) 1.01
es/full/all/es2016 121206096 ns/iter (± 709671) 120519082 ns/iter (± 1059031) 1.01
es/full/all/es2017 120334712 ns/iter (± 573414) 119585106 ns/iter (± 799626) 1.01
es/full/all/es2018 118458852 ns/iter (± 507707) 118131364 ns/iter (± 968313) 1.00
es/full/all/es2019 117612640 ns/iter (± 539863) 116958316 ns/iter (± 1080592) 1.01
es/full/all/es2020 113265650 ns/iter (± 915352) 112758959 ns/iter (± 784313) 1.00
es/full/parser 522726 ns/iter (± 9362) 523597 ns/iter (± 6128) 1.00
es/full/base/fixer 21779 ns/iter (± 24) 21949 ns/iter (± 28) 0.99
es/full/base/resolver_and_hygiene 77675 ns/iter (± 105) 77767 ns/iter (± 83) 1.00
serialization of ast node 142 ns/iter (± 0) 143 ns/iter (± 0) 0.99
serialization of serde 123 ns/iter (± 0) 124 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 27515984 ns/iter (± 281989) 27385798 ns/iter (± 108932) 1.00
css/visitor/compare/clone 2103529 ns/iter (± 18368) 2118261 ns/iter (± 16029) 0.99
css/visitor/compare/visit_mut_span 2314998 ns/iter (± 9333) 2327866 ns/iter (± 9079) 0.99
css/visitor/compare/visit_mut_span_panic 2326481 ns/iter (± 7365) 2340281 ns/iter (± 5848) 0.99
css/visitor/compare/fold_span 2999354 ns/iter (± 24611) 2991499 ns/iter (± 11225) 1.00
css/visitor/compare/fold_span_panic 3148460 ns/iter (± 18713) 3180056 ns/iter (± 20067) 0.99
css/lexer/bootstrap_5_1_3 5199562 ns/iter (± 6926) 5230952 ns/iter (± 1212) 0.99
css/lexer/foundation_6_7_4 4406060 ns/iter (± 686) 4440891 ns/iter (± 2479) 0.99
css/lexer/tailwind_3_1_1 827197 ns/iter (± 350) 831402 ns/iter (± 324) 0.99
css/parser/bootstrap_5_1_3 20877455 ns/iter (± 163903) 20883898 ns/iter (± 116906) 1.00
css/parser/foundation_6_7_4 16720892 ns/iter (± 73704) 16706908 ns/iter (± 53899) 1.00
css/parser/tailwind_3_1_1 3183096 ns/iter (± 3665) 3177487 ns/iter (± 2541) 1.00
es/codegen/colors 330194 ns/iter (± 185202) 330521 ns/iter (± 184982) 1.00
es/codegen/large 1048641 ns/iter (± 533093) 1201394 ns/iter (± 607547) 0.87
es/codegen/with-parser/colors 46385 ns/iter (± 272) 46263 ns/iter (± 310) 1.00
es/codegen/with-parser/large 508828 ns/iter (± 1205) 510920 ns/iter (± 1306) 1.00
es/minify/libraries/antd 1590813418 ns/iter (± 12502735) 1477701976 ns/iter (± 16192131) 1.08
es/minify/libraries/d3 313412476 ns/iter (± 10983350) 300881794 ns/iter (± 2889391) 1.04
es/minify/libraries/echarts 1335060011 ns/iter (± 6759539) 1258695679 ns/iter (± 9627760) 1.06
es/minify/libraries/jquery 80919581 ns/iter (± 454066) 80224897 ns/iter (± 643864) 1.01
es/minify/libraries/lodash 101002003 ns/iter (± 1566095) 99179216 ns/iter (± 328181) 1.02
es/minify/libraries/moment 47183818 ns/iter (± 680036) 46684449 ns/iter (± 262995) 1.01
es/minify/libraries/react 17556569 ns/iter (± 184943) 17614274 ns/iter (± 67801) 1.00
es/minify/libraries/terser 231477492 ns/iter (± 5730046) 228557681 ns/iter (± 1764152) 1.01
es/minify/libraries/three 429297013 ns/iter (± 7390355) 427375721 ns/iter (± 3477264) 1.00
es/minify/libraries/typescript 2934663205 ns/iter (± 13873585) 2730471583 ns/iter (± 11207767) 1.07
es/minify/libraries/victory 669075496 ns/iter (± 9772485) 634012547 ns/iter (± 7256763) 1.06
es/minify/libraries/vue 123576875 ns/iter (± 1390278) 121879137 ns/iter (± 550210) 1.01
es/visitor/compare/clone 2424954 ns/iter (± 20622) 2443773 ns/iter (± 21202) 0.99
es/visitor/compare/visit_mut_span 2846956 ns/iter (± 11240) 2840846 ns/iter (± 6124) 1.00
es/visitor/compare/visit_mut_span_panic 2886154 ns/iter (± 20333) 2831952 ns/iter (± 5411) 1.02
es/visitor/compare/fold_span 3994841 ns/iter (± 23415) 3915824 ns/iter (± 21586) 1.02
es/visitor/compare/fold_span_panic 4200771 ns/iter (± 21463) 4082152 ns/iter (± 8479) 1.03
es/lexer/colors 17607 ns/iter (± 10) 17531 ns/iter (± 4) 1.00
es/lexer/angular 8266491 ns/iter (± 13550) 8243052 ns/iter (± 3852) 1.00
es/lexer/backbone 1078625 ns/iter (± 757) 1077064 ns/iter (± 690) 1.00
es/lexer/jquery 5993098 ns/iter (± 4013) 5973860 ns/iter (± 3932) 1.00
es/lexer/jquery mobile 9254052 ns/iter (± 3121) 9204201 ns/iter (± 6894) 1.01
es/lexer/mootools 4703193 ns/iter (± 1738) 4689115 ns/iter (± 3717) 1.00
es/lexer/underscore 899909 ns/iter (± 357) 899953 ns/iter (± 854) 1.00
es/lexer/three 28112982 ns/iter (± 18066) 28044651 ns/iter (± 15303) 1.00
es/lexer/yui 5075915 ns/iter (± 2554) 5071463 ns/iter (± 2113) 1.00
es/parser/colors 31432 ns/iter (± 146) 31570 ns/iter (± 157) 1.00
es/parser/angular 16427059 ns/iter (± 276973) 16439983 ns/iter (± 212046) 1.00
es/parser/backbone 2346254 ns/iter (± 15648) 2348859 ns/iter (± 11431) 1.00
es/parser/jquery 12914448 ns/iter (± 239999) 12999317 ns/iter (± 110736) 0.99
es/parser/jquery mobile 20931206 ns/iter (± 364913) 21292711 ns/iter (± 246042) 0.98
es/parser/mootools 9688361 ns/iter (± 30820) 9794680 ns/iter (± 44198) 0.99
es/parser/underscore 1984920 ns/iter (± 10825) 1974540 ns/iter (± 9545) 1.01
es/parser/three 62189386 ns/iter (± 527082) 60295486 ns/iter (± 149941) 1.03
es/parser/yui 9879728 ns/iter (± 90297) 9858804 ns/iter (± 40760) 1.00
es/preset-env/usage/builtin_type 141386 ns/iter (± 31933) 144701 ns/iter (± 33230) 0.98
es/preset-env/usage/property 21169 ns/iter (± 188) 21228 ns/iter (± 62) 1.00
es/resolver/typescript 127347237 ns/iter (± 2699136) 113717294 ns/iter (± 2670410) 1.12
es/fixer/typescript 102846122 ns/iter (± 1132204) 87314430 ns/iter (± 577508) 1.18
es/hygiene/typescript 199723116 ns/iter (± 2494038) 171044100 ns/iter (± 550732) 1.17
es/resolver_with_hygiene/typescript 344835744 ns/iter (± 4137957) 308152869 ns/iter (± 2403761) 1.12
es/visitor/base-perf/module_clone 74975 ns/iter (± 1427) 74258 ns/iter (± 1714) 1.01
es/visitor/base-perf/fold_empty 86709 ns/iter (± 869) 86681 ns/iter (± 1298) 1.00
es/visitor/base-perf/fold_noop_impl_all 86290 ns/iter (± 1540) 86486 ns/iter (± 549) 1.00
es/visitor/base-perf/fold_noop_impl_vec 86903 ns/iter (± 1133) 86695 ns/iter (± 784) 1.00
es/visitor/base-perf/boxing_boxed_clone 54 ns/iter (± 0) 54 ns/iter (± 0) 1
es/visitor/base-perf/boxing_unboxed_clone 58 ns/iter (± 0) 58 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 100 ns/iter (± 0) 105 ns/iter (± 0) 0.95
es/visitor/base-perf/boxing_unboxed 103 ns/iter (± 0) 106 ns/iter (± 0) 0.97
es/visitor/base-perf/visit_contains_this 3373 ns/iter (± 42) 3455 ns/iter (± 70) 0.98
es/base/parallel/resolver/typescript 5815964392 ns/iter (± 309767730) 4854986935 ns/iter (± 140822662) 1.20
es/base/parallel/hygiene/typescript 2276046834 ns/iter (± 27341772) 2015592858 ns/iter (± 39321767) 1.13
misc/visitors/time-complexity/time 5 94 ns/iter (± 0) 94 ns/iter (± 0) 1
misc/visitors/time-complexity/time 10 307 ns/iter (± 0) 307 ns/iter (± 0) 1
misc/visitors/time-complexity/time 15 638 ns/iter (± 1) 663 ns/iter (± 31) 0.96
misc/visitors/time-complexity/time 20 1180 ns/iter (± 8) 1196 ns/iter (± 6) 0.99
misc/visitors/time-complexity/time 40 6230 ns/iter (± 34) 6228 ns/iter (± 34) 1.00
misc/visitors/time-complexity/time 60 15643 ns/iter (± 33) 15524 ns/iter (± 35) 1.01
es/full-target/es2016 186723 ns/iter (± 205) 185980 ns/iter (± 564) 1.00
es/full-target/es2017 180000 ns/iter (± 505) 179137 ns/iter (± 438) 1.00
es/full-target/es2018 169523 ns/iter (± 443) 169039 ns/iter (± 595) 1.00
es2020_nullish_coalescing 65066 ns/iter (± 89) 65388 ns/iter (± 84) 1.00
es2020_optional_chaining 93075 ns/iter (± 3787) 93229 ns/iter (± 321) 1.00
es2022_class_properties 91686 ns/iter (± 138) 91670 ns/iter (± 187) 1.00
es2018_object_rest_spread 69507 ns/iter (± 136) 69381 ns/iter (± 110) 1.00
es2019_optional_catch_binding 59540 ns/iter (± 135) 59256 ns/iter (± 120) 1.00
es2017_async_to_generator 59867 ns/iter (± 86) 59543 ns/iter (± 127) 1.01
es2016_exponentiation 63140 ns/iter (± 72) 63151 ns/iter (± 85) 1.00
es2015_arrow 68516 ns/iter (± 221) 68259 ns/iter (± 238) 1.00
es2015_block_scoped_fn 64037 ns/iter (± 182) 64026 ns/iter (± 90) 1.00
es2015_block_scoping 150120 ns/iter (± 7107) 154314 ns/iter (± 10575) 0.97
es2015_classes 114848 ns/iter (± 527) 114651 ns/iter (± 368) 1.00
es2015_computed_props 59526 ns/iter (± 126) 59263 ns/iter (± 165) 1.00
es2015_destructuring 114687 ns/iter (± 272) 114289 ns/iter (± 127) 1.00
es2015_duplicate_keys 62222 ns/iter (± 144) 62113 ns/iter (± 86) 1.00
es2015_parameters 77673 ns/iter (± 223) 77404 ns/iter (± 149) 1.00
es2015_fn_name 65156 ns/iter (± 532) 65128 ns/iter (± 432) 1.00
es2015_for_of 62630 ns/iter (± 118) 62210 ns/iter (± 120) 1.01
es2015_instanceof 61294 ns/iter (± 197) 61357 ns/iter (± 122) 1.00
es2015_shorthand_property 59301 ns/iter (± 71) 59219 ns/iter (± 118) 1.00
es2015_spread 59257 ns/iter (± 125) 59358 ns/iter (± 83) 1.00
es2015_sticky_regex 60384 ns/iter (± 72) 60376 ns/iter (± 91) 1.00
es2015_typeof_symbol 60825 ns/iter (± 144) 61035 ns/iter (± 133) 1.00
es/transform/baseline/base 50121 ns/iter (± 72) 50144 ns/iter (± 83) 1.00
es/transform/baseline/common_reserved_word 60904 ns/iter (± 169) 60876 ns/iter (± 74) 1.00
es/transform/baseline/common_typescript 167591 ns/iter (± 542) 141966 ns/iter (± 7021) 1.18
es/target/es3 167714 ns/iter (± 482) 170643 ns/iter (± 179) 0.98
es/target/es2015 630616 ns/iter (± 2213) 633789 ns/iter (± 1518) 0.99
es/target/es2016 63210 ns/iter (± 136) 63266 ns/iter (± 78) 1.00
es/target/es2017 60080 ns/iter (± 109) 59784 ns/iter (± 83) 1.00
es/target/es2018 79389 ns/iter (± 132) 79374 ns/iter (± 67) 1.00
es/target/es2020 130401 ns/iter (± 218) 130920 ns/iter (± 230) 1.00
babelify-only 666138 ns/iter (± 2136) 673748 ns/iter (± 802) 0.99
parse_and_babelify_angular 42496546 ns/iter (± 909481) 42365938 ns/iter (± 434713) 1.00
parse_and_babelify_backbone 5500482 ns/iter (± 78176) 5468835 ns/iter (± 40415) 1.01
parse_and_babelify_jquery 34732689 ns/iter (± 378341) 32710161 ns/iter (± 370462) 1.06
parse_and_babelify_jquery_mobile 59693986 ns/iter (± 887186) 55945687 ns/iter (± 672183) 1.07
parse_and_babelify_mootools 35693426 ns/iter (± 566323) 33952802 ns/iter (± 403674) 1.05
parse_and_babelify_underscore 4383648 ns/iter (± 55700) 4378873 ns/iter (± 32337) 1.00
parse_and_babelify_yui 34710944 ns/iter (± 617190) 33091480 ns/iter (± 350873) 1.05
html/minify/document/css_spec 43559150 ns/iter (± 567913) 43934344 ns/iter (± 545825) 0.99
html/minify/document/github 18488188 ns/iter (± 157834) 18538161 ns/iter (± 33313) 1.00
html/minify/document/stackoverflow 16244922 ns/iter (± 110357) 16181366 ns/iter (± 34296) 1.00
html/minify/document_fragment/css_spec 41762497 ns/iter (± 382340) 42169907 ns/iter (± 178668) 0.99
html/minify/document_fragment/github 17659780 ns/iter (± 58943) 17619788 ns/iter (± 26183) 1.00
html/minify/document_fragment/stackoverflow 15836719 ns/iter (± 111582) 15737090 ns/iter (± 25448) 1.01
html/document/visitor/compare/clone 344505 ns/iter (± 1623) 346537 ns/iter (± 1962) 0.99
html/document/visitor/compare/visit_mut_span 366787 ns/iter (± 1594) 376062 ns/iter (± 2875) 0.98
html/document/visitor/compare/visit_mut_span_panic 376688 ns/iter (± 1905) 380634 ns/iter (± 1758) 0.99
html/document/visitor/compare/fold_span 406706 ns/iter (± 1618) 404241 ns/iter (± 1559) 1.01
html/document/visitor/compare/fold_span_panic 462992 ns/iter (± 2064) 464326 ns/iter (± 2795) 1.00
html/document_fragment/visitor/compare/clone 340971 ns/iter (± 2623) 337424 ns/iter (± 2032) 1.01
html/document_fragment/visitor/compare/visit_mut_span 369128 ns/iter (± 2479) 364046 ns/iter (± 1488) 1.01
html/document_fragment/visitor/compare/visit_mut_span_panic 373840 ns/iter (± 1942) 371367 ns/iter (± 1827) 1.01
html/document_fragment/visitor/compare/fold_span 403642 ns/iter (± 1463) 402011 ns/iter (± 2455) 1.00
html/document_fragment/visitor/compare/fold_span_panic 459536 ns/iter (± 899) 457742 ns/iter (± 1779) 1.00
html/lexer/css_2021_spec 15640009 ns/iter (± 27998) 15458132 ns/iter (± 10145) 1.01
html/lexer/github_com_17_05_2022 6088657 ns/iter (± 3706) 5995017 ns/iter (± 3722) 1.02
html/lexer/stackoverflow_com_17_05_2022 5689856 ns/iter (± 1505) 5619216 ns/iter (± 4786) 1.01
html/parser/parser_document/css_2021_spec 26216068 ns/iter (± 287758) 27001928 ns/iter (± 73338) 0.97
html/parser/parser_document/github_com_17_05_2022 8771556 ns/iter (± 5839) 8788646 ns/iter (± 6722) 1.00
html/parser/parser_document/stackoverflow_com_17_05_2022 7708888 ns/iter (± 10431) 7747989 ns/iter (± 6692) 0.99
html/parser/parser_document_fragment/css_2021_spec 26173474 ns/iter (± 307087) 26745028 ns/iter (± 216463) 0.98
html/parser/parser_document_fragment/github_com_17_05_2022 8761744 ns/iter (± 6936) 8789976 ns/iter (± 14095) 1.00
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7739808 ns/iter (± 22718) 7752926 ns/iter (± 16046) 1.00

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

Please sign in to comment.