Skip to content

Commit 560b784

Browse files
Introduce "visitor" feature flag (parcel-bundler#367)
* Introduce "visitor" feature flag This commit adds a "visitor" feature flag to the lightningcss crate. This feature flag controls whether or not the `Visitor` trait gets compiled. The "visitor" flag is disabled by default. Disabling the "visitor" feature disables the `lightningcss-derive` dependency. This commit on its own reduces the lightningcss crate's build time by about 8% (as measured by comparing `cargo build --timings` with and without the "visitor" feature enabled. When combined with some of the other soon to land commits, this commit will make it possible to remove `syn` from the dependency tree when you don't need it, which should lead to substantial compile time savings. Related: parcel-bundler#357 * Specify required features for examples Co-authored-by: Devon Govett <devongovett@gmail.com>
1 parent ca3e406 commit 560b784

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+552
-270
lines changed

Cargo.toml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ cli = ["clap", "serde_json", "browserslist", "jemallocator"]
3434
grid = []
3535
nodejs = ["dep:serde"]
3636
serde = ["dep:serde", "smallvec/serde", "cssparser/serde"]
37+
visitor = ["lightningcss-derive"]
3738

3839
[dependencies]
3940
serde = { version = "1.0.123", features = ["derive"], optional = true }
@@ -53,7 +54,7 @@ browserslist-rs = { version = "0.7.0", optional = true }
5354
rayon = { version = "1.5.1", optional = true }
5455
dashmap = { version = "5.0.0", optional = true }
5556
serde_json = { version = "1.0.78", optional = true }
56-
lightningcss-derive = { version = "1.0.0-alpha.35", path = "./derive" }
57+
lightningcss-derive = { version = "1.0.0-alpha.35", path = "./derive", optional = true }
5758

5859
[target.'cfg(target_os = "macos")'.dependencies]
5960
jemallocator = { version = "0.3.2", features = ["disable_initial_exec_tls"], optional = true }
@@ -70,6 +71,14 @@ name = "cli_integration_tests"
7071
path = "tests/cli_integration_tests.rs"
7172
required-features = ["cli"]
7273

74+
[[example]]
75+
name = "custom_at_rule"
76+
required-features = ["visitor"]
77+
78+
[[example]]
79+
name = "serialize"
80+
required-features = ["serde"]
81+
7382
[profile.release]
7483
lto = true
7584
codegen-units = 1

examples/custom_at_rule.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ impl<'a, 'i> Visitor<'i, AtRule> for ApplyVisitor<'a, 'i> {
254254
}
255255
}
256256

257+
#[cfg(feature = "visitor")]
257258
impl<'i, V: Visitor<'i, AtRule>> Visit<'i, AtRule, V> for AtRule {
258259
const CHILD_TYPES: VisitTypes = VisitTypes::empty();
259260

src/declaration.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ use crate::properties::{Property, PropertyId};
3434
use crate::targets::Browsers;
3535
use crate::traits::{PropertyHandler, ToCss};
3636
use crate::values::string::CowArcStr;
37+
#[cfg(feature = "visitor")]
3738
use crate::visitor::Visit;
3839
use cssparser::*;
3940

@@ -42,7 +43,8 @@ use cssparser::*;
4243
/// Properties are separated into a list of `!important` declararations,
4344
/// and a list of normal declarations. This reduces memory usage compared
4445
/// with storing a boolean along with each property.
45-
#[derive(Debug, PartialEq, Clone, Visit)]
46+
#[derive(Debug, PartialEq, Clone)]
47+
#[cfg_attr(feature = "visitor", derive(Visit))]
4648
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4749
pub struct DeclarationBlock<'i> {
4850
/// A list of `!important` declarations in the block.

src/dependencies.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::printer::PrinterOptions;
1313
use crate::rules::import::ImportRule;
1414
use crate::traits::ToCss;
1515
use crate::values::url::Url;
16+
#[cfg(feature = "visitor")]
1617
use crate::visitor::Visit;
1718
use cssparser::SourceLocation;
1819
#[cfg(any(feature = "serde", feature = "nodejs"))]
@@ -127,7 +128,8 @@ pub struct SourceRange {
127128
}
128129

129130
/// A line and column position within a source file.
130-
#[derive(Debug, Clone, Copy, PartialEq, Visit)]
131+
#[derive(Debug, Clone, Copy, PartialEq)]
132+
#[cfg_attr(feature = "visitor", derive(Visit))]
131133
#[cfg_attr(any(feature = "serde", feature = "nodejs"), derive(serde::Serialize))]
132134
#[cfg_attr(any(feature = "serde"), derive(serde::Deserialize))]
133135
pub struct Location {

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ pub mod targets;
3838
pub mod traits;
3939
pub mod values;
4040
pub mod vendor_prefix;
41+
#[cfg(feature = "visitor")]
4142
pub mod visitor;
4243

4344
#[cfg(test)]

src/macros.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ macro_rules! enum_property {
99
}
1010
) => {
1111
$(#[$outer])*
12-
#[derive(Debug, Clone, Copy, PartialEq, Visit)]
12+
#[derive(Debug, Clone, Copy, PartialEq)]
13+
#[cfg_attr(feature = "visitor", derive(Visit))]
1314
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(rename_all = "lowercase"))]
1415
$vis enum $name {
1516
$(
@@ -66,7 +67,7 @@ macro_rules! enum_property {
6667
}
6768
) => {
6869
$(#[$outer])*
69-
#[derive(Debug, Clone, Copy, PartialEq, Visit)]
70+
#[derive(Debug, Clone, Copy, PartialEq)] #[cfg_attr(feature = "visitor", derive(Visit))]
7071
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7172
$vis enum $name {
7273
$(
@@ -339,7 +340,8 @@ macro_rules! define_shorthand {
339340
}
340341
) => {
341342
$(#[$outer])*
342-
#[derive(Debug, Clone, PartialEq, Visit)]
343+
#[derive(Debug, Clone, PartialEq)]
344+
#[cfg_attr(feature = "visitor", derive(Visit))]
343345
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
344346
pub struct $name$(<$l>)? {
345347
$(
@@ -553,7 +555,8 @@ macro_rules! define_list_shorthand {
553555
}
554556
) => {
555557
$(#[$outer])*
556-
#[derive(Debug, Clone, PartialEq, Visit)]
558+
#[derive(Debug, Clone, PartialEq)]
559+
#[cfg_attr(feature = "visitor", derive(Visit))]
557560
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
558561
pub struct $name$(<$l>)? {
559562
$(

src/media_query.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ use crate::values::ident::Ident;
1212
use crate::values::number::CSSNumber;
1313
use crate::values::string::CowArcStr;
1414
use crate::values::{length::Length, ratio::Ratio, resolution::Resolution};
15+
#[cfg(feature = "visitor")]
1516
use crate::visitor::Visit;
1617
use cssparser::*;
1718
use std::collections::{HashMap, HashSet};
1819

1920
/// A [media query list](https://drafts.csswg.org/mediaqueries/#mq-list).
20-
#[derive(Clone, Debug, PartialEq, Visit)]
21+
#[derive(Clone, Debug, PartialEq)]
22+
#[cfg_attr(feature = "visitor", derive(Visit))]
2123
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2224
pub struct MediaList<'i> {
2325
/// The list of media queries.
@@ -144,7 +146,8 @@ enum_property! {
144146
}
145147

146148
/// A [media type](https://drafts.csswg.org/mediaqueries/#media-types) within a media query.
147-
#[derive(Clone, Debug, PartialEq, Visit)]
149+
#[derive(Clone, Debug, PartialEq)]
150+
#[cfg_attr(feature = "visitor", derive(Visit))]
148151
#[cfg_attr(
149152
feature = "serde",
150153
derive(serde::Serialize, serde::Deserialize),
@@ -176,8 +179,9 @@ impl<'i> Parse<'i> for MediaType<'i> {
176179
}
177180

178181
/// A [media query](https://drafts.csswg.org/mediaqueries/#media).
179-
#[derive(Clone, Debug, PartialEq, Visit)]
180-
#[visit(visit_media_query, MEDIA_QUERIES)]
182+
#[derive(Clone, Debug, PartialEq)]
183+
#[cfg_attr(feature = "visitor", derive(Visit))]
184+
#[cfg_attr(feature = "visitor", visit(visit_media_query, MEDIA_QUERIES))]
181185
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
182186
pub struct MediaQuery<'i> {
183187
/// The qualifier for this query.
@@ -360,7 +364,8 @@ enum_property! {
360364
}
361365

362366
/// Represents a media condition.
363-
#[derive(Clone, Debug, PartialEq, Visit)]
367+
#[derive(Clone, Debug, PartialEq)]
368+
#[cfg_attr(feature = "visitor", derive(Visit))]
364369
#[cfg_attr(
365370
feature = "serde",
366371
derive(serde::Serialize, serde::Deserialize),
@@ -371,10 +376,10 @@ pub enum MediaCondition<'i> {
371376
#[cfg_attr(feature = "serde", serde(borrow))]
372377
Feature(MediaFeature<'i>),
373378
/// A negation of a condition.
374-
#[skip_type]
379+
#[cfg_attr(feature = "visitor", skip_type)]
375380
Not(Box<MediaCondition<'i>>),
376381
/// A set of joint operations.
377-
#[skip_type]
382+
#[cfg_attr(feature = "visitor", skip_type)]
378383
Operation(Vec<MediaCondition<'i>>, Operator),
379384
}
380385

@@ -495,7 +500,8 @@ impl<'i> ToCss for MediaCondition<'i> {
495500
}
496501

497502
/// A [comparator](https://drafts.csswg.org/mediaqueries/#typedef-mf-comparison) within a media query.
498-
#[derive(Clone, Copy, Debug, Eq, PartialEq, Visit)]
503+
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
504+
#[cfg_attr(feature = "visitor", derive(Visit))]
499505
#[cfg_attr(
500506
feature = "serde",
501507
derive(serde::Serialize, serde::Deserialize),
@@ -551,7 +557,8 @@ impl MediaFeatureComparison {
551557
}
552558

553559
/// A [media feature](https://drafts.csswg.org/mediaqueries/#typedef-media-feature)
554-
#[derive(Clone, Debug, PartialEq, Visit)]
560+
#[derive(Clone, Debug, PartialEq)]
561+
#[cfg_attr(feature = "visitor", derive(Visit))]
555562
#[cfg_attr(
556563
feature = "serde",
557564
derive(serde::Serialize, serde::Deserialize),
@@ -753,7 +760,8 @@ where
753760
/// [media feature value](https://drafts.csswg.org/mediaqueries/#typedef-mf-value) within a media query.
754761
///
755762
/// See [MediaFeature](MediaFeature).
756-
#[derive(Clone, Debug, PartialEq, Visit)]
763+
#[derive(Clone, Debug, PartialEq)]
764+
#[cfg_attr(feature = "visitor", derive(Visit))]
757765
#[cfg_attr(
758766
feature = "serde",
759767
derive(serde::Serialize, serde::Deserialize),

src/parser.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use crate::traits::Parse;
3030
use crate::values::ident::{CustomIdent, DashedIdent};
3131
use crate::values::string::CowArcStr;
3232
use crate::vendor_prefix::VendorPrefix;
33+
#[cfg(feature = "visitor")]
3334
use crate::visitor::{Visit, VisitTypes, Visitor};
3435
use cssparser::*;
3536
use parcel_selectors::parser::NestingRequirement;
@@ -110,6 +111,7 @@ impl crate::traits::ToCss for DefaultAtRule {
110111
}
111112
}
112113

114+
#[cfg(feature = "visitor")]
113115
impl<'i, V: Visitor<'i, DefaultAtRule>> Visit<'i, DefaultAtRule, V> for DefaultAtRule {
114116
const CHILD_TYPES: VisitTypes = VisitTypes::empty();
115117
fn visit_children(&mut self, _: &mut V) {}

src/properties/align.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ use crate::targets::Browsers;
1313
use crate::traits::{FromStandard, Parse, PropertyHandler, Shorthand, ToCss};
1414
use crate::values::length::LengthPercentage;
1515
use crate::vendor_prefix::VendorPrefix;
16+
#[cfg(feature = "visitor")]
1617
use crate::visitor::Visit;
1718
use cssparser::*;
1819

1920
/// A [`<baseline-position>`](https://www.w3.org/TR/css-align-3/#typedef-baseline-position) value,
2021
/// as used in the alignment properties.
21-
#[derive(Debug, Clone, PartialEq, Visit)]
22+
#[derive(Debug, Clone, PartialEq)]
23+
#[cfg_attr(feature = "visitor", derive(Visit))]
2224
#[cfg_attr(
2325
feature = "serde",
2426
derive(serde::Serialize, serde::Deserialize),
@@ -107,7 +109,8 @@ enum_property! {
107109
}
108110

109111
/// A value for the [align-content](https://www.w3.org/TR/css-align-3/#propdef-align-content) property.
110-
#[derive(Debug, Clone, PartialEq, Visit)]
112+
#[derive(Debug, Clone, PartialEq)]
113+
#[cfg_attr(feature = "visitor", derive(Visit))]
111114
#[cfg_attr(
112115
feature = "serde",
113116
derive(serde::Serialize, serde::Deserialize),
@@ -166,7 +169,8 @@ impl ToCss for AlignContent {
166169
}
167170

168171
/// A value for the [justify-content](https://www.w3.org/TR/css-align-3/#propdef-justify-content) property.
169-
#[derive(Debug, Clone, PartialEq, Visit)]
172+
#[derive(Debug, Clone, PartialEq)]
173+
#[cfg_attr(feature = "visitor", derive(Visit))]
170174
#[cfg_attr(
171175
feature = "serde",
172176
derive(serde::Serialize, serde::Deserialize),
@@ -327,7 +331,8 @@ enum_property! {
327331
}
328332

329333
/// A value for the [align-self](https://www.w3.org/TR/css-align-3/#align-self-property) property.
330-
#[derive(Debug, Clone, PartialEq, Visit)]
334+
#[derive(Debug, Clone, PartialEq)]
335+
#[cfg_attr(feature = "visitor", derive(Visit))]
331336
#[cfg_attr(
332337
feature = "serde",
333338
derive(serde::Serialize, serde::Deserialize),
@@ -393,7 +398,8 @@ impl ToCss for AlignSelf {
393398
}
394399

395400
/// A value for the [justify-self](https://www.w3.org/TR/css-align-3/#justify-self-property) property.
396-
#[derive(Debug, Clone, PartialEq, Visit)]
401+
#[derive(Debug, Clone, PartialEq)]
402+
#[cfg_attr(feature = "visitor", derive(Visit))]
397403
#[cfg_attr(
398404
feature = "serde",
399405
derive(serde::Serialize, serde::Deserialize),
@@ -549,7 +555,8 @@ impl ToCss for PlaceSelf {
549555
}
550556

551557
/// A value for the [align-items](https://www.w3.org/TR/css-align-3/#align-items-property) property.
552-
#[derive(Debug, Clone, PartialEq, Visit)]
558+
#[derive(Debug, Clone, PartialEq)]
559+
#[cfg_attr(feature = "visitor", derive(Visit))]
553560
#[cfg_attr(
554561
feature = "serde",
555562
derive(serde::Serialize, serde::Deserialize),
@@ -608,7 +615,8 @@ impl ToCss for AlignItems {
608615
}
609616

610617
/// A legacy justification keyword, as used in the `justify-items` property.
611-
#[derive(Debug, Clone, PartialEq, Visit)]
618+
#[derive(Debug, Clone, PartialEq)]
619+
#[cfg_attr(feature = "visitor", derive(Visit))]
612620
#[cfg_attr(
613621
feature = "serde",
614622
derive(serde::Serialize, serde::Deserialize),
@@ -674,7 +682,8 @@ impl ToCss for LegacyJustify {
674682
}
675683

676684
/// A value for the [justify-items](https://www.w3.org/TR/css-align-3/#justify-items-property) property.
677-
#[derive(Debug, Clone, PartialEq, Visit)]
685+
#[derive(Debug, Clone, PartialEq)]
686+
#[cfg_attr(feature = "visitor", derive(Visit))]
678687
#[cfg_attr(
679688
feature = "serde",
680689
derive(serde::Serialize, serde::Deserialize),
@@ -829,7 +838,8 @@ impl ToCss for PlaceItems {
829838

830839
/// A [gap](https://www.w3.org/TR/css-align-3/#column-row-gap) value, as used in the
831840
/// `column-gap` and `row-gap` properties.
832-
#[derive(Debug, Clone, PartialEq, Visit)]
841+
#[derive(Debug, Clone, PartialEq)]
842+
#[cfg_attr(feature = "visitor", derive(Visit))]
833843
#[cfg_attr(
834844
feature = "serde",
835845
derive(serde::Serialize, serde::Deserialize),

src/properties/animation.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ use crate::traits::{Parse, PropertyHandler, Shorthand, ToCss, Zero};
1212
use crate::values::number::CSSNumber;
1313
use crate::values::string::CowArcStr;
1414
use crate::values::{easing::EasingFunction, ident::CustomIdent, time::Time};
15+
#[cfg(feature = "visitor")]
1516
use crate::visitor::Visit;
1617
use cssparser::*;
1718
use itertools::izip;
1819
use smallvec::SmallVec;
1920

2021
/// A value for the [animation-name](https://drafts.csswg.org/css-animations/#animation-name) property.
21-
#[derive(Debug, Clone, PartialEq, Visit)]
22+
#[derive(Debug, Clone, PartialEq)]
23+
#[cfg_attr(feature = "visitor", derive(Visit))]
2224
#[cfg_attr(
2325
feature = "serde",
2426
derive(serde::Serialize, serde::Deserialize),
@@ -87,7 +89,8 @@ impl<'i> ToCss for AnimationName<'i> {
8789
pub type AnimationNameList<'i> = SmallVec<[AnimationName<'i>; 1]>;
8890

8991
/// A value for the [animation-iteration-count](https://drafts.csswg.org/css-animations/#animation-iteration-count) property.
90-
#[derive(Debug, Clone, PartialEq, Visit)]
92+
#[derive(Debug, Clone, PartialEq)]
93+
#[cfg_attr(feature = "visitor", derive(Visit))]
9194
#[cfg_attr(
9295
feature = "serde",
9396
derive(serde::Serialize, serde::Deserialize),

0 commit comments

Comments
 (0)